【问题标题】:c++ game engine design and objects going out of scopec++ 游戏引擎设计和对象超出范围
【发布时间】:2017-01-12 00:45:49
【问题描述】:

我正在使用 C++ 开发一个基于小型组件的游戏引擎。将各种组件添加到游戏对象对象的内部列表中,为了节省一些时间,我不制作这些组件的成员变量,只有游戏对象是成员变量,如下所示:

void Initialize()
{     
   MeshComponent* meshRenderer = new MeshComponent(mesh, material);
   m_GameObject.AddComponent(meshRenderer);
}

meshRenderer 变量正在添加到 AddComponent() 中的组件列表中,但在此函数结束时超出范围。

稍后(在游戏的更新/绘制循环中)调用此组件并且一切正常,尽管对象在初始化期间超出了范围。

我是否理解范围有问题,这样使用是否安全,或者我应该采取其他方法(不必为每个组件创建成员变量)?

感谢您的帮助!

【问题讨论】:

  • 我强烈建议使用 make_shared(共享指针)或 make_unique,或者至少了解它们,而不是“新建”和“删除”。

标签: c++ scope game-engine


【解决方案1】:

稍后(在游戏的更新/绘制循环中)调用此组件并且一切正常,尽管对象在初始化期间超出了范围。

除非是deleted,否则该组件不会超出范围。

【讨论】:

    【解决方案2】:

    首先,我建议你在开始像游戏引擎这样的大项目之前多学习C++。

    超出范围的是meshRenderer 类型为MeshComponent* 的变量,它是指向MeshComponent 的指针。当指针超出范围时会发生什么?什么都没有。内存是使用new 运算符在堆上分配的,它会一直留在那里,直到您使用delete 运算符释放它。

    【讨论】:

      【解决方案3】:

      稍后(在游戏的更新/绘制循环中)调用此组件并且一切正常,尽管对象在初始化期间超出范围

      那是因为在区块中:

      void Initialize()
      {     
         MeshComponent* meshRenderer = new MeshComponent(mesh, material);
         m_GameObject.AddComponent(meshRenderer);
      }
      

      栈中的变量是指针meshRenderer),指向的对象分配在上。 因此,当到达} 时,只有指针被“销毁”,但不是指向的对象。

      这是动态内存出错的主要原因之一。

      所以它应该“正常”工作直到组件管理器正确处理动态内存(例如,正确的释放)。


      这样使用是否安全,或者我应该采取其他方法(不必为每个组件创建成员变量)?

      安全是一个相对的概念。即使是在 C 或 C++ 动态内存方面有丰富经验的人也可能会犯一些错误,从而导致内存泄漏

      我可以建议您阅读和学习smart pointers。 [C++11 起]

      智能指针简化了指针的概念,因为(如果正确使用)它会自动处理内存释放。

      例如,在您的情况下,std::shared_ptr 可能很有用。

      共享指针允许引用同一对象(同一内存)的多个指针实例。实际上,多个std::shared_ptr 对象可能拥有同一个对象。当拥有该对象的最后一个剩余 shared_ptr 被销毁(或程序员明确想要)时,该对象被销毁并释放其内存。

      【讨论】:

      • +1 虽然我会使用 unique_ptr,或者严格限制 shared_ptr 的所有权,并且只将 weak_ptr 返回给用户。请注意,这在纯粹主义者中不太受欢迎,他们认为每个智能指针背后都潜伏着性能问题。
      • @Robinson 我完全同意你的看法。事实上,我很少使用智能指针,但我的工作场景总是关于低级算法。相反,在游戏引擎中我看到了很多,特别是在组件管理系统中,共享指针是常用的。这就是为什么我很快就提出了这个建议。
      猜你喜欢
      • 1970-01-01
      • 2018-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-14
      • 2017-07-27
      • 2011-07-05
      • 1970-01-01
      相关资源
      最近更新 更多