DirectX3D中LockRect接口使用注意事项

  项目中遇到一个问题:使用D3DXCreateTexture( pDevice, nWidth, nHeight, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM,&pCreateMemTexture);在内存中创建了一个Texture,然后调用pCreateMemTexture->LockRect()锁定其内存,并更新其内容。在程序退出时调用pCreateMemTexture->Release()时程序Crash掉,并且有时死的地方还不一定是Release,而是使用这个Texture的某一个DirectX3D函数中,找了好长时间,发现是由于在LockRect()后更新其内存时越界造成的,修改后一切Ok!

  关于LockRect()函数,个人认为如下两点需要注意:

  1.D3DLOCKED_RECT *pLockedRect参数中的Pitch,这个值指定的是待锁定纹理的宽度,而不是你锁定后的内存块的宽度,比如有一张1920*1080大小的纹理,使用RECT(0,0,800,600)的参数调用LockRect接口,Pitch的值是1920,而不是800,并且这个Pitch的单位是Byte,所以如果如果你的纹理格式为ARGB的话,这个值应该乘以4,这个一定要注意,否则容易造成后续处理出错。

  2.LockRect()函数返回的pLockedRect->pBits在结尾处没有fd fd fd fd的内存结束标志,这个和普通new出来的不一样,所以想通过查看这个标志确定是否越界是无法做到的,这里我就有个问题不太明白了,如果没有这个标志的话release的时候DirectX怎么知道越界与否?这个接口的内部是如何运作的?如果哪位高手知道的话烦请留言。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值