c++ - 如何使用 dll 中的 exe 实现的类

标签 c++ game-engine

我正在构建一个简单的游戏引擎和一个游戏。这个想法是在引擎中实现大部分功能和基本类层次结构,应该是一个 exe,然后有一个 dll 来实现给定引擎提供的工具的特定游戏。类似于 ID 引擎,例如 idTech4 .

然后引擎将加载 dll,获取游戏实例,将游戏指针指向游戏所需的任何函数和数据结构,并调用诸如 game->update(); 之类的方法。在游戏实例上。到现在为止还挺好。

我想在引擎中实现诸如Entity、Transform、Vector3等基本类之类的东西。然后在游戏中我想要的是例如从实体派生我的角色。
class Character : public engine::Entity {...};
像这样的东西编译得很好,因为我包含了来自引擎的头文件,但它们没有链接,因为我不使用 obj 文件,也不使用引擎中的 cpp 文件。我知道为什么这不起作用。据我所知,我的(合理的)选择是:

  • 只制作这些类的标题 - 这样它总是会在任何地方编译。

  • 我不想要这个,因为它会增加编译时间、二进制大小等。
  • 将通用功能放入 lib 或 dll 中。

  • 这会起作用,但是 文件意味着我在 exe(引擎)和 dll(游戏)中都编译(链接)了相同的类 - 这看起来很草率。
    DLL 会工作,但我需要对引擎和游戏做的所有导出和进口工作似乎都做了很多。
    也可能是最重要的 lib 和 dll 方法都有一个共同的问题,那就是在开发过程中,由于类层次结构可能会发生很大变化等,我最终可能会在它们之间移动各种类。

    我的问题是,还有其他方法可以解决这个问题吗?对我来说,这似乎是一个非常有用的功能,可以在 dll 中使用 exe 中的类层次结构。我什至尝试了非常愚蠢的事情,例如让链接器使用引擎编译期间生成的 .obj 文件,但除非我一一指定所有 .obj 文件(我使用的是 Visual Studio 2017),否则它不起作用。

    我不想放弃这种设计的模块化。

    编辑 :由于 dll 是特定于平台的,让我们考虑 Windows(尽管我猜其他平台会类似)。

    最佳答案

    听起来您想利用动态加载,但我认为您可能会以错误的方式翻转事情。 exe通常有游戏代码和 .dll 具有游戏引擎逻辑和类。您加载 .dll .exe 代码并使用引擎注册不同的东西,以便您的游戏代码得到更新和渲染。

    我现在正在考虑是否有办法翻转它,但它需要在游戏设计逻辑中进行范式转换,其中游戏仅向游戏引擎或其他东西提供更新和渲染功能。这确实是您可以依赖的全部,因为引擎必须足够通用才能处理游戏。

    如果我想到任何突破性的东西,我会在这里发布,但同时这里有一些关于动态加载的信息,可以帮助您入门。 https://en.wikipedia.org/wiki/Dynamic_loading

    关于c++ - 如何使用 dll 中的 exe 实现的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43660889/

    相关文章:

    c++ - 类(class)访问违规阅读位置

    java - Android 游戏开发 - 我应该使用像 AndEngine 这样的框架吗?

    java - 将 LWJGL 游戏引擎导出为(不可运行)JAR

    c++ - 全新的 UE5 C++ 项目构建时不会出现任何错误

    c++ - 在 OpenCV 中绘制多边形?

    c++ - 无法累积编译时间常量

    c++ - `f().a[0]` 是一个 xvalue 吗?

    c++ - 函数退出后 vector 数据消失

    iOS 游戏引擎选择

    3d - Vulkan 渲染 channel 在多线程渲染中是本地线程吗