zoukankan      html  css  js  c++  java
  • unity渲染性能优化

    cpu bound还是gpu bound

    cpu bound:渲染task可能分布在多个线程,叫做多线程渲染。主线程、渲染线程、worker线程。主线程包含一些渲染的任务。渲染线程发送命令给gpu。worker线程执行一些单独的任务,裁剪、mesh skin等。但不同目标也可能不同。

    哪个task是瓶颈就优化那个task在的线程。某些平台不支持多线程渲染。

    graphics job: player setting里的graphics job决定unity用worker线程展开渲染任务。

    (1)发送命令到gpu:一般是在渲染线程执行的,有可能是worker线程执行在某些平台上(如ps4).SetPass call导致发送指令到gpu。目标平台能支持多少setpasscall跟设备有关。减少batch数、更多物体共享渲染状态。较少setpass call数。

    较少渲染物体数目(减少数目、剔除、距离、层级剔除、遮挡剔除),较少每个物体呗渲染次数(动态光照、动态阴影、反射probe),必须被渲染在多个批次的物体合成一个(静态合批、动态合批、ui合批、gpu instance、贴图图集、合批会减少很多消耗

    因为shadow、light、cull都是逐物体操作的)。

    剔除、排序、合批:剔除、收集要渲染物体的信息、排序这些数据到batch、生成gpu指令都可能导致cpu bound。这些任务根据平台不同,可能在主线程、也可能在单独的工作线程。

    剔除本身不太可能会造成很高的成本,但是减少不必要的剔除可能会提高性能。所有active场景物体都有逐物体逐相机的开销,即使在不被渲染的layer。我们应该disable掉相机或者不用的renderer。

    batch能减小dc开销。但它会增大开销,如果batch导致cpu bound,我们要限制batch操作。

    skinMesh:骨骼动画,动画角色。可能会导致cpu bound。能用meshRender就不用SkinnedMeshRenderer。 如果只动一段时间,看来替换mesh或吧skinnedMesh换为meshRenderer. mesh skin开销是逐顶点的。

    用更少顶点减少负担。某些平台可用gpu控制skin。

    减少主线程上,非渲染任务的消耗。比如脚本。

    如果gpu bound:

    Fill rate:减小分辨率、后处理。overdraw、屏幕效果、片元着色器、内置shader复杂度、standard shader复杂度。

    内存带宽:贴图压缩、miapmap

    顶点处理:顶点数、用法线贴图增加细节代替顶点、如果不需要normalmalp,不导入法线、lod、顶点shader、shader复杂度

    参考这篇:https://learn.unity.com/tutorial/fixing-performance-problems#5c7f8528edbc2a002053b596

  • 相关阅读:
    使用grpc C++功能
    华为任正非访谈
    苹果产品
    异步编程
    基于磁盘存储
    spring 应用
    java简单框架设计
    消息队列架构
    03 java 基础:注释 关键字 标识符 JShell
    02 java 基础:java 文件名与类名关系 CLASSPATH
  • 原文地址:https://www.cnblogs.com/Shaojunping/p/12801305.html
Copyright © 2011-2022 走看看