View Full Version : مدیریت حافظه بازیها
pswin.pooya
پنج شنبه 10 تیر 1389, 01:20 صبح
سلام
من قبل از اینکه بخوام شروع کنم بقیه قسمتهای انجینم مثل رندرر اون رو بنویسم میخوام روی هسته کار کنم و دو تا موضوع خیلی مهم توی برنامه کارم هست:
1. مدیریت حافظه
2. مدیریت منابع (احساس می کنم که دیزاین قبلیم مورد داشت)
خب اول میخوام با مدیریت حافظه شروع کنم اما در این مورد هیچ اطلاعاتی ندارم. من دقیقا باید چی کار انجام بدم و چه منابعی رو مطالعه کنم. و همینطور برای طراحی یه مدیر حافظه موثر باید چه چیزهایی رو در نظر بگیرم؟
khorzu
پنج شنبه 10 تیر 1389, 10:42 صبح
منظورتون پیاده سازی یک چیزی مثل مدیریت حافظه جاوا یا دات نته ؟ آیا لازمه ؟
pswin.pooya
پنج شنبه 10 تیر 1389, 11:23 صبح
منظورتون پیاده سازی یک چیزی مثل مدیریت حافظه جاوا یا دات نته ؟ آیا لازمه ؟
تمام انجینهای معروف مدیریت حافظه خودشون رو دارن. من دیشب یک سرچی در مورد memory pool زدم. ظاهرا چون allocate و deallocate بازیها زیاده باعث میشه که حافظه تیکه تیکه شه و این به شدت به پرفرمانش صدمه میزنه به خاطر همینم از chunk استفاده میکنن تا از قطعه قطعه شدن بیرونی جلوگیری کنن و یه مورد دیگه اینه که سرعت new/delete خیلی پایین هستش و با اینکار سرعت رو هم افزایش میدن
نمی دونم شاید هم دارم اشتباه میکنم. باید مطالب بیشتری رو بخونم و بیشتر در مورد مدیریت حافظه تحقیق کنم. فعلا فقط لینک زیر رو به صورت نصفه نیمه خوندم:
http://www.codeproject.com/KB/cpp/MemoryPool.aspx
کلا این مدیریت حافظه یه دردسر هستش و تا حالا هیچ کسی و هیچ سیستم عاملی موفق نشده که اون رو درست و حسابی (بدون نقص) پیاده سازی کنه و تمام سیستم عاملها هم باهاش مشکل دارن.
SeganX
پنج شنبه 10 تیر 1389, 13:41 عصر
سلام
تصمیم خوبی گرفتی. در مورد مدیریت حافظه بهتر پیشنهاد می کنم که توابع Alloc / Free / Size / ... رو خودت به صورت استاندارد شده باز نویسی یا حداقل wrap کنی و در تمام برنامت از توابع خودت استفاده کنی. به این ترتیب اگر بعدها به lib خوب واسه memheap پیدا کردی می تونی راحت جایگزینش کنی. این کار انعطاف بیشتری واسه آمار گیری و ازین کارها رو هم بهت میده.
من تو سایتم یه mempool گذاشتم. اگه دوست داری تستش کن. البته فقط یه مثال و بسته به نوع استفاده می تونی تغییرش بدی.
pswin.pooya
پنج شنبه 10 تیر 1389, 15:40 عصر
تصمیم خوبی گرفتی. در مورد مدیریت حافظه بهتر پیشنهاد می کنم که توابع Alloc / Free / Size / ... رو خودت به صورت استاندارد شده باز نویسی یا حداقل wrap کنی و در تمام برنامت از توابع خودت استفاده کنی. به این ترتیب اگر بعدها به lib خوب واسه memheap پیدا کردی می تونی راحت جایگزینش کنی. این کار انعطاف بیشتری واسه آمار گیری و ازین کارها رو هم بهت میده.
دقیقا باید چی کار کنم؟ باید مواردی رو مثل garbage collector رو هم بنویسم؟ بع غیر از mem pool روشهای دیگه یا الگوریتمهای دیگه ای هم هستن؟
من تو سایتم یه mempool گذاشتم. اگه دوست داری تستش کن. البته فقط یه مثال و بسته به نوع استفاده می تونی تغییرش بدی.
آره قبلا هم دیده بودش و یکی از دلایلی هم که باعث شد به فکر این کار بیفتم همون مقاله داخل سایت شما بود. اینکه شما و کوچول کارهاتون رو لوگ میکنین خیلی خوبه باعث میشه که بعدا خیلیها بتونن از اونها استفاده کنن من از وبلاگ کوچول و سایت شما مطالب زیادی رو یاد گرفتم.
سجاد جان امیدوارم که موفقتر از همیشه باشی.
یه سوال دیگه داشتم؟
میشه یه operator مثل new ساختش، مثلا:
int* a= mynew int[10];
PC2st
پنج شنبه 10 تیر 1389, 16:37 عصر
از کلاس shared_ptr که یک اشارهگر با شمارشگر ارجاعها (reference counting) است هم میتوانید برای مدیریت راحت حافظه استفاده کنید. این کلاس یک مقدار را در حافظه heap نگهداری میکند؛ هر زمان تعداد ارجاعها به آن مقدار از حافظه برابر صفر شد، آن را از حافظه پاک خواهد کرد (در این حالت پاکشدن وابسته به یک بلوک از کدها نیست (بر خلاف متغیرهای معمولی auto)). چیزی شبیه به اشیاء کتابخانهٔ Glib و Gtk ... کلاس shared_ptr جزء کتابخانه boost و همچنین در فضای نام std::tr1 در STL قرار دارد (برای استاندارد بعدی ++C
میشه یه operator مثل new ساختش، مثلا:
نمیشود ولی میتوانید عملگر new را بازنویسی کنید (overloading operator new).
SeganX
جمعه 11 تیر 1389, 01:25 صبح
لطف داری شما.
من هنوز روشی برای garbage collector که مورد پسندم باشه پیدا نکردم اما روشی که دوستمون PC2st گفتن هم مفید هستش هم خیلی رایج. در کل باید دقیقا بدونی که برای چه کاری و در کجا نیاز به garbage collector داریم. استفاده بیمورد از garbage collector می تونه باعث کاهش سرعت و همچنین افزایش بی دقتی ما برنامه نویس ها در کد نویسی بشه. چون همه چیز رو میندازیم به عهده garbage collector و دقتمون رو از دست می دیم ( البته شاید من اینطوری حس می کنم ) !!!
یکی از موارد استفاده از mempool این هستش که هر وقت که نیاز بود ( مثلا انتهای برنامه ) کل pool رو پاک کنیم و نگران memory block های پراکنده نباشیم.
برای ساخت mempool روش های زیادی هست که یکی از روش های معروف buddy mempool (http://cboard.cprogramming.com/cplusplus-programming/91623-buddy-memory-allocation-question.html) هستش که اینجا می توانی یه sample هم ازش ببینی:
http://cboard.cprogramming.com/cplusplus-programming/91623-buddy-memory-allocation-question.html
اپراتور new رو فقط می شه override کرد و نمیشه یه اپراتور دیگه با یه اسم دیگه که همون کار رو کنه نوشت.
اما خوب برای اینکار می تونی از preprocessor استفاده کنی که انعطاف کمی برای آمارگیری بهت میده و راه دیگه اینه که کلا توابع جدیدی بنویسی که علاوه بر ساخت و تولید کارای دیگه ای هم کنه. مثلا آمار بگیره و ....
template <typename T>
T* MyNew(UINT count = 1)
{
// some code for survey ...
T* result = new T[count];
// some code for survey ...
return result;
}و در هنگام استفاده میشه چیزی شبیه به این:
char* c = MyNew<char>(12);
c[11] = 0;
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.