管理模块类的最佳选项

Best option for managing module classes

本文关键字:最佳 选项 模块 管理      更新时间:2023-10-16

我的游戏基础由一系列模块组成,按类组织,在需要时创建、更新和交互。

一些例子可以是:CWindowManager, CGraphicsManager, CPhysicsManager,等等。

我很惭愧地说,我目前使用全局指针(extern CWindowManager* g_WindowManager;),我知道这可能是一件不好的事情。

在任何情况下,问题是这些模块需要动态地创建和删除,当然是按照正确的顺序。还有一个问题是,像CPhysicsManager这样的模块是场景依赖的,因此它们在场景切换时被删除,然后再次创建。

现在,我想切换从使用全局与模块在我的游戏工作。

我不害怕重构,但我真的想不出什么是全局变量的最佳替代方案。

我想过创建一个CModuleManager类并将模块的实例存储在那里作为成员,然后从CModule基类派生。虽然我真的想不出这是如何工作的细节。

这似乎是软件开发,尤其是游戏开发中的一个常见问题,所以:

-与简单地使用全局指针相比,管理模块的最佳选择是什么?

使用全局数据时需要考虑的一些问题:

  • 多线程。如果全局数据可以被不同的线程并发访问,您需要小心。
  • 可测试性。如果您正在编写单元测试,那么需要在任何代码访问全局数据之前初始化全局数据。

使用全局数据的另一种方法是传递每个类/方法所需的对象实例作为参数。这样做的好处是,类的所有依赖都可以从API中看到。它还使编写单元测试变得更加容易。缺点是,如果到处传递对象,代码可能会变得混乱。

你的想法有一个ModuleManager听起来像服务定位器模式-我认为这是一个可行的解决方案。这个链接可能有帮助:http://gameprogrammingpatterns.com/service-locator.html.

如果你选择继续使用全局指针,那么动态删除全局数据可以在c++中使用智能指针(auto_ptr)实现。