来源:知乎
导读
最近在学习引擎性能测试相关知识,通过这篇文章对自己学习知识做个总结,主要包含以下几个方面,性能测试的流程,测试方法,测试工具,需要关注的数据及优化策略。
性能测试流程
首先拿到测试包体在目标平台实现功能操作,通过性能测试工具得出需要关注的数据,然后进行分析,不断改进项目,在不影响项目功能性,兼容性的情况下,使优化后的性能指标达到预期标准。
项目未优化时需要关注的指标
生成包体大小(比如exe ,apk)
三角型平均面数,最高峰值
渲染批次
SetPassCall 数量
平均帧率(是否出现卡顿,也是最基本的指标,在复杂的场景或者玩法中是否可以流畅运行,是否出现crash)
每帧时长
内存 显存(内存占用大小,不同机器占用内存标准也不一样,是否存在内存泄漏,内存资源是否重复)
纹理资源(在不同的平台上)
Mesh 资源(在不同的平台上)
音效资源(在不同的平台上)
发热情况
耗电量情况
性能测试工具
1.Renderdoc 图形分析工具,可以抓取某一帧用来分析shader等
2.Unity 自带nity Profiler,Unity Memory Profiler
3.XCode Instrument. XCode Instrument
优化策略-资源检查和资源优化
Unity 的资源分为两种
外部导入资源:
模型网格Mesh
,纹理
音乐音效
字体动画
视频等
内部创建资源:
Prefab
Animation Controller
TimeLine
RenderTexture
ParticaleSystem
VFX 等
导入资源优化:upr 资源检查工具
音频优化
根据平台选择合理的音频设置,原始音频尽量采用未压缩的WAV格式
移动平台对音乐音效统一采用单通道,并将音频采样频率设置未22050Hz
移动平台大多数声音尽量采用Vorbis压缩设置,IOS平台或不打算循环的声音可以选择MP3格式,对于简短、常用的音效,可以采用解码速度快的ADPCM格式(PCM为未压缩格式)
音频片段加载类型说明
简短音效导入后小于200kb,采用Decompress on Load模式
对于复杂音效,大小大于200kb,长度超过5秒的音效采用Compressed in Memory模式
对于长度较长的音效或背景音乐则采用Streaming模式,虽然会有CPU额外开销,但节省内存并且加载不卡顿
当实现静音功能时,不要简单的将音量设置为0,应销毁音频(AudioSource)组件,将音频从内存中卸载
Mesh优化
1.优化原始导入模型文件,删除不需要的数据
统一单位导出的网格必须是多边形拓扑,不能是贝塞尔曲线、样条曲线、细分曲面等
在导出之前确保所有Deformers都烘培到网格模型上
不建议模型使用的纹理随模型导出
如果需要导入Blend shape normals时,必须指定光滑组Smoothgroups
建议导出时不携带如摄像机、灯光。材质等场景信息。
2.原始模型影响性能点
最小化面数,不需要微三角形面,三角面尽量分布均匀
合理的拓扑结构与平滑组,尽可能是闭包
尽量少的材质个数
尽可能少的蒙皮网格
尽可能少的骨骼数量FK与IK节点分离,导出时删除IK骨骼节点
3.引擎内模型优化
尽可能的将网格合并到一起
尽可能使用共享材质
不要使用网格碰撞体
尽可能使用共享材质
不必要不要开启网格读写
使用共享材质使用合理的LOD级别
Skin Weights受骨骼影响个过多
合理压缩网格
不需要rigs和BlendShapes尽量关闭
如果可能,禁用法线或切线
多套模型
常见的模型规范
布线合理 中模 高模 低模(进入引擎的)
UV 合理性 一个UV 一个材质球 保持在(0-1),UV 打直线 增加利用率
光滑组优化
场景大小合适
模型明明规范,static mesh
坐标归零
进入引擎最好三角面
特效规范和拆分实现
需求》概念设计》落地方案》满足功能的特效》连入游戏》效果迭代
资产结构
纹理优化
实际项目纹理出现的问题
纹理图集利用率偏低,浪费内存,尽量设置合理的图集大小,将生命周期差不多的尽量放在一个图集里
不合理的半透明纹理,造成Overdraw与内存开销
不打图集的序列帧动画与过多的序列帧
大量重复纹理与不合理的通道图
大量颜色渐变贴图不压缩,也不采用单像素宽度
动画导入设置和优化
Animation Type
None 无动画
Legacy 旧版动画,不要用
Generic 通用骨骼框架
Hunmannoid 人形骨骼框架
选择原则
无动画选择None
非人型动画选择Generic
人型动画 (人型动画需要Kinematices 或 Animation Retargeting 功能,或者有自定义骨骼对象时选择Humanoid Rig ,其他都选择Generic Rig,在骨骼数差不多的情况下,Generic Rig 会比Humaniod Rig 节省30% 甚至更多的CPU的时间)
动画文件导入设置优化后信息查看原则
查看效果差异(与原始制作动画差异是否明显)
看曲线数量(总曲线数量与各种曲线数显,常量曲线比重大更好)
看动画文件大小(动画文件在小几百k或者更少合理,查过1M以上的动画文件考虑是否合理)
Unity 工程优化及导入资源流优化
场景中的摄像机数量会影响渲染流程的复杂度
场景中的灯光数量会影响光照复杂度与阴影复杂度
创建合理的工程资源目录和规范的资源流程导入
场景结构设计原则
合理设计场景一级节点的同时,避免场景节点深度太深,一些代码生成的游戏对象如果不需要随父节点进行Transform的,一律放到根节点下。
尽量使用Prefab节点构建场景,而不是直接创建的GameObject节点。
避免DontDestroyOnLoad节点下太多生命周期太长或引用资源过多的复杂节点对象。Additive场景尤其要注意。
最好为一些需要经常访问的节点添加tag,静态节点一定要添加Static标记。编辑切换为居中
预置体优化
嵌套预制体
预制体变体
UGUI优化
Unity UI性能的四类问题
Canvas Re-batch 时间过长
Canvas Over-dirty, Re-batch次数过多
生成网格顶点时间过长
Fill-rate overutilization
物理优化
层级之间分层设置,不需要物理碰撞的物体,取消物理
物理更新速度降低
动画优化
优化策略-项目优化
首先优化资源然后优化项目本身
CPU和GPU 可以理解为生产工厂,带宽理解为道路,内存理解存储仓库。
性能优化实战-性能瓶颈与瓶颈定位
ios 有强大性能分析工具 ,机器少
通过unity Profiler +unity upr 测试工具 分析性能瓶颈
分析渲染流程 通过unity 自带的frame Debugger
通过xcode GPU 分析工具分析iOS
通过经验 超过1ms 的步骤都要分析
通过工具分析是否shader 分析
优化越早越好
Unity 提前期优化---Culling, Simplization,Batching
Culling untiy 中的剔除,去除不需要的部分
Simplization Unity 中的简化,对资源进行分类打包
Batching Unity 中的合批,cpu 向gpu 分发资源 ,对资源进行分类传输
场景中的远处景物 玩家到不了的地方可以用天空盒cube map ,玩家实际可以去的地方可以用mesh
中近景物体设计lod 层级,对于近景的物体和中景进行合理的分层可以减少顶点数及batch 数量等,关闭已经在阴影中的物体
遮挡剔除和阴影剔除 对灯光等级 显示范围 剔除
渲染管线精简与优化,剔除不必要的pass
Terrain 地形优化
将Terrain 烘焙成mesh
级联阴影优化
内存优化
内存占用查看 Mesh Texture
mini map 及项目设置
移动端 shader 内存占用大约占用40mb 内
Shader 变体优化,shader 关键越少,pass 越少 shader 内存占用就越少
Shader 指令优化
耗电量与发热量 移动端
启动
打包优化
参考TestHome大佬文章及B站大佬视频
第1章简单介绍软件单元测试所包含的概念,包括桩对象和测试驱动函数、测试驱动开发、软件测试贯彻始终、软件测试金字塔、单元测试在传统/敏捷开发模式中的地位、精准测试、单元测试和白盒测试,以及单元测试的FIRST原则和AIR原则。
第2章介绍软件单元测试基础知识,包括动态自动化/手工单元测试、静态自动化/手工单元测试。在动态自动化单元测试中介绍了语句覆盖、分支覆盖、条件覆盖、条件/分支覆盖、MC/DC、路径覆盖和控制流覆盖。
第3章到第5章介绍C语言、Java语言和Python语言的单元测试框架。
第3章介绍C语言动态自动化单元测试框架,包括在Windows下安装C语言运行环境、在Windows和Linux下安装编译CUnit、查看测试报告、CUnit介绍和案例。
第4章介绍Java语言动态自动化单元测试框架,包括在Eclipse中创建Maven项目和配置JUnit与TestNG运行环境、JUnit 4测试框架、JUnit 5测试框架、TestNG测试框架、测试替身、变异测试、利用EvoSuite自动生成测试用例,以及在Jenkins中配置JUnit 4、JUnit 5、TestNG和Allure。
第5章介绍Python语言动态自动化单元测试框架,包括unittest、Pytest及Python的模拟对象和变异测试工具mutpy。
第6章与第7章介绍代码覆盖率工具和代码语法规范检查工具。
第6章介绍代码覆盖率工具,包括C语言覆盖率工具gcov和lcov、Java语言覆盖率工具JaCoCo,以及Python语言覆盖率工具Coverage和pytest-cov。
第7章介绍代码语法规范检查工具,包括Java语言静态分析工具PMD、Python语言静态分析工具flake8和pylint,以及多代码语法规范检查平台SonarQube。
第8章通过两个案例详细介绍TDD。
读者可以根据自己的需求对以上内容进行选择性阅读或者全部阅读。另外,为了巩固大家的学习效果,每一章结尾都有相应的习题。
顾翔凡言:在LLM与AIGC时代,产品、研发、运维工程师是永远不会失业的。
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...