رفتن به مطلب

هنگام بازی اطلاعات چگونه از هارد خوانده میشوند؟


Javadmpower
 اشتراک گذاری

Recommended Posts

دو نوع اطلاعات از لحاظ استفاده در بازیها داریم (هرچند که تعداد انواع این اطلاعات بسیار بیشتر از دو نوع هستش ولی در اینجا اشاره به دو نوعش کافی هستش) : 

یک سری از اطلاعات باید در زمان لود شدن مراحل و قرار گرفتن بازیباز در مرحله لود بشن...این اطلاعات مواردی مثل بافت اسلحه ها , بافت زمین و محیط اطراف , فایلهای موسیقی و صوتی بازی و غیره هستن که قبل از اینکه بر روی RAM قرار بگیرن باید از روی Hard Drive و یا از روی Optical Disk خونده بشن...



نوع دوم اطلاعاتی هستن که به اصطلاح بصورت Real-Time در حال اجرا شدن هستن (و شامل اطلاعات نوع اول هم هستن)...این اطلاعات مواردی مثل مختصات قرار گیری بازیباز , میزان جان باقیمانده ی وی , تعداد مهمات , مختصات نورپردازی بازی , محاسبات مربوط به Shader های بازی و غیره هستن که از روی Hard Disk و یا Optical Disk خونده نمیشن...این اطلاعات در طول اجرا شدن بازی توسط موتور بازی در داخل RAM قرار میگیرن و هی بر روی اونها محاسبات مختلف انجام میگیره...


در متن قبل من به مهمترین تفاوت بین وجود و عدم وجود هارد درایو اشاره کردم ولی فرصت نکردم که به RAM بپردازم...در واقع هدف اصلی متن قبلی نشون دادن تفاوت سرعتهای لودینگ بازیها در سیستمهای دارا و فاقد رم بودش...

بیاین فرض کنیم که انتقال داده رو در کنسول و PC به دو قسمت زیر تقسیم کردیم :


انتقال داده ها از Hard Drive به سیستم

انتقال داده ها بین RAM و CPU


در کنسولها و سیستمهای نسل حاضر دومین مقوله دارای برتری خاصی نیستش...به این معنی که سرعت انتقال داده ها بین RAM و CPU اونقدر بین PC و کنسول فرقی نداره که بخواد تاثیر زیاد در زمانهای لودینگ داشته باشه (مثلا لودینگ رو از 20 ثانیه به 3 ثانیه کاهش بده) و علتش هم اینه که هم کنسولها و هم PC ها فعلا از آرکیتکچرها تقریبا متشابهی برای RAM هاشون استفاده میکنن و هر دوی این سیستمها هم دارای RAM هستن...

PS3 دارای رم XDR شرکت Rambus هستش که کمتر توی PC ها دیده شده ولی باعث نمیشه که تقاوت اساسی داشته باشن...360 از آرکیتکچر متشابه رمهای DDR 2 برای RAM ش استفاده کرده و رمهای امروزی PC ها هم از DDR 1 گرفته تا GDDR 4 ساختمانهای خیلی متفاوتی با هم ندارن...
از طرفی PC های امروزی ما دیگه بیشتر با رمهای DDR 2 کار میکنن که خیلی متشابه همون رمهای کنسولها هستش و برتری خاصی رو به اونها نمیده...

رمهای GDDR 3 و GDDR 4 برای کارتهای گرافیکی استفاده میشن و دارای سرعتهای بالاتری از DDR 1 و DDR 2 ها هستن...


همین باعث شد که من توی موضوع قبلی اشاره ی خاصی به RAM نکنم : برای اینکه اگر به اندازه ی کافی هم در PC و هم در کنسول باشه , تفاوت زمان لودینگهای این دو سیستم تقریبا کمرنگ میشه...

ولی عدم وجود هارد درایو مشکلی بود که باعث تفاوت عظیم سرعت بین کنسولها و PC ها شده بود و برای همین در متن بالا بهش اشاره کردم...

بزرگترین نقش رو در اجرای بازی همون RAM ایفا میکنه...Counter Strike رو در نظر میگیریم :

بازی شروع میشه و یک منو برای خرید نمایش داده میشه...در کنار هر اسلحه یک سری مشخصات نوشته شده...موتور بازی میره و اطلاعات بازی رو از داخل هارد دیسک بیرون میکشه و درون RAM میریزه...CPU این اطلاعات رو میخونه و طبق دستوری که موتور بازی بهش میده اونها رو نمایش میده...توی زبانهای برنامه نویسی تا وقتی که فایل رو نبندی اطلاعات درونش Save نمیشه (fClose) و در یک بازی بستن فایل به معنی خارج شدن از بازی بطور درست هستش...پس در بین بازی این اطلاعات در هارد نوشته نمیشن...پس کجا هستن ؟!

