D3DLOCK写纹理遇到的问题

现象:以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这时可能还在异步处理旧的缓存区,所以这种调用也是高效的。调用完毕,收回释放的缓存。]

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499637.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

去除ring3层的Debug标志

_asm{mov eax, fs:[0x18]mov eax, [eax0x30]mov dword ptr ds:[eax],0}

2011工作总结

1、编码能力 代码实践中,开始注重模型的概念。所谓模型打个比方:要做一台电视机,首先搞清楚你想怎么使用它,目的是让它看起来更方便易用。根据常规经验判断,电器需要电源、需要信号,这两点是必不可少。OK&a…

逆向调试完成端口回包实践总结

大概描述下完成端口的原理 一个套接字可以对应多个overlapped, 每个overlapped都由相应的一个线程来处理。而WSARecv绑定好了一个OVERLAPPED,WSARecv的调用会通知数据即将到来,同时将会触发某线程中的GetQueuedCompletionStatus函数调用完成,…

编码问题

从XML读进来的UTF8编码需要转一次到宽字符,宽字符再转化成窄字符。 在中文系统下面读中文,没问题。 但读韩文的时候,第二步就会出现丢失现象。 所以在国际化中,最好都统一用宽字符编码

zeromq

使用zeromq注意context是多个socket的集合。 频繁删除创建context会产生异常,估计是zeromq的bug,待分析

静态添加DLL

LordPE 这个工具能够直接静态添加DLL,这下更方便了具体步骤:1. 点击PE编辑器,打开要添加的exe2. 进入目录表,选择输入表一项,点击省略号3..进入添加DLL界面。选择要添加的DLL。dll必须有一个导出函数添加即可,最后保存

区块链读书笔记一

区块链的本质就是交易各方信任机制建设的一个完美方案。 为什么是完美方案,原因 其一:是用纯数学方法来解决信任机制。 其二:不需要借助任何第三方结构。 其三:建立信任关系的成本几乎降到了零。 关于区块链问题,这…

区块链读书笔记二

“双花”问题,在区块链加密技术出现之前,加密数字资产和其他数字一样,具有无限复制性,如果没有一个中心化的机构,则我们没有办法确认一笔数字现金是否已经被花掉。在交易中一个可以信赖的第三方会保留甲乙总账从而保证…

区块链读书笔记三

区块链货币未来的完善分三个层面: 用户层面:区块链加密技术需要用户都要保存好自己的私钥,这涉及一个问题,若私钥丢失了,那意味着你的比特币也丢失了。这时候并没有第三方机构来为你进行密码恢复或找回私钥。 商户层面…

区块链读书笔记四

区块链对大规模协作产生的影响 对区块链未来的前景的兴奋点在于,极高的生产力会将这个星球上所有的人和机器都连入一个全新的网络,也许到了21世纪下半夜,资本主义走向没落,区块链去中心化协同共享将取而代之,每个人都有…

模拟网页行为之工具篇

模拟网页行为最常见的包含模拟网页登陆,模拟提交表单,甚至可以拒绝网页第三方安全软件的加载等一些更酷的行为,这种行为不仅仅是减少了一些非常枯燥重复的过程,更重要的是提升了商业行为中的效率,甚至会给你直接带来金…

模拟网页行为之工具篇二

先说360浏览器,打开开发者选项,可以看到界面提供了几个功能选项,如图: 这个图片的第一个搜索图标点中过后,再去选中网页你感兴趣的部分就可以在Element选项中跳转到你感兴趣的代码。也可以直接ctrlF2搜寻你感兴趣网页元…

模拟网页行为之实践篇

无论是模拟网页点击还是直接协议发包,都有其适用的环境。不同的需求选择不同的方案。如果只是简单的获取类似网页IP地址的需求,实际上协议发包是最简单的。但如果是用户名网页登陆等稍微复杂的登陆要求,则直接填写表单,并获取按钮…

模拟网页行为之实践篇二

在模拟网页行为中,最常用的就是提交表单了,其次就是获取验证图片数据,再次hook网页中的js代码的实现。 先说具体的应用场景,简单的场景,如填写用户名密码登陆,这里就涉及到获取表单,填写表单数据…

模拟网页行为之实践篇三

现在来谈下验证码图片的获取方式,带有验证码的地方都会附带有个刷新按钮,而刷新按钮的地方就是获取验证码网址代码。如果看过前面写的《模拟网页行为之工具篇》就会很容易定位到代码位置。定位到代码位置后看下图: 基本可以看到的是获取验证码…

调试某游戏副本中的加亮提示信息思路

对于经常玩游戏的人比较容易知道,在副本里面,当进行到某个步骤或者当队员站位触发某个情景时,游戏界面中央会出现字体提示字符,可能是BOSS跟你的对话也有可能是游戏给你的下一步提示。让我们分析下,这个情景到底是本地…

RC4算法实现

1、密钥流:RC4算法的关键是根据明文和密钥生成相应的密钥流,密钥流的长度和明文的长度是对应的,也就是说明文的长度是500字节,那么密钥流也是500字节。当然,加密生成的密文也是500字节,因为密文第i字节明文…

模拟网页行为之实践四

这篇谈下c如何hook网页中的JS函数,即网页可以执行我们修改的JS函数。 相应的步骤可分为: 1.找到需要修改函数的时机。 2.得到需要修改函数的com对象。 3.将我们新的com对象替换修改函数。 第一步,找到需要修改函数的时机,在谈…

SHA-256算法实现

SHA-256 算法输入报文的最大长度不超过2^64 bit,输入按512-bit 分组进行处理,产生 的输出是一个256-bit 的报文摘要。该算法处理包括以下几步: STEP1:附加填充比特。对报文进行填充使报文长度与448 模512 同余(长度…

RSA算法演绎

RSA是第一个也是使用的最广发的公钥加密算法,在1978年由R.Rivest、AdiShamir和Adleman三人发明,并以他们的名字命名。RSA算法的安全性基于大数因子分解的困难性,下面介绍一下它的基本原理: 1、生成公钥和私钥 (1) 选取两个大素数…