关闭

[置顶] 【Unity优化】Unity优化技巧进阶(持续更新中...)

标签: unity优化游戏DrawCall
2599人阅读 评论(1) 收藏 举报
分类:

做游戏好多年了,关于游戏优化一直是另开发者头疼的一个问题。因为优化牵扯的内容很多,要求掌握的知识点比较全面。在接下来的系列文章中,我想分享一下自己的一些经验。一些有误或者不完善之处请小伙伴们给我意见,加入一起探讨和学习。

程序消耗

所谓的优化,目的应该是尽可能减弱某种消耗,而在Unity上来说,大概可以分为以下几种:

  • 程序的运行速度
  • 程序的资源消耗
  • 程序的功耗消耗

程序的运行速度,一般是指运行帧率,也包括加载速度。是我们首要考虑的重点,也是将会花最多的精力去探讨的话题,运行帧率是游戏类项目的一个非常重要的性能指标,帧率的下降将直接导致游戏体验的下降。
程序的资源消耗,一般是指包体大小,占据用户客户端的存储空间大小,也包括网络消耗,占据多少带宽。这些虽然不那么影响用户当下的体验,不过指标太高也会降用户接受度。
程序的功耗消耗,一般是指应用程序的耗电量,一款程序做的很好,但是功耗太高,使用后短时间内发热太厉害,也会导致玩家无法使用。这种优化跟显卡直接关联,显卡厂商也有很多优化测试和评估程序帮助我们实现降低功能。
按优化的优先级来说,程序的运行速度是首要的。我先列出今后可能会涉及到的关于提高运行速度进行相关的优化策略。

运行速度的瓶颈

我自己所认为解决优化问题的所有手段虽然很多,不过关键的是思路就是找到适合你自己的项目的优化方法,消除性能消耗的瓶颈。
一般而言,运行速度可能存在的瓶颈有以下一些方面:

  • CPU消耗:
    • 过多的DrawCall
    • 过多的物理计算
    • 过于复杂、低效的算法
    • 频繁的GC
  • GPU消耗
    • 过多的顶点需要处理
    • 过于复杂的逐顶点计算
    • 过多的片元需要处理
    • 过于复杂的片元计算
  • 带宽消耗
    • 过大和未压缩的贴图格式
    • 过高分辨率的帧缓存

需要说明的是,这里的带宽消耗是说从CPU端传送数据到GPU时所消耗的带宽,而不是网络消耗。
以上的所有部分,都有可能成为你的程序运行速度的瓶颈,因此我们需要掌握一些相应的优化手段来消除这些瓶颈。
有些概念,比如DrawCall、顶点计算、片元计算,做一个简单解释:
DrawCall:以OpenGL为例,就是一次OpenGL渲染流水线的运行过程,固定流水线简单示意如下:
这里写图片描述
也就是说,假设现在Unity世界中有一个物体的模型,从其上的所有顶点,如何经过顶点的装配、裁剪,再到将处理后的面(片元)渲染出来的一整个流程。
上图是固定流水线的流程,而当前我们使用的GPU都是可编程的流水线,也就是在上述步骤中插入一些可编程的环节。包括前面所说的:逐顶点计算、片元处理等。

优化策略

针对上述问题,我们需要提出相应的解决方案。

  1. 如何提高脚本运行效率?
    • 降低算法的复杂度,了解常见的数据结构和算法
    • 使用协程来避免多余的更新计算。
    • 缓存耗时计算的中间值
    • 缓存获取过的Componenet
    • IMGUI只用与测试,发布时应该屏蔽
  2. 如何避免频繁的GC?
    • 为快速产生和消灭的大量对象建立缓冲池(Pool)
    • 当频繁拼凑字符串时,使用StringBuilder,而不是直接加减
    • 一些数量众多,功能简单的小对象,使用结构体而非类
    • 正确地使用foreach
  3. 如何降低DrawCall?
    • 静态批处理
    • 动态批处理
    • 网格和材质的静态合并
    • 网格和材质的动态合并
    • 使用Instance LOD
  4. 如何优化顶点数和顶点计算?
    • 尽可能在制作时控制顶点数目
    • 移除那些不需要的硬边缘和UV缝接
    • 使用Unity的LODGroup
    • 调整视椎体裁剪Frustum culling
    • 使用遮蔽剔除Occlusion culling
  5. 如何优化片元计算?
    • 尽可能减少复杂的片元计算,如实时光照和实时阴影
    • 使用光照贴图实现全局光照,light probes实现简易的动态阴影
    • 使用更加高效的Shader(Unity上的Mobile版本)
    • 减少半透明物体,并控制它们的渲染顺序,尽可能减少重绘(OverDraw)
  6. 如何降低物理计算?

    • 尽可能少用刚体,不重要的物体可以自己写简易的模拟物理
    • 尽可能减少直接的模型网格碰撞,应使用包围盒简易碰撞体替代
    • 如果可以的话,增加fixedUpdate的运行间隔
    • 使用高效的射线检测算法,并避免产生GC

    后续

    以上是我列出的将来可能涉及到的话题,有的可能就是一句话就能了解,有的可能深入探讨的话题就比较深入。

