D3D API的处理顺序如下:
程序调用API
windows把API解释为通用型处理指令
windows把指令填充到指令缓冲
windows检查指令缓冲是否满了,或者该指令具有强制执行命令
如果符合清理缓冲条件,windows进入"核心态",把指令交给显卡驱动,显卡驱动把windows通用指令翻译成为显卡指令,然后返回"用户态".
具有强制执行命令有(部分api,这里不全部举例):
创建vertexbuffer, indexbuffer,texture.
释放(release)vertexbuffer, indexbuffer,texture.
由"用户态"进入"核心态",把指令缓冲交给驱动,再由"核心态"返回到"用户态"就需要花费不少时间.所以,要尽量把缓冲填满再进行处理.
当渲染场景的时候调用某些函数,会导致潜在的性能障碍.例如,渲染过程中发现某个texture不需要了,此时调用texture->release(),导致windows强制清理指令缓冲,很有可能浪费大量时间.因为缓冲使用率可能还没有10%.
类似这些会引导系统强行清理缓冲的指令,应该在渲染前,或者渲染后再进行处理.提高渲染过程的缓冲使用率.
CPU,GPU不是同步工作的.类似如下代码:
device->SetStreamSource(pBuffer......);
device->DrawPrimitive(....);
pBuffer->Release();
能够保证无错运行,靠的就是上面的规则.Release()命令导致缓冲清空,所有命令都被顺序强制执行.