Direct3D 程序中,避免不了对已有的资源进行修改,为了保证安全,就必须对资源Lock。不合理的LOCK会严重影响程序性能,一般LOCK需要等待COMMAND BUFFER前面的绘制指令全部执行完毕才能返回,否则很可能修改正在使用的资源,从LOCK返回到修改完毕UNLOCK这段时间GPU全部处于空闲状态,没有合理使用GPU和CPU的并行性。
。针对不同需要,可对Lock修饰如下的Flag:
D3DLOCK_DISCARD
D3DLOCK_DONOTWAIT
D3DLOCK_NO_DIRTY_UPDATE
D3DLOCK_NOOVERWRITE
D3DLOCK_NOSYSLOCK
D3DLOCK_READONLY
D3DLOCK_DISCARD,该标识通知设备丢弃旧的数据而返回新的指针。这对性能有好处,因为设备在读取旧的数据时不必暂停管线,即CPU LOCK无需等待GPU使用资源完毕,才能继续操作图形资源。
(注意:只适用于动态缓冲区。The application discards all memory within the locked region. For vertex and index buffers, the entire buffer will be discarded. This option is only valid when the resource is created with dynamic usage)
D3DLOCK_NOOVERWRITE,表示CPU只更新顶点缓存中的部分数据(没有提交给dp的数据),不像默认参数0那样需要等待绘制结束。在CPU写入的同时,GPU可以并行的对其他部分的顶点值进行DMA等操作,所以可以保证gpu和cpu协同工作,没有idle产生而高效。