c++ - 在现代 C++ 游戏引擎中组织全局系统访问

标签 c++ oop static global game-engine

首先,如果这个问题已经得到回答,请原谅,但我不能确定我的选择。

我正在开发一个 C++ 游戏引擎,我希望它符合现代标准。我以 OOP 方式编写它,并且有一个名为 ENGINE 的主类。在它里面,有几个代表特定子系统的类实例:WINDOWD3D11_RENDERER 等。我还有一个日志系统(LOGGER ) 必须对所有子系统可用。

现在,这种对记录器的全局访问给我带来了一个问题。我不确定是否应该在 ENGINE 类之外将其声明为静态的,并有一个函数返回对它的引用或在 ENGINE 中实例化它并使所有子系统指向它。

为了让您更好地理解我在说什么,我发布了这些场景的简化版本(考虑到我删除了很多无意义的功能)。

第一种解决方案:

class LOGGER {...};

LOGGER* GetLogger()
{
    static LOGGER Logger;
    return &Logger;
}

// Just one example.
class WINDOW
{
    void Function()
    {
        GetLogger()->Write();
    }
};

class ENGINE
{
private:
    WINDOW Window;
}

请注意,Irrlicht 引擎是这样做的:

class Printer
{
public:
    static void Write();
    static LOGGER* Logger;
};

而且它可以像这样全局访问:

os::Printer::Write();

第二种方案:

class LOGGER() {...};

// Same example.
class WINDOW
{
public:
    void Initialize(LOGGER* pLogger)
    {
        Logger = pLogger;
    }

    void Function()
    {
        Logger->Write();
    }

private:
    LOGGER* Logger;
};

class ENGINE
{
public:
    void Initialize()
    {
        Window.Initialize(&Logger);
    }

private:
    WINDOW Window;
    LOGGER Logger;
}

我不知道哪个是最好的解决方案,如果您能指出正确的解决方案,我会很高兴。提前谢谢你。

最佳答案

我认为这张图更能代表您的需求:

enter image description here

您的组件应该与日志无关,因为它们的功能不依赖于日志记录功能。这个功能应该委托(delegate)给引擎。

引擎本身可以包含一个 Logger 组件,它处理实际的日志记录。

让我们看一些基本代码:

class Engine {
    private:
        Logger& mLogger;
        EngineComponent mComponents[10];
    public:
        Engine(Logger& logger):
            mLogger(logger) {
        }

        void addComponent(EngineComponent& c, int pos) {
            mComponents[pos] = c;
            c.setEngine(this);
        }

        void log(const std::string& message) {
            mLogger.write(message);
        }
}

class EngineComponent {
    private:
        Engine* mEngine;
    protected:
        EngineComponent() {}
    public:
        void setEngine(Engine* engine) {
            mEngine = engine;
        }

        void log(const std::string& message) {
            if (mEngine != NULL) {
                mEngine->log(message);
            }
        }
}

class Window : public EngineComponent {
    // add implementation
}

class D3d11Renderer : public EngineComponent {
    // add implementation
}

class Logger {
    protected:
        Logger() {}
}

class FileLogger : public Logger {
    // add implementation
}

希望对您有所帮助。

关于c++ - 在现代 C++ 游戏引擎中组织全局系统访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37652259/

相关文章:

c++ - 图形模板类

oop - 与面向对象设计相关的组合是什么?

php - 不应静态调用非静态方法 utf_normalizer::nfc()

c++ - 此断点当前不会被命中 : Dll debugging

c++ - 英特尔 MIC 卸载 - 适用于 C++ 对象?

c++ - 我们什么时候应该在 unique_ptr 中使用自定义删除器而不是默认删除器?

android - fragment 2 fragment 通信

arrays - Go:空花括号对数组初始化内存分配的影响

javascript - iframe 中的回调方法返回一个值给 opener

c++ - 为什么 '[[fallthrough]]' 需要方括号 '[[]]' ?