این اطلاعات درون RAM سیستم قرار میگیرن و بصورت دینامیک تغیر میکنن و در انتها به هنگام Save کردن بازی , موتور بازی نگاهی به نتایج نهایی این اطلاعات در RAM میندازه (که روشون تا به این لحظه تغییرات صورت گرفته ولی ثبت نشدن) و سپس این اطلاعات نهایی رو در یک فایل باینری ذخیره میکنه...

مثلا در بازی به یک دیوار نگاه میکنین...این دیوار روش یک بافت کشیده شده...موتور بازی وقتی که به سمت دیوار نگاه میکنین میفهمه که باید بافت این دیوار رو سریع لود کنه...پس میره و از توی هارد درایو اطلاعات این بافت رو که یک عکس هستش پیدا میکنه ولی سعی نمیکنه که این اطلاعات رو از روی همون هارد بخونه...بلکه اطلاعات این عکس رو درون RAM میریزه و به کمک کلاسهایی که برای موتور تعریف شده , اونرو درون RAM کارت گرافیک به Texture های مختلفی تبدیل میکنه که بصورت دینامیک بوجود اومدن (یعنی یک Pointer هستن که Dynamic Allication دارن)...این یکی دیگه از کارهای RAM کارت گرافیک بودش...

در اینجا خوب میبینم که به موضوعی اشاره کنم...به هر کی میگی که کارت گرافیکت چیه سریع میگه "فلان تا RAM داره !" و مشکل اینجاست که اغلب ماها قدرت کارت گرافیک رو در RAM ش میبینم و نه GPU ش...در حالیکه همونطور که اشاره کردم قسمت اصلی کار یک RAM برای کارت گرافیک همون نگهداری بافتهای یک مرحله هستش (البته کارهای شاخ دیگه ایی رو هم مثل نگهداری اطلاعات Shading ها و Shader ها انجام میده که بهش اشاره ایی نمیکنم)...

بافتهای بازی ایی مثل Counter Strike حجمشون فراتر از چند مگابایت هم نیستش و همین باعث میشه که مثلا با یک کارت گرافیک 64 مگابایتی بتونی بازی رو اجرا کنی (البته نه بهینه) ولی در موتوری مثل Unreal و یا حتی id Tech 4 (که باهاش بازی Doom 3 رو ساختن) کیفیت بافتها به چند ده مگابایت میرسه که اگه بخوای در یک صحنه از 10 تاشون استفاده کنی یه دفعه میبینی که نیم گیگابایت از فضای RAM پر شدش و برای همین وجود RAM بیشتر برای کارت گرافیک در چنین مواقعی یک نعمت میشه...


هر چند که یک سری الگوریتم خاص برای Mapping های بافتها هستن که حجمشون رو بدون از بین بردن کیفیت بالاشون کاهش میدن...خود استاد جان کارمک با ارائه ی جدیدترین موتورش (id Tech 5) تونسته در یک مرحله ی کوچولو بیش از 18 گیگابایت بافت رو در موتورش استفاده کنه و جالبه که این موتور رو طوری نوشته که با یه کارت گرافیک 256 مگابایتی هم میشه بازی رو اجرا کرد ! فقط ببین الگوریتم اون موتور چیه !

از RAM کارت گرافیک به RAM اصلی سیستم میریم...خب ! توی بازی Crysis یک بمب منفجر میشه و یک خونه رو نابود میکنه...این خانه ی یک تکه حالا تبدیل به تقریبا 10 هزار تکه ی کوچکتر شده که همه شون باید مطابق با شعاع انفجار , شدت انفجار , شتاب انفجار و نیروی وارد بهشون جهت گیری کنن...

برنامه نویس فیزیکی بازی (از بین انواع و اقسام برنامه نویسهای موتور بازی) یکی از وظایفش اینه که بشینه و برای این انفجارهای از پیش تعیین نشده الگوریتم بنویسه...گفتم میشن 10 هزار تا شیئ دیگه ؟! خب ! این 10 هزار تا شیئ هر کدوم باید طبق نیروی خاصی که از جهت خاصی بهشون وارد شده جهت گیری بکنن و با بردار نرمال مخصوص به خودشون و نیروی مخصوص به اون به اطراف پرتاب بشن...

