0


【Unity面经】性能优化篇

在这里插入图片描述


👨‍💻个人主页:@元宇宙-秩沅

👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍💻 本文由 秩沅 原创
👨‍💻 专栏交流🧧🟥Unity100个实战基础✨🎁🟦 Unity100个精华一记✨🎁🟩 Unity50个demo案例教程✨🎁🟨 Unity100个精华细节BUG✨🎁🟨 Unity100个面试题✨🎁
在这里插入图片描述

在这里插入图片描述


文章目录


⭐前言⭐


🎶(一) 有使用过Unity性能工具吗


Unity Profiler可以帮助我们监测游戏在运行时的性能表现,包括CPU、GPU的占用情况,内存分配情况、渲染性能及网络活动等。

性能优化”最重要的方式,是从”项目管理”上防止”游戏做完马上要上线”时出现的性能问题。在日常项目管理中,把性能监控起来,问题尽早发现,尽早动态清零,这样才能做到项目从性能风险上是可控的

从项目正式开发的第一天起就引入多平台测试与完整的测试机制;

如做渲染管线定制,编写了Shader,效果,还要注意必须要最快的速度尽早多平台测试。在项目开始就上多平台,才能发现各个平台不同的差异,尽快解决这些差异与问题。同时还要构建游戏核心玩法中的极限情况模拟,来应对项目后期大量战斗单元出现导致的性能问题。

使用Unity Profiler性能工具检测性能参数的变化

做好性能优化的最重要的手段

完整的工程管理机制
与测试共存,
动态清零包含性能在内的问题,是


🎶(二) 有哪些减少性能消耗的方法和手段


🪶1.检测和早期手段


a:代码算法与系统底层功底
b:工程管理手段: 通过工程手段测试出来了性能问题
c: 打印:
d: 性能工具剖析手段:


🪶2. 内存优化


1.使用对象池缓存池,减少内存碎片,减少对象的反复构建,避免GC峰值冲击等
原理:频繁创建和销毁对象会导致性能问题,尤其是在游戏中经常需要创建和销毁大量对象时。

举例:在射击游戏中,使用对象池来重用子弹对象。创建一个BulletPool类,在游戏开始时预生成一定数量的子弹对象,当子弹被射出时从池中取出一个对象,当子弹消失时将其返回池中而不是销毁它。

2.共享池(享元模式):整个游戏全部角色共享同一个对象
3.确保及时清理不再使用的对象避免重复加载相同的资源:
4.重用缓存资源:使用 Resources.Load() 时,避免重复加载相同的资源,应该缓存资源的引用并重用它们。

5.使用 Asset Bundles 或 Addressables:管理和优化资源的加载和卸载。

6.合理使用 Dispose 方法

7.释放非托管资源:对于实现了 IDisposable 接口的对象,如文件流、网络连接等,确保正确调用 Dispose 方法来释放资源。


🪶3. 物理引擎的优化


减少物理引擎的迭代参数,减少计算量,减少物理刚体的数目。简化碰撞体

原理:复杂的碰撞体会增加物理计算的负担,简化碰撞体可以显著提升性能。

使用简单的碰撞体:对于一个大型建筑物模型,使用一个简单的盒子碰撞体来代表它,而不是使用复杂的Mesh Collider。复杂的Mesh Collider适用于需要精确碰撞检测的对象,例如角色模型的碰撞体。

减少物理计算
原则:减少不必要的物理计算可以降低CPU的负担。

举例:调整物理模拟精度:对于不需要高精度物理模拟的对象,调整物理引擎的精度设置,例如,增加Fixed Timestep值以减少物理计算的频率。
使用简单碰撞体:在需要物理计算的对象上使用简单的碰撞体,而不是复杂的Mesh Collider。
这些原则和例子可以帮助你在面试中展示你对Unity性能优化的深入理解。通过具体的实例说明每个原则的应用,将展示你在实际开发中的实践经验和能力。


🪶4. 优化脚本(需深入)


原理:优化脚本可以减少CPU负担,尤其是对性能敏感的游戏。

举例:

减少Update调用:在Update方法中避免执行昂贵的操作。如果一个操作不需要每帧更新,可以放到FixedUpdate()或者LateUpdate()中,或者使用事件和定时器来触发。

缓存引用:在Update中频繁访问GameObject.Find()会导致性能问题。将对象的引用缓存到变量中,避免重复调用。
for循环内部不要过多

减少频繁的 Find 操作

缓存引用:避免在每帧调用 GameObject.Find(),在初始化时缓存对游戏对象的引用。

寻路导航优化: 优化寻路算法,流场寻路等,多线程。


🪶5. 管理内存和包体优化

优化图片,声音体积,通过改变压缩参数来降低这些资源的体积大小。可以使用服务器上部署资源包来实现打空包机制进一步减少包体体积。

原理:有效管理内存可以避免内存泄漏和频繁的垃圾回收,从而提高应用的性能。

