Posted on 2011-02-22 22:06
小火球 阅读(624)
评论(0) 编辑 收藏 引用 所属分类:
D3D
资源锁定意味着能通过CPU来访问该资源。锁定选项有以下几种:
D3DLOCK_DISCARD, D3DLOCK_READONLY, and D3DLOCK_NOOVERWRITE 等,但是只有这三种是经常使用的。运行时并不会
检查应用程序是否遵循了制定的锁定标记所规定的访问方式。也就是说,当指定了D3DLOCK_READONLY后,再去写资源操作,会得到意外的结果,但不会提示是由于写操作导致出错。所以,如果在实际资源访问时的操作与锁定选项相矛盾的话,则无法保证以后的释放操作会成功或发生显著的性能损失。
同时只能对纹理资源加一把锁。在对表面进行锁操作时,不能对该表面进行任何其他的加速操作。
对顶点 buffer 和 索引 buffer资源可以同时加几把锁,但是必须保证加解锁数配对。
资源管理就是把系统内存中的内容提交到显存或者把显存中的内容剔除掉的过程。
Direct3D run time 有自己的管理算法 least-recently-used priority 技术。当检测到在一帧中需要同时共存的资源要多与显存限制时,
d3d就会切换到 most-recently-used priority 技术。
创建资源时使用 D3DPOOL_DEFAULT 标记,意味着资源被放在最合适该资源的存储区。经常会被放在显存或AGP中。在defalut pool
中的资源在设备丢失后要被全部释放,在设备重建后要全部恢复。
创建资源时使用D3DPOOL_MANAGED 标记,即该资源是托管资源,该资源在设备丢失后还继续存在,该资源同时存在于内存和显存中,当需要显示时,由内存拷贝到显存中。但是当设备被销毁或重新create 时,所有的资源都会被释放和重建。
d3d所谓的资源管理,是针对 D3DPOOL_MANAGED 来说的。对于顶点buffer和索引buffer不建议使用 D3DPOOL_MANAGED ,即不建议使用d3d默认的资源管理,因为 D3DPOOL_MANAGED 标记的资源会在系统内存中存在备份,而顶点buffer和索引buffer如果使用D3DPOOL_MANAGED 来创建,该类缓冲的特点要求会在系统内存和显存之间进行大量频繁的数据拷贝,会极大的影响性能。所以这两种buffer建议使用 D3DPOOL_DEFAULT 结合 D3DUSAGE_DYNAMIC 来使用。
另外还有一种情况是不能使用 D3DPOOL_MANAGED 的,那就是创建作为 RenderTarget 的纹理时,如果该种纹理被标记为了托管,意味着该纹理在内存中存在了备份,在渲染期间,它的内容就会在系统内存和显存之间产生大量的数据交换,造成极大的性能损失。因此,renderTarget 的纹理资源必须被创建在 D3DPOOL_DEFAULT 中。如果CPU需要存取该内容,则数据可以通过下面两种方法拷贝到D3DPOOL_SYSTEMMEM 定义的资源中,IDirect3DDevice9::UpdateTexture, or IDirect3DDevice9::UpdateSurface。
正如前面所提到的,当时使用托管方式创建资源时,就不能使用动态方式,如果同时使用这两种标记会引起性能极大损失。动态顶点buffer是被设计用来绘制动态的数据的,这些数据可能由BSP树或者其他的空间划分算法获取到的。根据应用程序自身的资源管理方式而不是d3d的,这些资源被打包,以支持应用程序的需要。动态顶点buffer的数量会很少,因为应用程序同时只允许少量的不同的顶点步长,而只有当步长不同时才有必要创建新的顶点buffer。当我们以这种方式管理动态资源时,才能保证性能不会损失。
当创建资源时,尽量使用D3DPOOL_DEFAULT方式,这使我们能对系统内存和显存的使用情况能有准确的把握。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/cainiao_liu/archive/2010/02/07/5295808.aspx