【问题标题】:How do I handle the creation/destruction of many objects in memory effectively?如何有效地处理内存中许多对象的创建/销毁?
【发布时间】:2011-08-26 23:24:07
【问题描述】:

我正在制作自己的游戏。目标之一是在世界上拥有尽可能多的对象。在这个游戏中,需要在某个不可预测的时间段内创建许多对象(例如武器射击会创建一个对象),一旦射弹击中某物,该对象也需要被摧毁(可能是它击中的东西) .

所以我想知道在内存中处理这个问题的最佳方法是什么。我考虑过创建一个堆栈或表,并在其中添加指向这些对象的指针,并按需创建和销毁这些对象,但是,如果在帧之间尝试同时创建或销毁数百个(或数千个)对象怎么办?我想保持稳定和流畅的帧速率,而系统调用的这种激增肯定会减慢它的速度。

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

最好的处理方法是什么?

【问题讨论】:

    标签: windows memory-management


    【解决方案1】:

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

    通常,这些方法是组合在一起的。使用您描述的第一种方法(对象列表、数组、单例、等)具体的方法取决于游戏和正在创建的对象。

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

    【讨论】:

      【解决方案2】:

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

      您可以经常设计游戏机制以防止游戏内存不足(例如,当玩家过于频繁地射击时增加武器卡壳的机会)。

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

      【讨论】:

        猜你喜欢
        • 2015-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多