如何有效地处理内存中许多对象的创建/销毁?

时间:2011-08-26 23:24:07

标签: windows memory-management

我正在制作自己的游戏。其中一个目标是在世界范围内拥有尽可能多的物体。在这个游戏中,需要在一些不可预测的时间内创建许多物体(就像武器射击会创造一个物体),一旦射弹击中某物,物体就会被摧毁(也许它会击中它)

所以我想知道在内存中处理这个问题的最佳方法是什么。我曾想过创建一个堆栈或表,并在那里添加指向这些对象的指针,然后根据需要创建和销毁这些对象,但是,如果几百个(或几千个)对象试图在帧之间一次创建或销毁呢?我希望保持稳定和流畅的帧速率,系统调用的这种激增肯定会减慢它的速度。

所以我认为我可以尝试在内存中保留一些对象,这样我就可以将信息复制到它们中,并使用它们而无需根据需要请求内存。但是我应该尝试保留多少内存?或者我不应该担心,只要用户计算机有足够的(可能他们将专注于游戏而不是在后台运行天气模拟)。

处理此问题的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

简短回答:这取决于对象的预期寿命。

通常,方法是组合的。一个相当静态且不太可能被删除或经常创建的对象(通常是玩家,关卡,关卡中的某些对象等)是使用您描述的第一种方法创建的(对象列表,数组,单例,等)确切的方法取决于游戏和正在创建的对象。

对于短期物体,如子弹,粒子效果,或在某些游戏中,敌人本身通常使用类似object pool pattern的东西。在游戏开始时,一大块记忆被反转,并在整个游戏过程中重复用于子弹和漂亮的粒子效果。至于我应该保留多少内存?,理想的答案是“尽可能少”。不幸的是,有时很难弄清楚这一点。解决这个问题的最佳方法是猜测在任何给定时间你有多少子弹或者你计划在屏幕上使用什么,乘以2(当你决定你的子弹地狱射手并没有真正发挥作用时只有50个子弹)然后添加一点缓冲。为了更容易,将该值存储在易于理解的#define BULLET_MAX 110中,以便您可以在游戏接近完成时更改它,并且您可以合理地确定该值不会波动太多。为了获得额外的乐趣,您可以将值绑定到配置变量,并让图形设置影响它。

答案 1 :(得分:1)

在流动性至关重要的实时游戏中,它们通常在关卡的开头分配大量内存,并避免在游戏中间进行任何分配/解除分配。

你可以经常设计游戏机制,防止游戏内存不足(例如当玩家太频繁地射击太多时增加武器干扰的机会)。

最终,在您的目标最低支持机器上测试您的游戏,如果它足够快,那么它足够快,并且不会使您的代码在假设情况下过度复杂化。