CPU میاد و اطلاعات این 10 هزار تا شیئی رو در آن در RAM میریزه...بعدش میاد و برای این 10 هزار تا شیئ محاسبه های ریاضی واقعا سنگین میکنه...محاسبه هایی که باید حتما درشون یک ماتریس نوشته بشه که مختصات رو نشون میده و یک نیرو باید ضربدر این ماتریس بشه (و همه مون میدونیم که چقدر محاسبات ضرب ماتریسی سخت و طاقت فرساست حتی برای CPU ها !) و سپس جوابهای بدست آمده در یک آرایه ی Integer (و نه Float برای اینکه خیلی محاسبات سخت میشه) گونه ریخته بشن...سپس این آرایه ی 4 در 4 نشان دهنده ی اطلاعات خاصی هستش که باید روی جسم (یعنی یکی از اون ده هزارتا جسم) اعمال بشه تا اون جسم بطور طبیعی در اثر انفجار به اطراف پرت بشه...

خب ! 10 هزار تا جسم داریم...هر کدوم یک آرایه ی مثلا 3 در 3 میخوان که میشه 9 تا خونه...هر کدوم از خونه ها هم با توجه به ++C (زبان مادر بازی نویسی) برابر هستن با 4 بایت (بر روی سیستمهای 32 بیتی) پس خواهیم داشت :

مرحله ی اول (جهت گیری اولیه) :

9 ضربدر 4 (بایت) ضربدر 10000 = 360 کیلوبایت

مرحله ی دوم (نیروی اعمالی بر روی اجسام) :

9 (و یا بیشتر) ضربدر 4 ضربدر 10000 = 360 کیلوبایت (و یا بیشتر)

مرحله ی سوم (ترسیم پرتاب و همچنین تغییر لحظه به لحظه ی اطلاعات) :

9 (و یا بیشتر) ضربدر 4 ضربدر 10000 = 360 کیلوبایت (و یا بیشتر)

و این چرخه همینطوری ادامه پیدا میکنه...برای یک پرتاب ساده باید موارد زیر رو در نظر گرفت :

جهت پرتاب (یک بردار در فضای سه بعدی) , نیروی پرتاب (یک مقدار برداری که دارای مقدار عددی هم هست) , شتاب پرتاب (که از نیرو به دست میاد) , محیط پرتاب ( چک کردن اینکه چه موانعی در سر راه جسم است) , پرتاب (شروع شدن انیمه کردن پرتاب) , برخورد ( محاسبات مربوط به فیزیک بازی در هنگام برخورد) , بعد از برخورد ( محسبات پس از برخورد جسم و محسباتی همچون قل خوردن و یا لیز خوردن و انیمه کردن اونها)

و این فقط یک قسمت کوچیک بازی یعنی فیزیک بود که چیزی در حدود 3 مگابایت رو در ساده ترین حالتش (که بازخوردی هم نداره) رو به خودش اختصاص میده...

در کنار محاسبات فیزیک , موتور بازی باید حجم عظیمی از دیگر اطلاعات رو جمع کنه مثل موارد زیر :

تعداد اسلحه ها و مهمات بازیباز , تعداد دشمنان در دید بازیباز , تعداد دشمنان کلی , اطلاعات چند برداری مربوط به محیط , اطلاعات مربوط به بازخوردها , فراخوانی مکرر اطلاعات مربوط به انیمیشنها و قرار دادن آنها در RAM تا CPU آنها رو اجرا کند , جمع آوری اطلاعات کلی بازی در حین مرحله برای مواقع Save , جمع کردن اطلاعات گرافیکی و فرستادن آنها به کارت گرافیک , محاسبات نورپردازی (در کنار کارت گرافیک) , محاسبات دینامیک برداری , داشتن اطلاعات لازم از بازیباز مثل دید دوربین و زاویه ش و مختصات نقش آفرینی بازیباز و همچنین داشتن بانکی برای دریافت input های بی وقفه و مکرر یک یوزر در حین بازی تا اونها رو دسته بندی و سپس اجرا کنه...

و اینها فقط قسمت کوچکی از یک نرم افزار به نام موتور بازی هستش که این کارها رو انجام میده و همین باعث میشه که RAM بازی که بصورت دینامیک هی پر و هی خالی از اطلاعات بازی میشه , تبدیل به یکی از مهمترین (واقعا مهم !) قسمتهای یک سیستم و بالطبعش یک بازی بشه...

  • لایک 2
لینک به دیدگاه
Share on other sites

امیدوارم مطلب شیرینی باشه

چون خودم کیف کردم

لینک به دیدگاه
Share on other sites

در 35 دقیقه قبل، CleverM گفته است :

+1 جالب بود ولی یکمی بعضی جاهاش گنگ نوشته شده بود

ای اقا

شما که clever هستی دیگ چرا

لینک به دیدگاه
Share on other sites

  • 1 ماه بعد...
مهمان
This topic is now closed to further replies.
 اشتراک گذاری

×
×
  • اضافه کردن...