مهدی رحمتی
مهدی رحمتی
خواندن ۳ دقیقه·۵ سال پیش

بهینه سازی بازی (1) : "Object Pool" به زبان ساده (بخش اول)

با این کار، قصد داریم عملکرد بازی و memory رو بهبود بدیم؛ منظور این است که بجای اینکه memory رو برای ایجاد یک شیء جدید خرج کنیم، یک شیء رو چندبار استفاده میکنیم. این قابلیت به ما اجازه میده تمرکز و نگرانی خودمون رو بیشتر روی افکت های بصری بذاریم تا عملکرد این قضیه.

وقتی که ما برای کنسول ویا موبایل ها بازی میسازیم حسابش باPC کاملا جداست چون ما توی موبایل محدودیت حافظه داریم و از طرفی کاربر از ما انتظار داره که بهترین عملکرد رو بهش ارائه بدیم.

حال فکر کنید با این محدودیتی که داریم، حافظهmemory به بخش های کوچک تقسیم بشه(تکه تکه بشه)... فاجعه اس.

تکه تکه شدن(Fragmentation) یعنی اینکه کل فضای آزادی که در اختیار داریم، به قسمت های کوچکتر حافظه شکسته بشه. کل فضای ما ممکنه زیاد باشه اما وقتی حافظه تکه تکه بشه مشکل سازه. مثلا اگر ما 32 بایت آزاد داریم، اون به دو قسمت 16 بایتی تقسیم میشه و وقتی بخوایم یک آبجکت 24 بایتی رو بهش اختصاص بدیم، قطعا نمی تونیم.

توجه کنید که حتی اگه این fragmentation جزئی هم باشد، بازهم میتونه به بازی آسیب بزنه.

پس از اونجایی که این fragmentation ممکنه عملکرد بازی روی پایین بیاره، باید خیلی مراقب باشین که چطور از حافظه دارین استفاده میکنین.

حالا یک کار ساده برای اینکه ای قضیه اتفاق نیافته چیه؟

یک تکه بزرگ رو از همون اول بازی از حافظه بردارید و تا آخر بازی اون رو آزاد نکنید. (?)

حالا دیگه میتونیم توی اون قسمتی که ایجاد کردیم، آزادانه آبجکت ها رو ایجاد و نابود کنیم.

شفاف تر شدن قضیه:

یک کلاس برای pool تعریف کنید که مجموعه ای از آبجکت هارو توی خودش داره و اون آبجکت ها از دو حالت تبعیت می کنن: "درحال استفاده" یا "در حال استراحت"(منظور از درحال استراحت این است که آبجکت درحال حاضر استفاده نمیشود). با شروع بازی(استارت اولیه)، کل مجموعه ایجاد میشه و حالت اولیه همه روی "در حال استراحت" قرار میگیره.

حالا وقتی میخواید از یک آبجکت جدید استفاده کنین، Pool رو برای اینکار صدا میزنید. Pool حالت آبجکت مورد نظر رو روی "درحال استفاده" قرار میده و در بعد از کار اون به "در حال استراحت" برمیگردونه. با این حساب، بدون استفاده اضافی از حافظه، ما میتونیم چندین آبجکت رو ایجاد و ازبین ببریم.

توجه کنین که برای Pool (با توجه به نیاز های بازی) حد و مرزی رو قائل بشین وگرنه حافظه رو الکی برای آبجکت های غیر ضروری هدر میده. همچین یادتون باشه که از یک Pool وحشتناک بزرگ استفاده نکنین، هرچی Pool کوچکتر باشه، فضای حافظه برای چیزهای دیگه آزاد تره.

کجا Object Pool استفاده میشه؟

1. از این قابلیت بیشتر برای جلوه های بصری (مثل Particle System) استفاده میشه.

2. موقعی که باید به طور مکرر آبجکت بسازید و از بین ببرید.

3. موقعی که با آبجکت های هم اندازه طرف هستید.

و...

programmingobject pooloptimizationبهینه سازیبهینه سازی بازی
موسس تیم BlueAge - بازیساز
شاید از این پست‌ها خوشتان بیاید