【问题标题】:How to keep objects created inside other objects alive without using new? [closed]如何在不使用 new 的情况下使在其他对象中创建的对象保持活动状态? [关闭]
【发布时间】:2019-02-14 06:30:47
【问题描述】:

我正在用 C++ 编写一个游戏,我遇到了这个设计问题:

我在游戏中的所有对象都有一个名为Entity 的基类。为了使用继承,我将指针存储在我的octree 中。在我的游戏中,有些对象将由其他对象的方法创建。问题是:我可以在哪里存储以这种方式创建的对象,以便它在游戏期间保持不变,以便我存储的指针有效?

我不想使用new,因为我可能会以这种方式创建数百甚至数千个对象,而且我听说new 非常慢。

到目前为止,我想出的唯一方法是拥有一个存储所有这些对象的大向量。该向量可能会被初始化为一个巨大的大小,这样它就不必调整自己的大小并弄乱我的指针。不过,这似乎很愚蠢。

【问题讨论】:

  • “虽然这看起来相当愚蠢” 为什么?为游戏中的所有实体设置一个经理(某种形式)是很常见的
  • 祝你的项目好运!除了您查看gameprogrammingpatterns.com 的建议之外,我没有具体建议 - 它有点谈到这种事情。
  • 我不知道“大型”游戏中的内存是如何处理的,但即使是游戏,您也不应该担心性能首先。首先要编写好的、可读的、可理解的、可测试的和可维护的代码。然后您测量、基准测试和配置文件以找到瓶颈并优化它们(使用大量的 cmets 和文档,因为优化往往会使代码变得不可读和不可维护)。请记住,足够好通常就是足够好。
  • 如果在分析之后你发现内存分配确实是一个瓶颈,有很多方法可以实现你自己的内存分配系统,很多都可以在互联网上免费获得(或者作为完成的开源代码,或者用您可以自己实现的算法记录)。
  • 除非您的目标平台是一个土豆,否则使用new 分配数千个对象绝对没问题,尽管我建议使用智能指针来隐藏混乱的内存管理。

标签: c++ oop dynamic-allocation


【解决方案1】:

首先:不要太担心性能。遵守一些基本规则,你会没事的:

  • 避免复制大对象(通过指针或引用传递)
  • 首选矢量而不是地图,并在您有
  • 看看 std::algorithm 库为您提供了什么 - 这些函数通常很快且经过测试

对您的项目来说最重要的是:考虑结构和设计

  • 使用清晰的界面
  • 对对象具有单一责任
  • 更喜欢组合而不是继承

至于你的具体问题: 有一个“ObjectManager”类很好。作为第一个实现,向量也很好,只需将其隐藏为实现细节,以便您以后可以在需要时对其进行更改。

【讨论】:

    【解决方案2】:

    改进new 的一种方法是为您的对象定义custom allocators,利用您的类知识来编写比标准类更好的新对象。

    好消息是您可以立即使用new 编写代码,然后再创建自定义分配器。所以不要迷失在过早优化的危险中,我们都知道:

    过早的优化是万恶之源
    ——唐纳德·克努斯

    如果Entity 是所有对象的基类,我想你会大量使用多态性。不幸的是,由于slicing 问题,您无法轻松管理向量中的多态对象(这将是更方便和更安全的方式)。所以在这种情况下指针是可以的。也许您可以考虑shared_ptr 以避免内存泄漏。

    话虽如此,您可能对this article 感兴趣,了解游戏中的实体-组件-系统模式以及内存分配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-07
      • 1970-01-01
      • 2021-07-26
      • 1970-01-01
      • 2013-06-17
      • 1970-01-01
      相关资源
      最近更新 更多