首页 > 代码库 > D3DLOCK详解

D3DLOCK详解

转自:http://blog.csdn.net/blues1021/article/details/41408419

 

翻译自:http://msdn.microsoft.com/zh-cn/library/windows/desktop/bb172568(v=vs.85).aspx

一个或者多个组合的锁定选项,用来描述资源锁定类型的表现。

D3DLOCK_DISCARD:

使用方式会强制为:D3DUSAGE_DYNAMIC。

应用程序将会丢弃锁定区域内的所有内存。CPU不会因锁定而等待,可以有效的提高程序性能。对于顶点和索引缓存,整个缓存都会锁定使用后被丢弃。这个选项只有对用

D3DUSAGE_DYNAMIC使用方式创建的资源是合法的。

 

  不合理的LOCK会严重影响程序性能,因为一般LOCK需要等待COMMANDBUFFER前面的绘制指令全部执行完毕才能返回,

否则很可能修改正在使用的资源,从LOCK返回到修改完毕UNLOCK这段时间GPU全部处于空闲状态,没有合理使用GPU和CPU的并行性,

DX8.0引进了一个新的LOCK标志D3DLOCK_DISCARD,表示不会读取资源,只会全写资源,这样驱动和RUNTIME配合来了个瞒天过海,

立即返回给应用程序另外块VM地址指针,而原指针在本次UNLOCK之后被丢弃不再使用,这样CPU LOCK无需等待GPU使用资源完毕,

能继续操作图形资源(顶点缓冲和索引缓冲),这技术叫VB IB换名(renaming)。

 

 

D3DLOCK_DONOTWAIT:

当显卡驱动没有能够马上锁定表面的时候,允许应用程序返回CPU循环。如果没有能够马上锁定,将会返回

D3DERR_WASSTILLDRAWING。这个锁定只能用在用CreateOffscreenPlainSurface, CreateRenderTarget,

or CreateDepthStencilSurface创建的表面,这个标记通常可以被后台缓存使用.

 

D3DLOCK_NO_DIRTY_UPDATE:

默认情况下锁定一个资源会添加脏区域,这个选项避免该资源的这个脏区域状态的任何改变。应用程序可以使用这个选项,

当它被锁定,在这个区域有额外的信息需要被更新的时候。也就是不是指定脏区域的才能改变。

 

D3DLOCK_NOOVERWRITE:

使用方式会强制为:D3DUSAGE_DYNAMIC,可以进行动态更新。

引入这个锁定标记是因为在渲染期间,用其它方式锁定了资源,该资源不能被更新。这个标记可以使用在当应用程序,需要将

资源数据append data附加到末尾的时候。需要说明的是,在这个资源正在使用期间锁定该资源显卡驱动会马上返回;

资源不在使用期间,显卡驱动必须去使用资源,使用完锁定函数才返回。

 

D3DLOCK_NOSYSLOCK:

默认的显存锁定需要保留一个系统内存的临界区域,保证在锁定期间没有显卡模式的改变会发生。这个选项让系统内存临界区域

不要在锁定期间被保留。

锁定操作室time consuming耗时的,但是可以让系统去做其它的事情,例如响应鼠标的点击。这个选项对于耗时比较长的锁定是

很有用的,例如用软件渲染方式锁定一块后台缓存,不然adversely不利于系统的响应。

 

D3DLOCK_READONLY:

应用程序不能写这块缓存。这个选项让资源保存在非本地的格式,可以节省解锁时候的再压缩,可以提高锁定解锁效率。可以有效的提高程序的性能。

D3DLOCK详解