همزمان با گسترش روزافزون صنعت بازي و گرايش بيشتر افراد در سنين و گروههاي مختلف به استفاده از اين محصولات ديجيتالي، در كامپيوترها و کنسولها، بازيها نيز از نظر کمي و کيفي رشد قابل توجهي يافتهاند، به گونهاي که در حال حاضر شباهت صحنههاي برخي بازيها به واقعيت بسيار بالا بوده و از اين نظر نميتوان مجموعه بازيهاي ساخته شده در چند سال اخير را با محصولات توليدي يک دهه قبل مقايسه کرد. اگر چه در اين ميان شايد نتوان رابطه مشخص و منطقي بين ميزان واقعگرايي و زيبايي و جذابيت صحنهها، تصاوير، مدلها و جلوههاي بازيها، با حجم محتواي آنها يافت، ولي در هر صورت ميتوان چنين گفت که براي داشتن بازيهاي زيباتر، بايد از دادههاي بيشتري هم بهره برد كه به همين ميزان بر حجم بازي ميافزايند.
اين بهرهگيري از دادههاي بيشتر، در اغلب اوقات خود را به صورت افزايش حجم بازي و بعضاً عرضه آن بر روي DVD نمايان ميكند، چيزي که اين روزها بسيار مرسوم شده و در حال تبديل شدن به يک عادت ميباشد، به اين معني که عموم کاربران بازيها نيز تصور ميکنند با افزايش حجم بازي (تعداد CDهاي بيشتر و يا عرضه بازي روي DVD)، قطعاً کيفيت بازي نيز افزايش خواهد يافت (اگرچه اين مسئله در حالت کلي به هيچ وجه صحت ندارد).
با ذكر اين مقدمه، در اين نوشتار قصد داريم يکي از جنبههاي تقريباً پنهان روند توسعه بازي، يعني فعاليتهاي فايلي (بازيابي و حتي ذخيره فايلها) را بررسي کنيم. بخاطر داشته باشيد که ما قرار نيست دستورات برنامه نويسي يا الگوريتمهاي ويژهاي را معرفي کنيم، بلکه بيشتر قصد داريم با فرآيند کلي بازيابي و ذخيره فايلها در بازيها (بعنوان نرمافزارهايي بسيار بزرگ و پرحجم) آشنا شويم.
البته در مرحله اول بهتر است راههاي گوناگون بکار رفته در روند بازيابي محتواي بازيها را بررسي کنيم. اين محتوا که بصورت فايلهاي برنامه ظاهر ميشود، ميتواند در برگيرنده مدلها، تصاوير، منوها، بافتها، انيميشنها، صداها و يا موسيقيها باشد.
فيلمهاي بازي هم که اين روزها بخش بزرگي از اين محتوا را تشکيل ميدهند. ضمن اينكه شايد در وهله اول، سادهترين راهي که براي بارگذاري اين فايلها به نظر ميرسد، خواندن يکباره تمامي آنها در زمان شروع بازي باشد. اما بايد تاكيد نمود كه اين روند کمکم در حال منسوخ شدن است، زيرا باعث کند شدن شروع بازي و افزايش زمان انتظار براي بازيکن ميشود، و گاهي نيز ميتواند با اشغال کردن تمامي فضاي حافظه، موجب بروز خطاهاي حافظهاي شود.
البته يک برنامه نويس، روش خود را با توجه به نوع و سبک بازي، توانايي خود و ساير ملاحظات فني و غيرفني انتخاب ميکند و در صورت مناسب بودن حجم محتواي فايلهاي بازي، اين روش هنوز هم ميتواند کارايي خوبي داشته باشد.
|
نگاهي به تکنيکهاي ذخيره و بازيابي فايلها در بازيهاي كامپيوتري
|
گرچه استفاده از رويکرد جرياني (يعني خواندن بخشي از فايل و نمايش بخشي ديگر در همان زمان) براي ساير انواع فايلهاي بازي (همچون مدلها و تصاوير)، کاربرد ندارد، ولي برخي APIها همچون DirectMusic امکان بهرهگيري از اين تکنيک را جهت تسريع عمليات بارگذاري موسيقي دارند. API قدرتمند DirectShow (که البته در DirectX 10 مجدداً از API جدا شده است) نيز امکان بهرهگيري از اين تکنيک را ارائه ميکند و به همين جهت مورد استفاده بسياري از بازيها، براي پخش قطعات کليپ و فيلم قرار ميگيرد.
· اما انتقال کليه محتويات فايلهاي بازي در زمان شروع، به درون حافظه (حافظه اصلي، حافظه سريع و محدود کارت گرافيکي، حافظه محلي، و يا حافظه AGP)، با توجه به رشد سريع حجم فايلها، امروزه در بسياري از موارد، عملي و منطقي نميباشد. اگرچه سبک بازي و همچنين سيستمهاي نهايي مورد نظر براي اجراي بازي، نقش مهمي در تعيين تکنيک بکار رفته دارند، ولي رويکردي که در حال حاضر بسيار رواج يافته است، بارگذاري غيرپيوسته محتويات فايلهاي بازي ميباشد، به گونهاي که در هر زمان صرفاً محتواي لازم براي نمايش هر صحنه بارگذاري شده و پس از اتمام هر صحنه، بيشتر اين فايلها از حافظه خارج ميشوند تا امکان بارگذاري فايلهاي جديد براي ساير صحنهها فراهم شود.
اين رويکرد ميتواند تضمين کننده افزايش سرعت بارگذاري و حتي اجرا باشد، زيرا در صورت مديريت صحيح حافظه، در هر لحظه کمترين ميزان ضروري از حافظه اشغال بوده و امکان تغيير مکان سريع محتواي هنري (بعنوان مثال، انتقال بافتهاي لازم براي رندر صحنهها از RAM به حافظه قابل دسترسي پردازنده گرافيکي)، وجود خواهد داشت. در عين حال پياده سازي اين روش دشوار بوده و احتياج به درک بالايي از ساختار حافظه، آشنايي با تکنيکهاي نوين مديريت حافظه و بهرهگيري از منابع مديريت شده (Managed Resource) دارد. منابع مديريت شده، گونه نسبتاً جديدي از منابع ميباشند که Direct3D نيز بخوبي از آنها پشتيباني ميکند. اين منابع که ميتوانند شامل بافتها، مدلها و تصاوير مختلف باشند، قابليت انتقال بين بخشهاي مختلف حافظه را دارا بوده و کاربرد مناسبي از نظر بازيابي دارند. البته استفاده از اين رويکرد بازيابي فايلها در کليه انواع بازيها، قابل استفاده نميباشد.
بعنوان مثال، در يک بازي ورزشي مانند فوتبال که تقريباً تمامي مدلها، تصاوير و انيميشنها در يک صحنه واحد (زمين بازي) به طور همزمان به نمايش در ميآيند، نميتوان اين روش را با کارايي بالايي بکار برد. در عوض در بازيهاي ماجرايي و يا مرحلهاي، استفاده از اين روش آسانتر بوده و موجب بهبود عملکرد اجرايي برنامه خواهد شد. همچنين همواره بخاطر داشته باشيد که عملياتهاي فايلي (يعني خواندن و نوشتن)، بصورت بالقوه کند هستند، زيرا فعاليت ديسک سخت (که عمدتاً بصورت مکانيکي ميباشد)، عليرغم تمامي پيشرفتهاي صورت گرفته، هنوز نسبت به فعاليتهاي انجام گرفته در حوزه حافظه RAM ، بسيار کند محسوب ميشود، در نتيجه برنامه نويسان سعي ميکنند تا حد امکان از بارگذاري فايلها در حين نمايش صحنهها، اجتناب کنند. البته در برخي موارد، به ناچار بارگذاري تصاوير بافتي در زمان نمايش صحنهها، ضرورت مييابد (مثلاً خواندن بافتهاي کوچکتر و يا بزرگتر براي استفاده در تکنيک Mipmap) که اين مسئله ميتواند موجب کاهش سرعت اجراي برنامه و حتي در مواردي توقف چند لحظهاي اجرا شود.
بايد توجه داشته باشيد که حجم فايلهاي موجود بر روي ديسک، ممکن است در حافظه اجرايي برنامه به چندين برابر برسد، و اين مسئلهاي است که ميتواند باعث کاهش سرعت اجرايي و همچنين افزايش احتمال بروز خطا در روند اجراي صحيح برنامه شود. همچنين هنوز هم بهتر است براي تست روند خواندن فايلها در بازي خود، از سيستمهاي نسبتاً قديميتر بهره ببريد، زيرا اختلاف زمان بارگذاري فايلها در ديسکهاي سخت جديد و قديم (که فنآوريهايي مانند SATA را ندارند)، ممکن است بسيار قابل توجه باشد، در اين صورت احتمالاً بايد روند بارگذاري را به شکل هوشمندانهاي در سيستمهاي مختلف مديريت کنيد تا کاربران برنامه شما بتوانند با خيال راحت برنامه را در طيف وسيعي از سيستمها اجرا کنند.
· اما فعاليتهاي فايلي يک بازي، تنها به عمليات خواندن فايلها محدود نميشود، و تقريباً تمامي انواع بازيها احتياج دارند دادههاي خاصي را جهت ذخيره (و بازيابي بعدي) بر روي فايلها بنويسند. اين فرآيند نوشتن، ميتواند به سادگي نوشتن امتيازات بازيکنان، گزينههاي مختلف بازي و يا به پيچيدگي نوشتن مراحل طي شده يک بازيکن و يا ثبت صحنههاي پخش شده در يک بازي ورزشي باشد. البته نکته مهم در هر صورت بدست آوردن ساختار مناسب براي ذخيره دادهها ميباشد، زيرا در اين صورت شما ميتوانيد صرفاً با پر کردن چند ساختار، دادههاي مورد نظر خود را در فايلها بنويسيد.
در هر حال يادتان باشد که تا حد امکان از انجام فعاليتهاي ديسکي (بخصوص نوشتن) در حين رندر صحنهها خودداري کنيد. در واقع اگر ميخواهيد مراحل طي شده و داراييهاي بازيکن (تعداد جانها «تعداد زندگيهايي كه ميتواند داشته باشد»، تعداد اشياء گرانقيمت جمعآوري شده، امتيازات و...) را در طول يک بازي ماجرايي ثبت کنيد، بهتر است آنها را همچون بسياري از بازيهاي معروف اين کار، در نقاط خاصي که اصطلاحاً Check Point ناميده ميشوند، انجام دهيد تا بتوانيد با نمايش يک تصوير کوچک و توقف چند لحظهاي بازي، کاربر را از توجه به فعاليت ديسک بازداريد.
بخاطر داشته باشيد که پس از اتمام کارتان با يک فايل، حتماً آن را ببنديد تا از اتلاف حافظه و فعاليت اضافه ديسک سخت، جلوگيري شود.
ناگفته نماند، برخي از بازيها نيز امکان ثبت تعداد نامحدودي فايلهاي ذخيره (Save) را به بازيکن ميدهند. براي مديريت بهتر فايلهاي ذخيره و سهولت در روند بازيابي (Load) آنها، ميتوانيد از يک فايل کوچک براي ثبت کليه فايلهاي ذخيره و دادههاي مربوط به آنها (بعنوان مثال، زمان و تاريخ ذخيره و يا اطلاعاتي در رابطه با موقعيت بازيکن در هنگام ذخيره بازي)، استفاده کنيد. حتي ميتوانيد امکان نامگذاري فايل ذخيره را نيز به بازيکن بدهيد. به اين ترتيب بايد فايلهاي ذخيره را در پوشهاي جداگانه نگهداري کنيد و ضمن رعايت مسائل امنيتي، در هنگام بارگذاري فايلها نيز نام آنها را با نام ثبت شده در فايل راهنماي ذخيره، تطبيق دهيد.
· در انتها بد نيست چند نکته اساسي و مهم در کار با فايلها را مرور کنيم. تقريباً در هر حالتي، کار با فايلهاي باينري، بهتر از کار با فايلهاي متني ميباشد. زيرا علاوه بر عدم امکان مشاهده و تغيير آنها توسط کاربران عادي، خواندن و همچنين نوشتن آنها نيز به مراتب سريعتر است (مثلاً يک عدد اعشاري در حالت متني ميتواند به حدود 10 تا 14 بايت فضا احتياج داشته باشد، در حاليکه همين عدد در حالت باينري، تنها در 4 بايت قابل ذخيره است).
در واقع هر چه تعداد عملياتهاي فايلي کمتر باشد، سرعت برنامه بيشتر خواهد بود، در نتيجه تا حد امکان دستورات خواندن و نوشتن فايل را کاهش دهيد (مثلاً بهتر است بجاي ده بار نوشتن مجموعه اعداد اعشاري، آنها را در يک ساختار ذخيره کرده و ساختار مورد نظر را با يک دستور بنويسيد. به اين ترتيب خواندن فايل نيز با استفاده از همين ساختار، به مراتب سريعتر انجام خواهد شد).
همچنين سعي کنيد از نامگذاري فايلها، با اسامي خيلي طولاني پرهيز کنيد، زيرا اين کار ميتواند موجب بروز خطا در فرآيند بارگذاري و نوشتن فايلها شود.
ضمنا اگر از فايلهاي باينري استفاده ميکنيد، ميتوانيد از يک عبارت رمزي کوچک در ابتداي فايل خود استفاده کنيد. اين عبارت که ميتواند به عنوان معرفه فرمت فايل شما باشد، ميتواند تا حدودي امنيت فايلها را نيز تضمين کند. علاوه بر اين ميتوانيد براي اطمينان از صحت فايلهاي خود (عدم دستکاري توسط ديگران)، برخي مشخصههاي مهم آنها، همچون اندازه و يا ساختار دادهها را بررسي کنيد. اگرچه تقريباً هيچگاه نميتوان از دستکاري فايلهاي هنري (تصاوير، مدلها، صداها و...) توسط افراد کنجکاو و باهوش جلوگيري کرد، ولي بهتر است با اعمال برخي تکنيکهاي ساده، ضريب امنيتي فايلهاي خود را افزايش دهيد.
البته بسته به زباني که براي توسعه بازي بکار ميبريد، ميتوانيد از روشهاي مختلفي براي کار با فايلها استفاده کنيد. کارايي اين روشها در مورد فايلهاي کوچک، تفاوت چنداني ندارد. پس بهتر است روشي را برگزينيد که ضمن سادگي، بيشترين قابليت را در اختيار شما قرار دهد. در عين حال براي اينکه از سردرگمي در هنگام ذخيره و بازيابي فايلها در امان باشيد، بهتر است توابع جداگانهاي براي کار با فايلها (خواندن و نوشتن و تحليل و يا رمزگذاري دادهها) داشته باشيد. به اين ترتيب ورودي توابع شما ميتواند نام فايل مورد نظر و دادههاي مورد نظر ذخيره باشد.
در مورد مسير فايلها نيز بهتر است در هنگام برنامهنويسي، از مسيرهاي نسبي استفاده کنيد. يعني تا حد امکان از آوردن نام يک درايو خاص و يا پوشههاي متعدد اجتناب کنيد. به اين ترتيب برنامه نهايي شما، بر روي هر سيستمي قابل اجرا خواهد بود و مشکلي از نظر يافتن فايلها وجود نخواهد داشت.
مهندس سيد علي الحسيني