【问题标题】:How to arrange editor code in a game engine?如何在游戏引擎中安排编辑器代码?
【发布时间】:2021-09-26 18:57:23
【问题描述】:

我们的轻量级游戏引擎需要保持其二进制大小。

但是,我们必须在现有引擎代码中添加一些编辑器代码。例如:

class Material {
    public:
    #some engine code
    bool InitWithMaterialSourceCode();

    public:
    # some code only used in editor mode
    void SetMaterialCachePath();
    std::string material_source_file_path;
    std::string GetMaterialSourceCode();
}

一些接口和变量只在编辑器模式下使用。我应该如何安排这些代码?

以下是我的想法:

1、继承。在编辑器模式下使用子类,其中所有使用父类的代码行都需要修改。

2,重复。再写一个编辑器模式的类,好像违反了软件工程的规则。

【问题讨论】:

  • 你能澄清一下“编辑器代码”是什么意思吗?您的引擎是否有一个需要您的类提供额外功能/属性的编辑器?这些属性对常规引擎代码有影响吗?我认为,这个决定很大程度上取决于您当前的设计。
  • 提供的信息太少,无法给出好的建议,但对我来说,如果您尝试解决正确的问题,这会引起关注。也许你可以将你的材料分解成更小的类。一个只用于渲染,也可能是一个带有缓存策略的工厂类。
  • @OutOfBound 有些情况代码应该放在Material类中,例如GetMaterialSourceCode,因为只有在编辑器模式下运行才需要保留这个接口。
  • @heLomaN 您能否提供此类函数的最小示例以及它在编辑器和引擎中的使用方式(仅类存根和伪代码函数)。如果没有更多关于您的设计的知识,真的不可能给出好的建议。

标签: c++ game-engine system-design


【解决方案1】:

使用 #define / #ifdef 完成

【讨论】:

  • 不,不是。根据宏定义不同的类是违反 ODR 的肯定方法,也是在跟踪导致的随机崩溃时导致疯狂的调试器行为的秘诀。
  • @Quentin 如果你用一个定义编译一个程序,用另一个定义编译另一个程序,并且不要让它们混合,你就不会违反 ODR
  • @AlexGuteniev 绝对。但经验告诉我,这个“如果”并不像看起来那么可靠,尤其是当您开始使用动态库时。
猜你喜欢
  • 1970-01-01
  • 2010-11-21
  • 2022-01-12
  • 2012-04-11
  • 2020-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-02
相关资源
最近更新 更多