3

所以几个月前我观看了这段视频,Epic 展示了他们新的虚幻引擎 4 开发者功能。抱歉,我找不到视频,但我会尽力解释。

引起我注意的一个特性是 C++“动态”修改和编译。这家伙在编辑器中展示了他是如何玩游戏的,并修改了代码中的一些变量,保存它,并且这些更改立即反映在游戏中。

所以我一直在想......如何实现这一目标?目前我可以想到两种可能的方法:要么是恶作剧,它只是“c 风格”的脚本语言,而不是 C++ 本身,要么是共享库(阅读:DLL)的魔法。

这是我自己尝试的东西(简化):

for(;;)
{
    Move DLL from build directory to execution directory
    Link to DLL using LoadLibrary() / dlopen() and fetch a pointer to function "foo()" from it
    for(;;)
    {
        Call the function "foo()" found in the dll
        Check the source of the dll for changes
        If it has changed, attempt to compile
        On succesfull compile, break
    }
    Unload DLL with FreeLibrary() / dlclose()
}

现在这似乎可行,但我不禁想知道还有哪些其他方法?这种方法与使用脚本语言相比如何?

编辑: https ://www.youtube.com/watch?v=MOvfn1p92_8&t=10m0s

4

3 回答 3

1

是的,“热代码修改”绝对是许多 IDE/调试器在某种程度上可以拥有的能力。这是一篇好文章:

这是 MSVS“编辑并继续”的手册页:

于 2013-04-01T20:38:16.953 回答
1

Epic 的热重载通过将游戏代码编译并加载为 dll/.so 来工作,然后由引擎动态加载。然后运行时重新加载只是重新编译库并重新加载,如果需要,状态存储和恢复。

有替代方案。您可以查看Runtime Compiled C++(或查看RCC++ 博客和视频),或者尝试我在 wiki 上列出的其他替代方案之一。

作为 Runtime Compiled C++ 的作者,我认为它有一些优势——重新编译的速度要快得多,因为它只编译你需要的代码,并且起点可以是单个 exe,所以你不需要为一个dll。然而,它确实需要一些学习和一些额外的代码才能让它工作。

于 2015-02-13T10:06:51.797 回答
0

C 和 C++ 都不需要提前编译,尽管通常的目标环境(操作系统、嵌入式系统、高性能数字运算)通常从 AOT 中受益匪浅。

完全有可能拥有一个 C++ 脚本解释器。只要它遵守标准中的行为,它就是 C++,而不是您建议的“骗局”。

也可以替换共享库,但要使其正常工作,您需要一种机制来序列化所有状态并在新版本下重新加载它。

于 2013-04-01T20:37:45.377 回答