管理模块类的最佳选项
Best option for managing module classes
我的游戏基础由一系列模块组成,按类组织,在需要时创建、更新和交互。
一些例子可以是:CWindowManager
, CGraphicsManager
, CPhysicsManager
,等等。
我很惭愧地说,我目前使用全局指针(extern CWindowManager* g_WindowManager;
),我知道这可能是一件不好的事情。
在任何情况下,问题是这些模块需要动态地创建和删除,当然是按照正确的顺序。还有一个问题是,像CPhysicsManager
这样的模块是场景依赖的,因此它们在场景切换时被删除,然后再次创建。
现在,我想切换从使用全局与模块在我的游戏工作。
我不害怕重构,但我真的想不出什么是全局变量的最佳替代方案。
我想过创建一个CModuleManager类并将模块的实例存储在那里作为成员,然后从CModule基类派生。虽然我真的想不出这是如何工作的细节。
这似乎是软件开发,尤其是游戏开发中的一个常见问题,所以:
-与简单地使用全局指针相比,管理模块的最佳选择是什么?
使用全局数据时需要考虑的一些问题:
- 多线程。如果全局数据可以被不同的线程并发访问,您需要小心。
- 可测试性。如果您正在编写单元测试,那么需要在任何代码访问全局数据之前初始化全局数据。
使用全局数据的另一种方法是传递每个类/方法所需的对象实例作为参数。这样做的好处是,类的所有依赖都可以从API中看到。它还使编写单元测试变得更加容易。缺点是,如果到处传递对象,代码可能会变得混乱。
你的想法有一个ModuleManager听起来像服务定位器模式-我认为这是一个可行的解决方案。这个链接可能有帮助:http://gameprogrammingpatterns.com/service-locator.html.
如果你选择继续使用全局指针,那么动态删除全局数据可以在c++中使用智能指针(auto_ptr)实现。
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- Win32编译器选项和内存分配
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 在c代码之间共享数据的最佳方式
- 使用std::source_location报告错误的最佳实践
- C/C++预处理器是否可以检测一些编译器选项
- 派生类销毁的最佳实践是什么
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 将寄存器设计成可由C和C++访问的外设的最佳实践
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 通过选项卡的文本设置QTabWidget顺序
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- C++ C-API 的包装器:探索传递"char*"的最佳选项
- 使用提升程序选项处理 2 级命令的最佳方法
- 创建静默CLI选项的最佳做法
- 设置"深度"配置选项的最佳方法是什么?
- 管理模块类的最佳选项