Game Engine Architecture阅读 5 Engine Support Systems

第五章

在这几章中,主要介绍一些大型的核心系统,包括 资源管理,人机交互,游戏自带的调试工具。

5.1 子系统的建立和关闭

子系统的简历和关闭需要依照一定的顺序。

5.1.1 C++全局静态初始化顺序

全局和静态对象会在main()调用之前初始化,但是初始化顺序是随机的。

5.1.1.1 根据需求初始化

在C++中,函数内的静态变量是不在调用main函数之前初始化的,而是在调用该函数的时候初始化。

class RenderManager
{
public:
         // Get the one and only instance.
         static RenderManager& get()
         {
                  // This function-static will be constructed on the
                  // first call to this function.
                  static RenderManager sSingleton;
                  return sSingleton;
         }
         RenderManager()
         {
         // Start up other managers we depend on, by
         // calling their get() functions first...
         VideoManager::get();
         TextureManager::get();
         // Now start up the render manager.
         // ...
         }
         ~RenderManager()
         {
                  // Shut down the manager.
                  // ...
         }
};

以这种方式来初始化也不行,我们不能控制他们的析构函数的调用顺序。

5.1.2 一个简单解决方式

我们可以在构造和析构函数中什么事都不做,而是在startup或者shutdown中来完成初始化和删除工作。

class RenderManager
{
        public:
        RenderManager()
        {
                // do nothing
        }
        ~RenderManager()
        {
                // do nothing
        }
        void startUp()
        {
                // start up the manager...
        }
        void shutDown()
        {
                // shut down the manager...
        }

};

class PhysicsManager { /* similar... */ };
class AnimationManager { /* similar... */ };
class MemoryManager { /* similar... */ };
class FileSystemManager { /* similar... */ };
// ...
RenderManager gRenderManager;
PhysicsManager gPhysicsManager;
AnimationManager gAnimationManager;
TextureManager gTextureManager;
VideoManager gVideoManager;
MemoryManager gMemoryManager;
FileSystemManager gFileSystemManager;
// ...
int main(int argc, const char* argv)
{
// Start up engine systems in the correct order.
gMemoryManager.startUp();
gFileSystemManager.startUp();
gVideoManager.startUp();
gTextureManager.startUp();
gRenderManager.startUp();
gAnimationManager.startUp();
gPhysicsManager.startUp();
// ...
// Run the game.
gSimulationManager.run();
// Shut everything down, in reverse order.
// ...
gPhysicsManager.shutDown();
gAnimationManager.shutDown();
gRenderManager.shutDown();
gFileSystemManager.shutDown();
gMemoryManager.shutDown();
return 0;
}

还有其他好用的法子来完成这项工作。比如,可以让每个manager在全局优先级队列中注册,然后遍历这个队列按合适的顺序来初始化这些managers。

5.1.3 真实引擎中的一些实例

5.1.3.1 Ogre3D

Ogre3D尽管是一个渲染引擎,但是它提供了在完整游戏引擎中有的很多底层功能,包括一个简单且实用的初始化和关闭机制。在Ogre中,Ogre::Root包含了所有子系统的指针。因此可以很容易的初始化引擎。

OgreRoot.h
class _OgreExport Root : public Singleton<Root>
{
// <some code omitted...>
// Singletons
LogManager* mLogManager;

ControllerManager* mControllerManager;
SceneManagerEnumerator* mSceneManagerEnum;
SceneManager* mCurrentSceneManager;
DynLibManager* mDynLibManager;
ArchiveManager* mArchiveManager;
MaterialManager* mMaterialManager;
MeshManager* mMeshManager;
ParticleSystemManager* mParticleManager;
SkeletonManager* mSkeletonManager;
OverlayElementFactory* mPanelFactory;
OverlayElementFactory* mBorderPanelFactory;
OverlayElementFactory* mTextAreaFactory;
OverlayManager* mOverlayManager;
FontManager* mFontManager;
ArchiveFactory *mZipArchiveFactory;
ArchiveFactory *mFileSystemArchiveFactory;
ResourceGroupManager* mResourceGroupManager;
ResourceBackgroundQueue* mResourceBackgroundQueue;
ShadowTextureManager* mShadowTextureManager;
// etc.
};

OgreRoot.cpp
Root::Root(const String& pluginFileName,
const String& configFileName,
const String& logFileName):
mLogManager(0),
mCurrentFrame(0),
mFrameSmoothingTime(0.0f),
mNextMovableObjectTypeFlag(1),
mIsInitialised(false)
{
// superclass will do singleton checking
String msg;
// Init
mActiveRenderer = 0;
mVersion
= StringConverter::toString(OGRE_VERSION_MAJOR)
+ "."
+ StringConverter::toString(OGRE_VERSION_MINOR)
+ "."
+ StringConverter::toString(OGRE_VERSION_PATCH)
+ OGRE_VERSION_SUFFIX + " "
+ "(" + OGRE_VERSION_NAME + ")";
mConfigFileName = configFileName;
// Create log manager and default log file if there
// is no log manager yet

if(LogManager::getSingletonPtr() == 0)
{
mLogManager = new LogManager();
mLogManager->createLog(logFileName, true, true);
}
// Dynamic library manager
mDynLibManager = new DynLibManager();
mArchiveManager = new ArchiveManager();
// ResourceGroupManager
mResourceGroupManager = new ResourceGroupManager();
// ResourceBackgroundQueue
mResourceBackgroundQueue
= new ResourceBackgroundQueue();
// and so on...

5.1.3.2  Naughty Dog’s Uncharted: Drake’s Fortune

5.2 内存管理

5.2.1. Optimizing Dynamic Memory Allocation

5.2.1.1. Stack-Based Allocators

5.2.1.2. Pool Allocators

5.2.1.3. Aligned Allocations

5.2.1.4. Single-Frame and Double-Buffered Memory Allocators

5.2.2. Memory Fragmentation

5.2.2.1. Avoiding Fragmentation with Stack and Pool Allocators

5.2.2.2. Defragmentation and Relocation

5.2.3. Cache Coherency

5.2.3.1. Level 1 and Level 2 Caches

5.2.3.2. Instruction Cache and Data Cache

5.2.3.3. Avoiding Cache Misses

5.3. Containers

5.3.1. Container Operations

5.3.2. Iterators

5.3.2.1. Preincrement versus Postincrement

5.3.4. Building Custom Container Classes

5.3.4.1. To Build or Not to Build

5.3.4.2. Dynamic Arrays and Chunky Allocation

5.3.4.3. Linked Lists

5.3.4.4. Dictionaries and Hash Tables

5.4. Strings

5.4.1. The Problem with Strings

5.4.2. String Classes

5.4.3. Unique Identifi ers

5.4.4. Localization

5.5. Engine Confi guration

5.5.1. Loading and Saving Options

5.5.2. Per-User Options

5.5.3. Confi guration Management in Some Real Engines

5.5.3.1. Example: Quake’s CVARs

5.5.3.2. Example: Ogre3D

5.5.3.3. Example: Uncharted: Drake’s Fortune

 

 

 

 

 

原文链接: https://www.cnblogs.com/heezee/archive/2012/09/01/2666327.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    Game Engine Architecture阅读 5 Engine Support Systems

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/61494

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 上午10:01
下一篇 2023年2月9日 上午10:01

相关推荐