• D3DPOOL(资源池)


    D3DPOOL定义了资源对应的内存类型,资源可以是texture surface, vertex buffer等,从内存的角度来看,资源有以下几种类型。

    D3DPOOL_DEFAULT

    D3DPOOL_MANAGED

    D3DPOOL_SYSTEMMEM

    D3DPOOL_SCRATCH

    D3DPOOL_FORCE_DWORD

    D3DPOOL_DEFAULT

    资源被存储在最适合给定资源访问的内存中,这通常是显存,包括本地显内存和AGP内存,D3DPOOL_DEFAULT不同于D3DPOOL_MANAGED和D3DPOOL_SYSTEMMEM,它指出了资源被存储在最适合设备访问的内存中,D3DPOOL_DEFAULT指出D3DPOOL_MANAGED和D3DPOOL_SYSTEMMEM永远都不会作为资源内存的备选类型,使用D3DPOOL_DEFAULT分配的纹理资源是无法锁定的,除非该纹理是动态纹理或者是私有的FOURCC driver 格式。想要访问无法所定的纹理资源,必须使用如下函数

    IDirect3DDevice9::UpdateSurface

    IDirect3DDevice9::UpdateTexture

    IDirect3DDevice9::GetFrontBufferData

    IDirect3DDevice9::GetRenderTargetData

    对大多数应用程序来说,使用D3DPOOL_MANAGED是一个更好的选择。一些使用driver特有的像素格式创建的纹理,无法被Direct3D runtime识别,也是可以锁定的。与texture不同的是,swap chain back buffers, render targets, vertex buffers和index buffers都是可以锁定的,当设备丢失时,所有使用D3DPOOL_DEFAULT创建的资源必须在调用Reset函数前释放掉,使用D3DPOOL_DEFAULT创建资源时,如果内存不够用,那么managed resource会释放一些内存空间来满足需要。

    D3DPOOL_MANAGED

    资源按需自动被拷贝到设备能访问的内存中。托管资源由系统内存备份,所以设备丢失时无需重建。托管资源可以被锁定,只有系统备份的那份内存能直接被修改。Direct3D按需将修改拷贝到设备可访问的内存中。

    D3DPOOL_SYSTEMMEM

    资源被分配在不能被设备直接访问的内存中。这些内存消耗系统的RAM但是并不减少可分页的RAM。这些资源不必在设备丢失时重建。这种资源也可以被锁定,并且可以用作函数IDirect3DDevice9::UpdateSurface或IDirect3DDevice9::UpdateTexture的源,这两个函数的操作目标都是D3DPOOL_DEFAULT类型的资源。

    D3DPOOL_SCRATCH

    资源分配在系统RAM中并且无需在设备丢失时重建。这种资源不受设备大小和格式的限制。因此,这种资源不能被Direct3D设备使用,也不能设置为纹理或者Render targets,尽管如此,这种资源也可以被创建,锁定和拷贝。

    D3DPOOL_FORCE_DWORD

    强制该类型编译为32bit大小,没有这个值,一些编译器将会把这个枚举类型编译为非32bit大小的类型,该值暂未使用。

    所有的内存类型适用于所有的资源类型,包括Vertex Buffers, Index Buffers, textures和Surfaces

    下面的表指出了资源的内存类型及用法之间的兼容关系,x表示兼容


    同一个资源中的不同对象间的资源池不能混合(mip levels in a mipmap),并且当一个资源池被选中时就不能被改变了。

    对于大多数静态资源,应用程序应该使用D3DPOOL_MANAGED,因为这使得应用程序不必处理设备丢失。这在统一内存架构的系统(UMA)上显得尤为有益。其他动态资源类型并不适合使用D3DPOOL_MANAGED,实际上,index buffers和vertex buffers不能同时使用D3DPOOL_MANAGED和D3DUSAGE_DYNAMIC创建。

    对于动态纹理,有时需要使用一对内存,一个是使用D3DPOOL_DEFAULT分配的显存,另一个是使用D3DPOOL_SYSTEMMEM分配的系统内存。可以用锁定的方法在系统内存上修改纹理,并使用函数IDirect3DDevice9::UpdateTexture将修改更新到显存中。

  • 相关阅读:
    linux环境开机自启动nginx
    linux下启动weblogic
    oracle 数据库服务名怎么查
    关于 CSS3 backface-visiable 与 overflow 属性的冲突
    iframe 通信之坑
    npm i --save & npm i --save-dev
    window.blur/focus & document.hasFocus()
    mac zip 命令行 终端压缩加密文件
    audio之autoplay
    JAVA 重写&重载/多态/抽象类/封装/接口/包
  • 原文地址:https://www.cnblogs.com/graphics/p/1953083.html
Copyright © 2020-2023  润新知