【Unity项目实践】性能优化
  EFTJ6596AiAP 2023年11月02日 95 0

Unity的性能优化主要聚焦在3个方向:内存、CPU、GPU

内存

概述

主要是指资源内存的占用、引擎模块自身内存占用、托管堆占用。


处理手段

  • ​前置堆内存分配,尽量降低碎片化
  • 查验内存泄漏
  • 资源预处理
  • 字符串拼接、配置表优化、对象池​

(1)资源

资源的内存占用往往占据了总体内存的70%以上。资源主要包括:纹理(Texture)、网格(Mesh)、动画片段(Animation Clip)、音频片段(Audio Clip)、材质、着色器、字体、文本资源等。其中Texture、Mesh、AnimationClip、AudioClip最容易造成很大的内存开销。

1)纹理Texture

  • 格式
  • 尺寸
  • Mipmap

2)网格

检查是否需要所有网格数据

(2)引擎自身

占内存比较大的是:WebStream和SerializedFile

(3)托管堆

大多数项目中,托管堆由Mono来进行分配和管理。”托管“是指Mono可以自动调整堆的大小来适应所需的内存,并且可以自动GC。

存在的问题:一旦分配不会返还,所以堆内存只升不降。

一些需要注意的细节:

  • 不要在Update、FixedUpdate等高频调用的函数中开辟堆内存
  • 不要频繁的Log输出
  • 慎重使用UIPanel.LateUpdate
  • String连接


CPU

概述

引擎模块性能开销、自身代码开销

处理手段

  • Unity资源
  • 批处理:静态、动态
  • 剔除:遮挡剔除、远近剔除
  • AOI
  • 图集:合理划分图集、动态图集
  • 模型:顶点控制、特效面数控制
  • GPU Instancing
  • UGUI
  • 业务代码
  • 执行效率优化

GPU

概述

OverDraw、显存带宽

主要的瓶颈

  • 填充率
  • 像素的复杂度
  • 几何体的复杂度
  • GPU的显存带宽


处理手段

  • 减少顶点的数量,简化计算的复杂度
  • 材质纹理:尽可能少;使用图集;使用Renderer.sharedMaterial代替Renderer.material
  • 光照:使用光照纹理,而不是实时灯光
  • 距离:使用LOD,离得远的细节可以忽略
  • 剔除:遮挡剔除
  • Shader:使用mobile版本的shader,更加简单
  • 压缩图片,适应显存带宽
  • 打包设置的时候,OpenGl中选择ETC1、PVRTC等
  • 使用mipmap:存储了原图和一系列缩小的备份图,游戏中选择合适尺寸的小图来渲染;这样图片渲染的质量会比压缩要好,但是消耗了一些内存。
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

EFTJ6596AiAP