vga驱动程序是什么(vga驱动是显卡驱动吗)

vga驱动程序是什么(vga驱动是显卡驱动吗)如果 lock 的资源在被 gpu 使用 那么这个 lock 函数 在某些 flag 就会卡住 显存超出比较多的时候 会出现严重的 paging 回到典型的 5 个会造成卡顿的原因 shader 编译 我们写的 hlsl 编译成 asm 后 在 gpu 运行的时候会进一步编译 gpu 需要使用的机器语言 这个语言是我们开发时候 offline 生成不了的



  • 如果lock的资源在被gpu使用,那么这个lock函数(在某些flag)就会卡住
  • 显存超出比较多的时候,会出现严重的paging

回到典型的5个会造成卡顿的原因:

shader编译:
我们写的hlsl,编译成asm后,在gpu运行的时候会进一步编译gpu需要使用的机器语言,这个语言是我们开发时候offline生成不了的,因为不同的gpu有不同的指令集,这个过程是driver在运行时刻完成。
一般来讲,是在CreateShader时候生成这个机器语言,但是实际中有一些例外:
  • 对于一些很复杂的shader会先生成一个能用的,但是优化的不好,然后后面时间富裕了在生成一个高度优化的
  • 有些state的转换会造成shader机器指令的编译,比如有的gpu会把alpha test变成shader里面的clip语句,进而就不用提供硬件的alpha test,那么这种render state的转换也会造成shader编译,一些会造成shader recompile
    • shadow map bound/unbound
    • 使用的贴图在fp和非fp格式之间转换--看来fp的texture会使用特殊的sampling指令吧
    • 贴图和rendertarget的srgb
    • 同样的pixel shader,但是COLORWRITEENABLE的状态不同
    • 使用一些枚举或者bool来控制static branch,不同的branch的排列都会造成编译
    • d3d9的
      • clipplane
      • mrt的状态
      • fog
  • 一些比较好的建议:
    • loading的时候把shader create出来,并且把各个mesh至少都画一遍,这样保证runtime的时候就不用recompile了
    • streaming的话,就render一个看不见的物体好了,反正保证画一遍
    • 如果都做不到的话,保证在createshader和使用shader之间有0.5s到1s的时间缓冲
    • 把一些严重的state放在一起画,
资源管理
  • 在vista以及后面的os上,资源创建的时候,内存不总是在create的时候分配,很多情况是在第一次被使用的时候
  • 大型资源的创建很耗费
  • 频繁的create/destroy会产生碎片,pool会改善这一点
  • 一些会造成同步的点,本来gpu和cpu是异步运行,一旦同步就会导致系统停顿,直到同步
    • lock系列(在一定的flag下)
    • 在release了一个大资源之后,创建一个大资源(oops)
  • 一些建议
    • lock和map的时候使用discard flag,这个会新创建一个资源,而不是等待gpu使用上一个
    • 经常更新的资源使用dynamic&NOOVERWRITE flag,这样driver会倾向于把资源放到systemmem,一些比较小的vb,ib,tex放到systemmem也ok啦
    • 尽量pool,而不是runtime的去create&destroy
      • 自己管理的pool,在释放和重用资源的时候,记住要query一下gpu使用它的情况,这个不像单独的一个资源有driver帮着管理,自己的pool就要多费些力气
    • 如果一定要runtime的create&destroy,保证先destroy,然后create,一小会的超内存也会让driver管理内存的时候傻眼
    • 显存的allocate策略是先到先得
    • 按照重要性的顺序来alloc显存
      • depth stencil
      • render target
      • frequently used resource : texture
      • less used resource:vb,ib,texture
    • 重要性一样的话,大的优先,float point的优先
  • 超显存的问题并不总是一个严重问题
    • 高频率使用的资源都放在显存里了,所以一般不会有严重的paging,所以前面说的是大幅度超显存才是问题
    • gpuview里面可以看paging的事件

queued frame
这个一般都是限制gpu不会落后cpu(render thread)超过一帧,但是这里看来似乎并不是最好的策略,如果可以的话落后个多达3帧的话,可以对gpu时间不稳定的情况有更好的容错。
也就是会更平滑。
但是副作用也是比较明显的,比如occlusion query就会晚好多帧。

frame落后有api的:
IDirect3DDevice9Ex::SetMaximumFrameLatency
IDXGIDevice1:: SetMaximumFrameLatency

其他一些会造成性能卡顿
  • gpu context switch,比如在graphics pipeline和direct compute pipeline之间切换
  • 多个d3d application同时运行的时候,会造成竞争(contention)
  • driver的paged/non-paged pool超内存了,xp上面这方面能力相对就差


编程小号
上一篇 2025-02-15 13:21
下一篇 2025-03-19 09:06

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/42312.html