子系统的启动和终止
C++的静态初始化次序不可用,因为C++在调用程序进入点(main())之前,全局及静态对象已经被构建,而我们对这些构造函数的调用次序不可预知。
游戏引擎的子系统,常见的设计模式是为每个子系统定义单例类。常用的单例模式的实现方法,难以控制它的析构次序,而且一个获取管理器的实例的方法,可能会有很高的开销。因此,游戏开发中,直接采用简单粗暴的方法。
具体来说,就是将构造和析构函数留空,内部不做任何事情,直接在main函数中按需要的次序调用自定义的启动和终止函数。
class RenderManager{ public: RenderManager(){} ~RenderManager(){} void startUp(){ //自定义的启动函数 } void shutDown(){ //自定义的终止函数 } }; class PhysicsManager{/*同上面类似*/ }; class AnimationManager{/*同上面类似*/ }; class MemoryManager{/*同上面类似*/ }; RenderManager gRenderManager; PhysicsManager gPhysicsManager; AnimationManager gAnimationManager; MemoryManager gMemoryManager; int _tmain(int argc, _TCHAR* argv[]) { //启动各个子系统 gMemoryManager.startUp(); ... gRenderManager.startUp(); gAnimationManager.startUp(); gPhysicsManager.startUp(); //运行游戏 //终止各个子系统 gPhysicsManager.shutDown(); gAnimationManager.shutDown(); gRenderManager.shutDown(); ... gMemoryManager.shutDown(); return 0; }