用于动态链接的虚拟文件
Virtual Files for dynamic linking
我的问题非常复杂,可能是不可能的,但我们来了:
使用C++,我目前正在为我的一个游戏项目开发通用服务器引擎。通用,因为引擎的每个部分在启动后都会动态加载。现在,游戏对象也将继承自基本对象,并具有重载的"模拟"功能。这样,每个对象都会有它的特定行为,我可以做一些我称之为"C++脚本"的事情,这比解释的lua脚本文件快得多。此外,它更具动态性。(请不要使用会杀死 c++ "脚本"部分的解决方案,例如"忘记动态链接,这太疯狂了"。这种性能提升是完全必要的,因为我正在使用大型体素地图)
我的问题:
这确实是很多 .dll/.so 文件,我想将它们打包到一个简单的存档中,这样我就可以在所述源代码上使用 zlib,并且可能将所有内容与纹理和声音打包在小"对象包"中。现在Windows DLL API和Linux SO API不允许我从内存地址加载dll/so文件,这是一种耻辱。(我就在那里,还是我可以绕过它?:) )我不想解压缩并临时将这些文件保存在文件系统上,因为有数百到数千个文件,这将大大增加加载时间。我也对更多的外部依赖项(如 boost)不感兴趣。
所以这是我的问题:
是否有跨平台的方法可以在具有真实路径的内存中创建虚拟文件?这样我就可以绕过硬盘的慢 IO 速度。
或者使用临时文件真的没什么大不了的,因为现代操作系统的文件缓冲区足够快速/智能,不会将所有这些文件写入光盘?(实际上Linux支持虚拟文件系统,但Windows不支持...
我希望你们能在那里帮助我:)
不是使用 winapi,这是肯定的,但您可以手动完成。您可以将其加载到内存中,填充其导入表并调用导出的函数(在调用 DllMain 之后)。我看到一个程序,有人实际上用这种方法创建了一个新进程......有关详细信息,请参阅 PE 文档,但它有效。
此外,这相对容易做到,因为您只需要找到 PE 导入表,并执行动态链接器执行的操作,用跳转和地址填充它。Dlls 包含与位置无关的代码,因此无需重新定位。
在 linux 上也是如此(仅使用 elf 结构),但是如果您有更好的虚拟文件系统解决方案,您应该使用它。
- C++无法定义虚拟函数 OUTER 类和头文件
- main.cpp从 .h 文件调用公共虚拟方法
- 如何在 VSCODE 中构建、运行和删除可执行文件和虚拟文件
- Pimpl习惯用法、单独的接口/实现文件和多个虚拟继承.如何
- cpp文件中的纯虚拟接口实现
- 在技术上是否可以创建 Java 虚拟机的映像文件并使用它来更快地启动 Java 应用程序
- Windows本身是否有虚拟或临时文件系统
- 当包含具有虚拟方法的标头时,不确定如何在.cpp文件中设置方法
- 如何在 CLANG 中创建用于代码完成的虚拟文件
- 覆盖虚拟函数不起作用,头文件和C ++文件
- 用于动态链接的虚拟文件
- 一次从虚拟文件中读取 4 个字节
- 如何创建文件路径可以像磁盘一样访问的虚拟文件系统
- 虚拟文件系统列表
- 如何使用QFileDialog打开虚拟文件夹
- 在虚拟文件系统中运行进程
- 如何在Windows通用文件对话框中显示API填充的虚拟文件夹
- C++访问由 Bash 进程替换创建的"虚拟文件"
- 如何使用C++在Windows中添加虚拟文件夹
- 如何将“std::string”放入 Clang 虚拟文件中