后续其它话题,我会陆续整理和更新。

2
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

【Unity技巧】Unity中的优化技术

写在前面这一篇是在Digital Tutors的一个系列教程的基础上总结扩展而得的~Digital Tutors是一个非常棒的教程网站,包含了多媒体领域很多方面的资料,非常酷!除此之外,还参考了Uni...
  • candycat1992
  • candycat1992
  • 2014-12-26 21:44
  • 100970

Unity中性能优化的一些经验与总结(脚本优化篇)

欢迎光顾本人的小站:原文链接最近一个星期,公司的项目正在做项目调优。也在不断的尝试当中找到了一些优化代码性能的思路。发现经常是在不经意的一些小地方,大大拉低了系统整体的性能。在编写Unity程序的时候...
  • u013709166
  • u013709166
  • 2017-02-09 00:10
  • 2265

【Unity优化】关于优化方面的整理

0.如果你做了一个图集是1024X1024的。此时你的界面上只用了图集中的一张很小的图,那么很抱歉1024X1024这张大图都需要载入你的内存里面,1024就是4M的内存,如果你做了10个1024的图...
  • ldy597321444
  • ldy597321444
  • 2016-07-08 18:22
  • 2742

关于Unity加载优化,你可能遇到这些问题

关于Unity加载优化,你可能遇到这些问题汇总
  • UWA4D
  • UWA4D
  • 2017-10-25 17:05
  • 451

unity性能优化

  • 2017-11-01 15:29
  • 1.43MB
  • 下载

unity优化—资源优化

这节主要讲unity资源优化,先学习一个概念吧:资源管道,原始文件通过内容管道变成了一个可被Unity高效使用的中间文件 ,这不是Unity里面的一个概念,但Unity的工作行为和它很类似;Uni...
  • u012565990
  • u012565990
  • 2016-07-01 00:50
  • 5077

Unity3D优化总结

1、在使用数组或ArrayList对象时应当注意 length=myArray.Length; for(int i=0;i<length;i++) { } 避免 for...
  • YeSy10
  • YeSy10
  • 2012-08-09 17:08
  • 23585

Unity优化总结

一、纹理压缩格式     非GPU支持的纹理格式,需要经过CPU解码;而GPU支持的纹理格式,GPU直接解码和显示,GPU的解码有很多优化,随机访问、快速寻址和并行解码等,因此效率高得多。而且,...
  • goodai007
  • goodai007
  • 2016-04-15 20:27
  • 2096

Unity性能优化一些学习总结

关于Unity性能优化的自我总结!! 1、硬件支持优化 (1)平台设置优化 减少FPS,在ProjectSetting-> Quality中的 VSync Count 参数会影响你的FPS,E...
  • wanzhihui0000
  • wanzhihui0000
  • 2016-12-27 12:17
  • 1427

Unity 自学与进阶必会目录

1. Unity 5权威讲解 #目录 第1章 Unity 5简介 1 1.1 Unity 3D游戏引擎的诞生 2 1.2 Unity 5的优势 2 1.2.1 支持多平台 2 1.2.2 集成开发环境...
  • Heartyhu
  • Heartyhu
  • 2016-12-19 14:25
  • 1085
    个人资料
    • 访问:87004次
    • 积分:1277
    • 等级:
    • 排名:千里之外
    • 原创:24篇
    • 转载:1篇
    • 译文:1篇
    • 评论:43条
    关于Andrew
    Unity游戏开发程序员,
    开源游戏引擎Cyclone2D作者,
    我最近在开发一款3D赛车游戏
    热爱图形学、物理学、架构等研究,
    有兴趣的同学加群:528266922。
    博客专栏
    最新评论