abmfamfam 发表于 2010-5-13 06:48

無聊開帖.D3D的

D3D Failed! in E:NovaProjectLiteHookHookDx9HookDx9.cpp, 1852
m_pRHWVB->Lock(0, RHWVB_MAXVERTEXCOUNT*sizeof(CUSTOMVERTEXRHW),(void**)&pVertices, D3SLOCK_DISCARD)
D3D是已定义的供程序员使用的D3D接口和函数的集合。这些接口和函数代表了当前版本的D3D所支持的全部特性集。注意:仅仅因为D3D支持某种特性,并不意味着你使用的显卡会支持它。
在D3D和图形设备之间有一层中介——叫做硬件抽象层(HAL,Hardware Abstraction Layer)。D3D不能直接作用于图形设备,因为现在市面上的显卡种类实在是太多了并且每种显卡都有不同的性能和处理事件的方式。例如,两种不同的显卡实现清屏的方式也可能是不同的。因此,D3D要求设备制造商实现HAL。HAL是一组指示设备执行某种操作的特殊设备代码的集合。用这种方法,D3D避免了必须去了解某个设备的特殊细节,使它能够独立于硬件设备而存在。
设备制造商在HAL中实现他们的产品所支持的所有特性。HAL将不会实现那些D3D支持但硬件产品不支持的特性。调用一个HAL中没有实现的D3D的函数将会出错,除非它是顶点处理操作,因为这个功能可以由软件模拟来实现。因此当使用某些仅由市面上少数显卡所支持的高级特性时,必须检测一下设备是否支持。
D3SLOCK_DISCARD
在程序中,我们用D3DDEVTYPE_HAL来定义HAL设备,它是D3DDEVTYPE枚举类型的一个成员。同样的,REF设备则由D3DDEVTYPE_REF来定义,它也属于D3DDEVTYPE枚举类型。这个类型很重要,因为在创建设备的时候需要指定它。

如果使用DYNAMIC标志创建缓存 (使用D3DUSAGE_DYNAMIC创建的缓存) ,并且D3DUSAGE_WRITEONLY 不被使用, 缓存被分配到AGP 缓存中。(CPU从AGP缓存中读取的速度比显存中快,但比内存慢,是个很好的折中)
如果没有足够的显存,顶点缓存被分配到AGP缓存中;如果AGP缓存也不够时,创建失败,除非使用POOL_ MANAGED 创建。在这种情况下,D3D的运行库会释放足够多的显存,用来创建顶点缓存,并在内存中保存创建的缓存的一个拷贝。那些被运行库释放的显存,在需要它们时可以从内存中复制到显存中。注意标志POOL_ MANAGED 并不被发送到驱动程序,因为这是D3D的附加的功能。

对于NV1X 系列的GPUs, 在进行多数据流渲染得时候,如果有一个顶点缓存位于AGP缓存中,所有的其他位于显存中的顶点缓存会被移动到AGP缓存中。?

当" locking vertex buffers_锁定顶点缓存"时:

如果顶点缓存的创建标志是POOL_DEFAULT:?

如果没有指定任何标志,程序将被暂停,因为它强制程序和GPU同步操作。->低效


注解:因为CPU和GPU是异步的操作,所以当CPU通过系统总线和GPU同步时,需要等到GPU把当前的工作做完。例如,当GPU正在对一块缓存进行DMA操作时,但往往CPU并不对GPU操作的那块缓存进行操作,所以CPU可以和GPU一起工作。当不指定操作标志时,CPU等待GPU完成绘制工作才更新顶点缓存,所以低效。如果指定D3DLOCK_NOOVERWRITE,表示CPU只更新顶点缓存中剩余的缓存,不考虑是否有其他图形绘制是正在使用这个的缓冲区段绘制图形,强制更新那段缓存并返回,而不像默认参数0那样等待前面的绘制结束,而不更新已经写入的顶点值,所以在CPU写入的时候,GPU可以并行的对那些已经存在的顶点值进行DMA等操作,所以高效;如果使用D3DLOCK_DISCARD 标志,说明当前分配的缓存大小不够了,需要重新使用缓存,CPU对这些新分配的缓存区域进行写操作,GPU这时可能还在异步处理旧的缓存区,所以这种调用也是高效的。调用完毕,收回释放的缓存。]

m_pRHWVB->Lock

如果缓冲区开的足够大,render 几帧才能使用完这个缓冲。可以一直使用NOOVERWRITE 就可以。当不够使用时在从头开始使用这个顶点缓冲。如果足够大。开头的顶点基本确定已经画完(都是前几帧的图形顶点内容了。被覆盖也无所谓),如果缓冲很小lock时可以调用DISCARD,表示丢弃缓冲区内容(被丢弃的内容如果在使用中还可以被GPU继续使用。

dsw0001 发表于 2010-5-13 07:38

完全没看明白能在简单点不直接说改什么得到什么效果不就行了嘛

坏糖糖 发表于 2010-5-13 08:34

字真多...没有看下去的动力了..不过还是顶了

xic 发表于 2010-5-13 14:38

貌似我出現这个错误了,但是看不懂

cenwenan 发表于 2010-5-13 15:31

专业向的问题,看到眼花缭乱的,我晕

henny 发表于 2010-5-13 16:53

作家为何不直接说怎么改涅?

cwjohnny 发表于 2010-5-13 17:24

沒有寫明解決方法嗎?

aftera2008 发表于 2010-5-13 17:56

技术贴?

小白顶一下吧

cysjd 发表于 2010-5-13 18:28

那你的结论呢?别光从网上拽一段过来就没下文了……

abmfamfam 发表于 2010-5-14 03:37

只有一點.
D3DFailed.的出現多是没有足够的显存,顶点缓存被分配到AGP缓存中;如果AGP缓存也不够时,创建失败
所以高級電腦比較少出現.
即時漢化只是加大了問題.
改善的方法
1 升級電腦
2 減小显存的消耗
3 加大電腦的使用效率

paradise20 发表于 2010-5-14 06:17

楼主发的开方,可是偶还刚学加减法。。

bluescreen 发表于 2010-5-14 10:06

说白了,还是那句话,调理好系统。MOD多了,游戏里不要跑太快,汉化了室外F11。没什么可跳的

abilou 发表于 2010-5-22 13:14

我用視窗模式玩就沒有再出現過了@@
页: [1]
查看完整版本: 無聊開帖.D3D的