渲染引擎的资源加载优化

科技资讯 投稿 39100 0 评论

渲染引擎的资源加载优化

保有一个较长的加载时间的心理预期,最好是,点击按键,瞬间整个场景出现,毕竟轻量应用场景不是重型游戏。针对这种需求,我们需要对资源加载做一个全面的性能排查与优化。

Steps

必要的。所以在我的优化工作中,我首先对整个系统做了较为完整的 profile. 我大致将整个资源加载部分逻辑分成了
自顶向下的三层:

  1. meshrender 层:整个场景存在若干个 meshrender,该层级统计各个 meshrender 的加载时间

  2. resource 层:每个meshrender 依赖若干资源:mesh, material, skin/animation 等等

  3. detailed resource 层:对每个 resource 的详尽的分部统计,不同的 resource 步骤也不同

MeshRender

Mesh Material Skin 各占一部分,同时图片的加载已经使用了异步线程加载方式,故不统计在总时间内(加载图的子
线程在主加载线程完成任务之前就已经完成结束)。从下表数据看,Mesh 与 Material 均占较大部分的比例,所以在下面
detailed 层,专门针对这两个部分继续剖析。

-Img Load(AsyncMeshMaterialSkinOthersTotal
Current31.0740.85101.708.273.04153.86

Detailed

数据从文件中读取到内存,并没有发现其他可能浪费时间的耗时操作,逻辑上也比较简单,故结论是无优化空间。

创建与初始化,shader 的加载以及解析,启动异步读图线程等等。具体的耗时分布如下表所示。

-Get AbsPathMaterial AssetShaderAsync load imgsOthersTotal
Current1.381.778.201.711.1014.15

探究其逻辑发现两点

  • shader 文件读取存在一次多余的 copy

  • 其中有一个超过20个 case 的 switch 语句

  • 使用数据指针代替原有的  在传递时几乎没有损耗

  • 使用查表的方式替代 switch-case 语句,提高性能同时也提升代码质量,减少圈复杂度,同时更便于维护和更新

优化以后的数据如下表

-Get AbsPathMaterial AssetShaderAsync load imgsOthersTotal
Current1.381.778.201.711.1014.15
Optimize1.521.857.441.280.5212.61

总结

最后我们来看一下总体的性能提升情况

-Img Load(AsyncMeshMaterialSkinOthersTotal
Current31.0740.85101.708.273.04153.86
Optimize33.6236.4080.816.883.28127.37
Performance of resource loading

              Mesh                    Material               Skin Others
before opt  xxxxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|xxx|x|
after opt   xxxxxxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxxxxxx|xx|x|

编程笔记 » 渲染引擎的资源加载优化

赞同 (34) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