百度做网站多,商城网站开发 价格,手机上制作网站的软件,传奇手游网页游戏平台现象#xff1a;以D3D_DISCARD方式来LockRect写入的显存数据在UnLock过后拷贝出来就崩溃#xff0c;在一些机器出现而在某些机器就不会出现。
解决#xff1a;判断游戏写纹理数据LockRect方式是D3D_DISCARD的话#xff0c;在UnLockRect写完数据过后#xff0c;就不对原来显…现象以D3D_DISCARD方式来LockRect写入的显存数据在UnLock过后拷贝出来就崩溃在一些机器出现而在某些机器就不会出现。
解决判断游戏写纹理数据LockRect方式是D3D_DISCARD的话在UnLockRect写完数据过后就不对原来显存数据进行拷贝操作。由于游戏只有在第一个纹理是这样写的而其他任何时候方式都是0所以不会影响我们之后对显存数据的拷贝从而进行逻辑操作。原因
从D3D对D3D_DISCARD的解释说得通即D3DLOCK_DISCARD表示不会取资源只会全写资源这样能立即返回给应用程序另外块显存地址指针而原指针在本次UNLOCK之后被丢弃不再使用。
而引进D3D_DISCARD目的在于一般LOCK需要等待COMMAND BUFFER前面的绘制指令全部执行完毕才能返回否则很可能修改正在使用的资源从LOCK修改完毕到UNLock这段时间GPU是空闲的于是为了解决空闲而引入这个标志。这样在GPU继续处理旧数据的同时我们程序可以修改lock出来的新数据在unLock过后GPU自动丢弃原数据从而使用我们修改过的新数据。由于在我们程序中是在UnLockRect过后然后对原来的显存数据进行操作而这些数据是丢弃的原数据可能在一些机器上会被销毁进行访问操作就会出现这个问题。在解决问题过程中发现一些有用的知识点
D3DPOOL_DEFAULT 在显存中创建对象这里的显存包括真正的显存和AGP内存配合使用D3DUSAGE_WRITEONLY标记会提高效率而提高效率的原因是DEFAULT资源可能在VM或AM中如果在VM中必须在系统内容中开辟一个临时缓冲返回给数据当应用程序将数据填充到临时缓冲后UNLOCK的时候RUNTIME会将临时缓冲的数据传回到VM中去如果资源D3DUSAGE属性不是WRITEONLY的则系统还需要先从VM里拷贝一份原始数据到临时缓冲区。
当设备丢失不可恢复因为没有备份。
使用场景游戏中使用的光标贴图因为游戏运行会一直使用所以创建到显存。
如果使用D3DPOOL_DEFAULT再加上 D3DUSAGE_DYNAMIC那么系统就会强制把对象创建到AGP中。AGP本身就是内存的一部分程序访问起来和内存对象没有什么区别而且GPU访问的时候速度还很快所以适合于创建频繁更新的数据可能最多的是渲染到贴图的贴图对象。
使用场景粒子系统
另外D3DPOOL_DEFAULT是不能Lock的除非是动态的。D3DPOOL_MANAGED 在显存中创建对象同时在内存中创建一个备份。
当设备丢失可恢复。因为有备份。D3DPOOL_SYSTEMMEM 只在系统内存中创建对象。 D3D_DISCARD和D3DLOCK_NOOVERWRITE的区别
[注解因为CPU和GPU是异步的操作所以当CPU通过系统总线和GPU同步时需要等到GPU把当前的工作做完。例如当GPU正在对一块缓存进行DMA操作时但往往CPU并不对GPU操作的那块缓存进行操作所以CPU可以和GPU一起工作。当不指定操作标志时CPU等待GPU完成绘制工作才更新顶点缓存所以低效。如果指定D3DLOCK_NOOVERWRITE表示CPU只更新顶点缓存中剩余的缓存不考虑是否有其他图形绘制是正在使用这个的缓冲区段绘制图形强制更新那段缓存并返回而不像默认参数0那样等待前面的绘制结束而不更新已经写入的顶点值所以在CPU写入的时候GPU可以并行的对那些已经存在的顶点值进行DMA等操作所以高效如果使用D3DLOCK_DISCARD 标志说明当前分配的缓存大小不够了需要重新使用缓存CPU对这些新分配的缓存区域进行写操作GPU这时可能还在异步处理旧的缓存区所以这种调用也是高效的。调用完毕收回释放的缓存。]