d3d 零碎记录

来源:互联网 发布:淘宝微淘 编辑:程序博客网 时间:2024/05/16 19:52
 

本文记录

  • pc版directx相关coding的一些知识点
  • 摘取directx doc中需要更加注意的地方

driver:

 

从render target读东西,目前为止知道的方法是

1, 创建system memory的surface,然后用D3DXLoadSurfaceFromSurface把rendertarget的东西load到surface里面。

然后就可以lock了。

 

其他lock需要是非render target的surface。

2, strechrect 

文档上可以,但是还没尝试过,用default memory的surface把surface copy过来,然后lock

 

3, GetRenderTargetData

这个可以把rendertarget 的surface从default memory copy到system memory的surface,而且这个是走command buffer的,用一个query event来控制结束点比较好,防止还没完成就用了。

 

batch:

每个drawcall时候driver会validate render state changes。

 

RenderTarget&Texture:

刚才在setrendertarget的时候depth buffer大小和color buffer不一致,居然还可以跑。

 

经楼下提示,查了下文档,果然是要求depth buffer要>=color buffer(“The size of the depth stencil surface must be greater than or equal to the size of the render target.”)。

 

 

rgbx在lock的时候内存分布是bgra:用union来做的话就是第一个byte为blue,第二个byte为green这种

 

RenderTarget的color buffer至少要有一个,不能全设成NULL,我全设成NULL的情况下是用之前的一个render target,结果resolution不一样,导致render有问题。

如果不需要写入的话,就选择一个resolution一样的,然后disable color writing就好。

 

在设置render target的同时会默认设置viewport为全屏。

 

Lock

  • dynamic属性的texture一般是放在agp memory里的。
  • discard的效率最好,但是内存不会被保留,所以如果只更新一部分的话,有可能会看见其余部分被改写。
  • 如果lock的东西正在被用,cpu端就要wait(当然用了nowait的flag的话,可以得到busy的信息,然后做别的)

OS

  • xp下d3d driver拥有gpu的所有控制权
  • vista下是把一部分工作(scheduling,memory management)

resource management:

  • 很多资源是第一次使用的时候才会被创建的,而不是api的create的时候
  • texture's creation/destruction都是很昂贵的,不只是memory allocation,还有很多check,所以可以的话还是pool之。

recompile on g7x shader

  • user defined clip plane会导致shader重编译
  • alpha test在g7x会导致shader重新编译

Instancing:

  • instancing对cpu有好处,对gpu没好处,项目根据自己情况取舍吧。

machine code

  • hlsl asm代码会被driver编程各个generation的gpu用的机器码
  • 最好的是在每个shaderload的时候画一下随便什么东西,否则第一次用的时候编译还是不太爽。

occlusion query:

  • 使用上一帧的occlusion query(with bigger bb)还是可以的。

MemoryPool:

     

     


     

    shaders in GPU

    • attribute的插值也是消耗性能的,这个有可能低于插值简单的attribute然后在pixel shader计算复杂结果。
    • 压缩的texture在L1 cache里面仍旧保持格式不变,在进入shader才会被解压
    • 对于g80架构,vertex texture比vertex buffer要快。

    shaders:

    • 想要定义一个不会被SetPixel/VertexShaderConstant覆盖的globa variable用static const float4这种,单纯const float4 v;这种会导致被放入constant table,开放给application来set。
    • Effect系统非常慢,相比较纯shader来说,尽量不要用了。

     

    dxt1 8:1的压缩

    dxt5 4:1的压缩

    在texture lock并memcpy的时候要注意这一点,对标准的size做一个缩放之后再处理

    但是在实际做的时候同样width&height的texture,不同的格式lock出来的pitch不一样,dxt5的是dxt1的2倍。

    所以可以统一的进行判断压缩格式,则算memory大小就用stride*height/4这种方法。

     


     

    software:

    1. 2011.1.14遇到一次dx control panel里的选项都灰了,不能设置成debug模式,重装就可以了
    原创粉丝点击