» 您尚未登录:请 登录 | 注册 | 标签 | 帮助 | 小黑屋 |


发新话题
打印

[其他] 不知道什么是“虚拟内存”,我就来教育下。(Update)

俺在某索系主机上几个游戏项目里做过优化,以前也跟ff神“交手“过,这里只说一些可能大家都知道的事情,以及我对ff神所说的“虚拟内存”的个人理解:

1. 我们对待时间的优化都会追求极致,因为游戏里的一帧只在几十毫秒里发生,所以储存器速度逐级下降给我们带来了很大的不便:
1) 编译器在能不用内存的时候都不会去用,只用寄存器,譬如叶子函数里的局部变量。这一般叫做register allocation optimization。
2) 用主存的时候,一种推荐的做法就是cache coherency,就是保证指令和数据缓存的命中率足够高。这就是为什么遍历两维数组的时候总是每个子数组一起遍历。
3) 没有需要的时候,尽量不在游戏非loading过程中读取外部设备(光驱,硬盘)。的确需要读取的时候,也只能通过异步读取来解决,因为IO操作是中断请求嘛^_^ 只要IO操作所需要的数据并非即时必须(譬如GTA类游戏中即将但仍未需要使用的远处的场景),这就不是大问题
4) 读取外部设备的时候尽量消灭可能的磁头或光头寻道,否则带来的数十或者数百毫秒的寻道时间将会直接影响游戏性能。

如果是传统Windows意义上的虚拟内存的话,那就没有什么意义。用户态程序在访问某个虚拟内存地址的时候发生缺页中断,操作系统去读取硬盘上该程序该虚拟地址页上数据并存入物理内存的某个地址——而且这一段过程还必须是阻塞(blocking)的,因为程序很可能需要立刻操作该虚拟地址上的数据。无论是光驱还是硬盘,寻道时间加上读取时间都需要至少数十毫秒。如果缺页中断十分频繁的话,游戏中的程序跑一帧,可能就有几十次缺页中断,这样游戏的帧数就会变得很低。这种情况前面很多朋友都有类似经历。

多任务操作系统里用虚拟内存,是为了解决多任务共同进行时候的内存问题,然而在单进程的游戏机上并没有这个必要,而且系统调用和系统程序(譬如PS系的home键菜单或者XO的西瓜键菜单)都可以不需要使用。举个例子吧,MIPS系统上的用户态地址是0x00000000 - 0x7FFFFFFF。内核态的地址在这之上,是可以通过简单的与或操作对应到物理地址的。用户态地址则是通过MMU转换。但是PSP上同时只有一个用户态程序——就是你自己在玩的游戏——在跑,系统调用和系统线程都是在内核态之下。

FF神以前跟我解释过他所谓的”虚拟内存“概念,但很可惜,我认为他所说的在Xbox360上已经以HDD cache,即用户态程序自我管理的磁盘缓存而非操作系统管理的形式存在了。但是Xbox360这么做,主要还是为了避免光盘寻道这个最吃时间的怪物,所以目的上有些区别……PS3由于硬盘容量较大而且是标配,因此很多游戏都强制硬盘安装,也是为了避免光盘读取的问题。

[ 本帖最后由 Ophelia 于 2009-6-24 21:53 编辑 ]


本帖最近评分记录
  • Lucifer6E 激骚 +1 精品文章 2012-10-19 11:13

TOP

”因为游戏中毕竟还有很多信息是对实时性要求不那么高的。“

对实时性要求低的数据,往往都可以通过预处理,作为普通的存在于硬盘上的文件读取进内存里直接使用。这也是用户程序实现的功能,和操作系统毫无关系。建议ff神去看看序列化(serialization)相关的资料……

既然实时性要求低,那就和操作系统虚拟内存的本意以及实现方式相违背,也就不能称之为虚拟内存了。我建议ff神再看清楚一下我前面所说的话。



TOP

引用:
原帖由 ffcactus 于 2009-6-24 22:22 发表

至少可以防止某些情况下系统提示内存足死机或蓝屏吧,莫非这些主机上的游戏都不动态申请内存?或者全由开发人员把握? 另外我认为操作系统实现虚拟内存不是为了“实时”,而是为了“可行”。
当然全部都是由开发人员把握的,游戏中每一部分用多少内存都会有严格的把关,也就是memory budgeting。就算是PC游戏,都有严格的memory budget,同样是为了防止不必要的缺页中断。

“可行”?那我告诉你这个吧。帧数高低和稳定与否,是会影响到游戏提交给第一方审查的时候的成功率的。Sony宁愿你少用点内存以求稳定(因为碎片也会影响内存系统的性能甚至导致内存分配失败),都不愿意看到帧数不稳定。


TOP

啊,欢迎模拟器白神莅临本帖!

TOP

http://en.wikipedia.org/wiki/Virtual_memory
http://zh.wikipedia.org/wiki/%E8%99%9A%E6%8B%9F%E5%86%85%E5%AD%98

那些需要快速一致响应的嵌入式系统和其他的特殊应用的计算机系统可能会因为决定论而选择不使用虚拟内存。
Embedded systems and other special-purpose computer systems which require very fast and/or very consistent response times may choose not to use virtual memory due to decreased determinism.

(determinism在游戏里的典型可能就是格斗游戏和Quake类联机游戏了

[ 本帖最后由 Ophelia 于 2009-6-26 20:48 编辑 ]

TOP

发新话题
     
官方公众号及微博