今天看了DirectX SDK中的代码,有一个的方让我疑惑了半天:
VOID* pVertices;
if( FAILED( g_pVB->Lock( 0, sizeof(g_Vertices), (BYTE**)&pVertices, 0 ) ) )
return E_FAIL;
memcpy( pVertices, g_Vertices, sizeof(g_Vertices) );
g_pVB->Unlock();
一个将定点数据靠被到定点缓冲区的过程,为什么一定要进行一个Lock和Unluck呢?我们调用memcpy的意图是将定点数据copy到显存中去,SDK的解释是:This mechanism of locking and unlocking is required because the vertex buffer may be in device memory.也就是说定点缓冲去有可能是在物理内存而不是显卡显存中的.这样问题就来了.物理内存中存在着一个多线程的问题,就好像Double lock checking模式一样,显示的数据随时有可能被修改,而这有是绝对不允许的.
CreateVertexBuffer 的头两个参数告诉 Direct3D 新顶点缓冲区预计的大小和用法。紧跟的两个参数指定新缓冲区的矢量格式及存储位置。这里的向量格式是 D3DFVF_CUSTOMVERTEX,就是例程先前定义的 FVF 值。D3DPOOL_DEFAULT 标记告诉 Direct3D 在最合适的位置创建此顶点缓冲区。最后一个参数返回创建完成的顶点缓冲区对象地址.