因此,我阅读了约翰·卡马克( John )在Gamas胞的采访,他在采访中谈到了他所说的“生活在内存映射文件中的实时C++对象”。以下是一些名言:
JC:是的。我从中得到了很多好处.在上一个iOS Rage项目中,我们附带了一些新技术,它使用一些聪明的东西来制作生活在内存映射文件中的实时C++对象,在这里的闪存文件系统支持下,这就是我想要构建我们未来在PC上的所有工作的方式。
..。
我在这里向我自己下达的命令是,我希望在我们的PC平台上有2秒的游戏负载,这样我们就可以更快地迭代。现在,即使是固态驱动器,你也被你在加载时所做的所有事情所支配,所以它需要不同的规则才能说“所有的东西都将被抽取并在相对地址中使用”,所以你只需说,“映射文件,我所有的资源都在那里,它在15毫秒内完成。”
(完整的面试可以找到这里)
有谁知道卡马克在说什么,你会怎么安排这样的事情吗?我在网上搜索了一段时间,但似乎找不到任何东西。
发布于 2011-08-23 10:05:45
其思想是,通过内存映射访问整个或部分程序状态,使其在任何时候都序列化为一个文件。这将要求您不具有通常的指针,因为指针只有在进程持续时才有效。相反,您必须从映射开始存储偏移量,以便当您重新启动程序并重新映射文件时,您可以继续使用它。这种方案的优点是您没有单独的序列化,这意味着您没有额外的代码,并且您不需要一次保存所有的状态-相反,您的(全部或大部分)程序状态在任何时候都由文件支持。
发布于 2011-08-23 10:07:11
您将使用新的位置,直接或通过自定义分配器。
看看EASTL实现(子集) STL,它特别适合于与自定义分配方案(例如运行在嵌入式系统或游戏控制台上的游戏所需的)良好地工作。
EASTL的一个自由子集在这里:
发布于 2011-08-23 10:37:13
多年来,我们使用一些我们称之为“相对指针”的东西,这是一种智能指针。它本质上是不标准的,但在大多数平台上工作得很好。它的结构如下:
template<class T>
class rptr
{
size_t offset;
public:
T* operator->() { return reinterpret_cast<T*>(reinterpret_cast<char*>(this)+offset); }
};这要求所有对象都存储在同一个共享内存中(也可以是文件地图)。它通常还要求我们只在其中存储我们自己的兼容类型,以及需要编写自己的分配器来管理内存。
为了始终拥有一致的数据,我们通过COW mmap技巧使用快照(这些技巧在linux上的用户空间中工作,而不知道其他OSs)。
随着大迁移到64位,我们有时也只使用固定的映射,因为相对指针会导致一些运行时开销。对于通常为48位的地址空间,我们为应用程序选择了一个预留的memry区域,我们总是将这样的文件映射到该区域。
https://stackoverflow.com/questions/7159271
复制相似问题