DirectX3D中LockRect接口使用注意事项
2012-11-07 10:16
483 查看
项目中遇到一个问题:使用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怎么知道越界与否?这个接口的内部是如何运作的?如果哪位高手知道的话烦请留言。
关于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怎么知道越界与否?这个接口的内部是如何运作的?如果哪位高手知道的话烦请留言。
相关文章推荐
- HBase Thrift 接口的一些使用问题及相关注意事项
- Delphi7中接口使用的注意事项与原因
- 使用HBase Shell 接口的注意事项
- Z-TEK USB转422接口问题 RS422接口常见使用注意事项
- (webservice,ajax,jmail)Tip:动态调用webservice,ajaxpro的使用要点以及使用jmail接口使用注意事项
- .NET中lock的使用方法及注意事项
- 基于HBase Thrift接口的一些使用问题及相关注意事项的详解
- 针对java初学者的java接口使用的注意事项
- .NET 中接口使用时的注意事项
- .NET 中接口使用时的注意事项
- lock与synchronized使用中的注意事项(持续补充)
- C#多线程编程之:lock使用注意事项
- 使用C++实现JNI接口需要注意的事项
- 基于HBase Thrift接口的一些使用问题及相关注意事项的详解
- 使用 curl 调接口时需要注意事项
- Java类集 _Map 接口的使用注意事项
- HBase Thrift 接口的一些使用问题及相关注意事项
- VC用Ado接口连接和使用数据库及注意事项
- java.util.List接口的方法subList()的使用注意事项
- java.util.List接口的方法subList()的使用注意事项