حداکثر رساندن مدیریت حافظه: جمع کردن شیء در بازی ها

همانطور که در اولین پست خود به اشتراک گذاشتم ، بازی های برنامه نویسی را بدون جاه طلبی زیاد شروع کردم – فقط می خواستم با دوستانم سرگرم شوم. در آن زمان ، من واقعاً به آنچه در پشت صحنه اتفاق می افتد فکر نمی کردم ، به خصوص وقتی که به وجود آمد مدیریت حافظه یا عملبشر من فقط می خواستم بازی های کوچکی بسازم ، و همین بود!
با این حال ، همانطور که من عمیق تر کبوتر می شوم و برنامه نویسی را جدی تر مطالعه می کنم و به صورت حرفه ای کار می کنم ، این را یاد گرفتم ایجاد و از بین بردن اشیاء همیشه با هزینهبشر و این هنگام انتقال بازی ها به کنسول ها یا هنگامی که ما باید اطمینان حاصل کنیم که یک بازی به خوبی در سیستم های محدود تر اجرا می شود ، بسیار مهم است.
در هر صورت ، در برنامه های زمان واقعی مانند بازی ها-و حتی بیشتر در سیستم های تعبیه شده- مدیریت حافظه کارآمد ضروری استبشر این زمانی است که من مفهوم را کشف کردم استخربشر به یاد می آورم که برخی از دوستان جانباز قبلاً آن را ذکر کرده بودند ، اما من در آن زمان کاملاً آن را نادیده گرفتم.
جمع شدن شیء چیست؟
به جای ایجاد و از بین بردن اشیاء در حین گیم پلی (که از قدرت پردازش استفاده می کند و به طور مداوم حافظه را اختصاص می دهد/DealLocates) ، استخر شیء تکنیکی است که در آن شما مجموعه ای از اشیاء را از قبل ایجاد کرده و از آنها استفاده مجدد کنیدبشر
هنگامی که به یک شی نیاز دارید ، یکی از استخر را در دسترس می گیرید.
هنگامی که استفاده از آن تمام شد ، آن را مجدداً تنظیم می کنید و برای استفاده در آینده به استخر باز می گردید.
این امر از عملیات پر هزینه مانند تخصیص حافظه و جمع آوری زباله جلوگیری می کند ، بازی شما را بسیار سریعتر و پایدار تر می کند – به خصوص در موقعیت هایی با پرتابه ها ، دشمنان ، جلوه ها یا ذرات.
در مورد GIF زیر توجه کنید که دوست ما Megaman X فقط می تواند به طور همزمان سه گلوله را آتش بزند. این یک نمونه کلاسیک از استخر شی است: هر پرتابه در یک استخر سه ، غیرفعال شده و منتظر آتش سوزی بازیکن است.
چرا ترکیب شی بسیار مهم است؟
- تقویت عملکرد: CPU و استفاده از حافظه را کاهش می دهد.
- ثبات: از قطره های قاب تصادفی یا یخ زدگی جلوگیری می کند.
- کنترل کردن: شما دقیقاً می دانید در هر لحظه چند شیء وجود دارد.
- مقیاس پذیری: به بازی شما کمک می کند تا تعداد زیادی از اشیاء همزمان را بهتر کنترل کنند.
حتی با وجود کنسول های قدرتمند امروز ، ما نمی توانیم با اشیاء دائماً ایجاد و نابود شویم. و در سیستم های تعبیه شده ، جایی که منابع بسیار محدود هستند ، تکنیک هایی مانند جمع کردن شیء فقط روشهای خوبی نیستند – آنها لازم هستند.
آیا واقعاً لازم است استخر شیء را اجرا کند؟
یک سؤال مشترک – به ویژه برای کسانی که از موتورهای مدرن مانند Gamemaker ، Godot ، Unity یا Unreal استفاده می کنند -: “اگر در حال حاضر مجموعه زباله های اتوماتیک وجود دارد ، آیا من هنوز هم باید نگران این موضوع باشم؟”
من قبلاً همین سوال را از خودم پرسیدم. پاسخ این است: این به پروژه شما بستگی دارد. 😅
برای بازی ها یا صحنه های کوچک که اغلب اشیاء را فوری نمی کنند و از بین نمی برند ، جمع کننده زباله موتور می تواند همه چیز را بدون مشکلات قابل توجه اداره کند.
با این حال ، در بازی هایی که حجم زیادی از موارد سریع را شامل می شود (به عنوان مثال: تیراندازها ، هک و شلاق ، جهنم گلوله یا سیستم ذرات شدید) ، ایجاد مداوم و تخریب باعث ایجاد خواهد شد بالای سر – و در آن مرحله ، حتی جمع کننده زباله از افت عملکرد جلوگیری نمی کند.
در این موارد ، اجرای جمع آوری شیء به صورت دستی می تواند تفاوت زیادی در حفظ بازی شما ایجاد کند صاف و پاسخگوبشر
نمونه ساده از ترکیب شیء
یک استخر پرتابه ساده را تصور کنید: در شروع بازی ، 100 پرتابه ایجاد می کنید و آنها را غیرفعال نگه می دارید.
هنگامی که بازیکن شلیک می کند ، به جای ایجاد یک مورد جدید ، یک پرتابه موجود را از استخر فعال می کنید. هنگامی که پرتابه به چیزی برخورد می کند یا صفحه را ترک می کند ، آن را غیرفعال می کنید و آن را به استخر باز می گردانید.
در اینجا یک مثال اساسی شبه کد آورده شده است. من در ابتدا شروع به نوشتن یک مثال در C کردم ، اما خیلی بزرگ شد ، بنابراین تصمیم گرفتم به جای این بلوک کوچک PseudoCode ، آن را ساده کنم:
pool = createProjectilePool(size=100)
function shoot():
projectile = pool.getAvailableProjectile()
if projectile != null:
projectile.activate(position, direction)
function onProjectileDestroyed(projectile):
projectile.deactivate()
pool.returnProjectile(projectile)
همانطور که مشاهده می کنید ، عملکرد عکسبرداری به یک پرتابه در دسترس (با وضعیت غیرفعال) مراجعه می کند و آن را فعال می کند و بر این اساس مجدداً آن را تغییر می دهد.
هنگامی که یک پرتابه از بین می رود ، ما به سادگی پرچم وضعیت آن را به سمت غیرفعال تغییر می دهیم. یک پرتابه غیرفعال شده ارائه نمی شود یا پردازش نمی شود و منابع زیادی را پس انداز می کند.
افکار نهایی
حقیقت این است ، بسیاری از ابزارهای توسعه بازی مدرن از قبل بسیار کارآمد هستند مکانیسم های جمع آوری زباله، که اغلب می تواند این تصور را ایجاد کند که جمع شدن شیء مبهم یا غیر ضروری است – اما توجه به این نکته مهم است که این فقط به نظر می رسد!
با این حال ، هنگام توسعه بازی ها برای سیستم های محدود – مانند یک بازی کوچک که روی یک میکروکنترلر اجرا می شود – هر بایت حافظه اهمیت دارد و استخر شیء کاملاً ضروری می شود.
ناگفته نماند که این راهی است سریعتر ساختنبا پایدار تروت بازی های بهینه تر در کل.
البته اگر تازه سفر خود را در توسعه بازی شروع می کنید ، نگران نباشید که این بهینه سازی ها در حال حاضر پیچیده به نظر برسند. با گذشت زمان و تمرین ، آنها می شوند طبیعی، یک عادت بی دردسر
و اگر قبلاً اصول اولیه ، یادگیری و اجرای تکنیک ها را به دست آورده اید استخر یک قدم بعدی باورنکردنی برای رفتن پروژه های خود به سطح بعدی است!
با تشکر از خواندن ، و امیدوارم این افت دانش کوچک برای شما مفید باشد!