举例:

避免频繁的内存分配:在游戏中频繁创建和销毁大量临时对象会导致频繁的垃圾回收。使用对象池或预分配内存来减少垃圾回收的次数。
使用Profiler工具:通过Unity的Profiler工具监控内存使用情况,识别内存泄漏和不必要的内存开销。


🪶6. 渲染优化


利用光照贴图:使用光照贴图可以减少实时光照计算的需求,特别是对静态对象。

举例:烘焙光照:在场景中使用光照贴图(Lightmaps)对静态环境进行光照烘焙,例如,房间的墙壁和地板,避免实时计算这些物体的光照。

看下pass的次数与set pass 次数, pass 次数
多次pass:阴影会导致,多光源会导致, 可以通过定制渲染管线,优化shader代码, 优化光照计算等,从Shader+渲染管线级别来做好渲染优化。LOD优化,远处用的面数少,近处用的面数多。抗锯齿算法优化等。

Draw Calls优化:

原理:每次渲染调用都需要CPU和GPU的协作,减少Draw Calls可以显著提高渲染性能。

举例
纹理图集合并:如果你的游戏有多个UI元素,每个元素都有不同的纹理,可以将这些纹理合并到一个大纹理图集中。这样可以减少纹理切换,从而减少Draw Calls。
网格合并:例如,你有一个场景中有多个相似的树木模型。通过将这些树木的网格合并成一个大网格,并在Shader中进行批处理,减少每帧的Draw Calls数量。

压缩纹理

原理:压缩纹理可以减少纹理占用的内存和带宽,提高渲染效率。

举例:
使用纹理压缩格式:将纹理设置为压缩格式,如DXT(对于PC)或ASTC(对于移动设备)。这可以显著减少纹理占用的内存和带宽,尤其是在大型场景中。

降低分辨率

原理:降低渲染分辨率可以减少图像处理的负担,提升帧率。

举例
动态分辨率调整:根据游戏性能动态调整分辨率。如果游戏帧率下降,可以降低渲染分辨率以提高性能。

合理使用光源

原理:减少实时光源的数量,优化光源的使用可以显著提升渲染性能。

举例:
减少动态光源数量:在一个场景中,尽量减少动态光源的数量。例如,将场景中的某些光源设置为静态光源,并使用光照贴图代替实时光源。

剔除未显示物体

原理:通过剔除看不到的物体来减少渲染负担。

举例:
视锥体剔除:Unity自动进行视锥体剔除,确保只有在摄像机视野内的物体才会被渲染。你可以手动优化剔除逻辑,例如,使用OnBecameInvisible方法来进一步管理物体的激活状态。
遮挡剔除:使用遮挡剔除(Occlusion Culling)功能来避免渲染被其他物体遮挡的物体。这有助于减少不必要的渲染开销。


🪶7. 美术方面的优化


优化动画:优化动画可以减少CPU和GPU的负担,提升游戏性能。

举例
动画压缩:在Animator中,使用动画压缩功能来减少动画数据的大小。对于角色动画,可以调整动画的压缩设置,以在不显著影响质量的前提下减少数据量。
动画剪裁:对于不需要精细动画的场景,使用简单的动画剪裁和循环动画来减少对性能的要求。

模型优化:通过细节增强,法线贴图,高度贴图,凹凸纹理等减少模型面试的同时获得很好的效果。

🪶8.网洛优化


网络优化: 异步IO代替同步IO,多线程处理网络消息, protobuf序列化与反序列化优化网络包体体积。KCP 替换传统的TCP。

减少网络数据包大小

示例:仅发送必要的数据,避免发送冗余信息,优化网络数据格式和压缩策略。

减少网络通信频率:

示例:避免频繁的状态更新,通过批量更新或使用事件驱动的方式减少网络通信的次数。

通过遵循这些基本的性能优化原则,开发者可以显著提升 Unity 游戏的性能,并提供更流畅的用户体验。

代码写法优化: for循环内部不要过多、、
跳转打乱CPU Cache等。……

在这里插入图片描述

⭐🅰️系统路线学习点击跳转⭐


👨‍💻 Unity程序基础学习路线🧧⭐【Unityc#专题篇】之c#进阶篇】🎁⭐【Unityc#专题篇】之c#核心篇】🎁⭐【Unityc#专题篇】之c#基础篇】🎁⭐【Unity-c#专题篇】之c#入门篇】🎁⭐【Unityc#专题篇】—进阶章题单实践练习🎁⭐【Unityc#专题篇】—基础章题单实践练习🎁⭐【Unityc#专题篇】—核心章题单实践练习🎁

你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!


在这里插入图片描述



本文转载自: https://blog.csdn.net/m0_64128218/article/details/142005126
版权归原作者 秩沅 所有, 如有侵权,请联系我们删除。

“【Unity面经】性能优化篇”的评论:

还没有评论