|
|
这个问题是这样的: 众所周知,一个win32进程最多只有2G的地址空间可以访问. 而现在的显存容量越来越大, 假如一个显卡有2G的显存,那么,就单单一个显存就把内存映射占用完了,没有了地址空间, 那这个游戏程序如何运行?其它的程序又如何运行?
经反复查考, 结论如下,不知是否准确,还请各位确认一下:
(1)显存是显卡自带的临时存储器件,它和windows的内存管理基本上没有任何关系。windows的内存管理是面向内存条的。也就是说,显存容量是1G还是2G,都不占用物理地址空间。
(2)显存只提供16M的帧缓存供windows的ROM映射机制使用,映射到系统内存显示区。(有兴趣者可以自查MMIO映射)
(3)AGP、HyperMemory、TurboCache等技术,可以划分若干物理内存当显存来使用。
(4)不管是真正的显存,还是AGP显存,它们在使用时都不能通过mov指令直接访问。应该通过DirectX调用相关Buffer的Lock()函数,将显存临时映射到一段内存空间上来访问。每次用完unlock()后,相关虚拟地址又解放出来的. 由于场景是分批次渲染,再大的场景,每次有几百M内存地址供你临时锁定用,是足够了.
(5)由于win32的进程限定在2G内存地址空间,所以,游戏程序每次最多可以锁定2G的显存。当然在现在游戏里,不可能有这么一个场景同时动用2G显存纹理。
|
|