项目中遇到一个问题:使用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怎么知道越界与否?这个接口的内部是如何运作的?如果哪位高手知道的话烦请留言。