3

我正在编写一个可编写脚本的游戏引擎,为此我有大量执行各种任务的类。引擎的大小正在迅速增长,因此我想到将大型可执行文件拆分为 dll 模块,以便仅包含游戏编写者实际使用的组件。当用户编译他们的游戏(也就是说他们的脚本)时,我希望正确的 dll 成为最终可执行文件的一部分。我已经有相当多的覆盖数据,所以我想我也许可以将 dll 存储为这个块的一部分。我的问题归结为:

是否可以欺骗 LoadLibrary 以某个偏移量开始读取文件?这将使我不必将 dll 提取到一个不干净的临时文件中,或者完全取消自动包含 dll 并简单地指示我的用户将 dll 与他们的游戏一起打包。

最初我想采用“从内存中加载 dll”的方法,但出于可移植性的原因拒绝了它,只是因为它看起来像一个可怕的 hack。

有什么想法吗?

亲切的问候,

菲利普·班尼法尔

4

2 回答 2

2

您正在尝试解决一个不存在的问题。加载 DLL 实际上不需要任何物理内存。Windows 为 DLL 内容创建内存映射文件。只有当您的程序调用该代码时,DLL 中的代码才会被加载。除了保留的内存页面,未使用的代码不需要任何系统资源。在 32 位操作系统上,你有 20 亿字节的价值。您必须编写大量代码才能全部使用它们,50 兆字节的机器代码已经是一个非常大的程序。

内存映射也是你不能让 LoadLibrary() 做你想做的事情的原因。没有你需要的现实场景。

查看链接器的 /DELAYLOAD 选项以提高启动性能。

于 2011-06-19T16:48:47.343 回答
1

我认为该任务的每个解决方案都是“可怕的黑客”,仅此而已。

我看到的最简单的方法是创建您自己的虚拟驱动器,该驱动器提供自定义文件系统并将系统访问路径从一个真实文件(编译您的库)到多个单独的 DLL-s。例如像TrueCrypt一样(它是开源的)。并且您可以LoadLibrary在不更改的情况下使用功能。

但我认为唯一正确的方法是改变你的任务,不要使用这种方法。我认为您需要使用结构、指针等创建自己的脚本解释器和编译器。

主要的是我不明白你从使用库中的好处。我认为当前任何编译的代码都没有那么重,并且可能包装得很好。任何其他资源都可以在第一次调用时动态加载。您需要做的就是以正确的方式组织脚本引擎所有组件的工作周期。

于 2011-06-19T13:55:11.760 回答