今天看了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模式一样,显示的数据随时有可能被修改,而这有是绝对不允许的.