0

我的问题非常复杂,可能是不可能的,但我们开始吧:

使用 C++,我目前正在为我的游戏项目开发通用服务器引擎。通用,因为引擎的每一部分都会在启动后动态加载。现在,游戏对象也将从基础对象继承并具有重载的“模拟”功能。这样,每个对象都会有它特定的行为,我可以做一些我称之为“C++ 脚本”的事情,这比解释的 lua 脚本文件快得多。它也更加动态。(请不要使用会杀死 c++“脚本”部分的解决方案,例如“忘记动态链接,这太疯狂了”。这种性能提升是完全必要的,因为我正在使用大型体素贴图)

我的问题:

这确实是很多.dll/ .so 文件,我想将它们打包到一个简单的存档中,这样我就可以在所述源代码上使用 zlib,并且可能将所有内容与纹理和声音一起打包在小的“对象包”中。现在 Windows DLL API 和 Linux SO API 不允许我从内存地址加载 dll/so 文件,这很可惜。(我就在那儿,还是可以绕过它?:))我不不想解压缩并将这些文件临时保存在文件系统上,因为它们有成百上千个,这会大大增加加载时间。此外,我对更多的外部依赖项(如 boost)不感兴趣。

所以这是我的问题:

是否有跨平台方法在内存中创建具有真实路径的虚拟文件?这样我就可以绕过 HDD 的慢 IO 速度。

或者使用临时文件真的没什么大不了的,因为现代操作系统的文件缓冲区足够快/足够智能,不会将所有这些文件写入磁盘?(其实Linux支持虚拟文件系统,但是windows不...)

我希望你们能在那里帮助我:)

4

1 回答 1

1

没有winapi,这是肯定的,但你可以手动完成。您可以将其加载到内存中,填充它的导入表并调用导出的函数(在调用 DllMain 之后)。我看到了一个程序,实际上有人使用该方法创建了一个新进程……有关详细信息,请参阅 PE 文档,但它确实有效。

而且它相对容易做,因为你只需要找到 PE 导入表,然后做动态链接器所做的事情,用跳转和地址填充它。Dlls 包含与位置无关的代码,因此不需要重定位。

It sould be the same on linux (only using the elf structure), but if you have a better solution with virtual file systems, you should use that.

于 2012-08-11T02:30:44.793 回答