翻译自: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:
应用程序不能写这块缓存。这个选项让资源保存在非本地的格式,可以节省解锁时候的再压缩,可以提高锁定解锁效率。可以有效的提高程序的性能。