unity优化

Unity教程之-Unity3d移动平台性能优化专题(11):脚本优化

 

上篇文章《Unity教程之-Unity3d移动平台性能优化专题(十):大量物体的处理》,本篇文章我们继续探讨优化策略:脚本优化!

最近一直忙于逻辑,就一段时间没管性能,然后放到红米上,突然一开始有严重卡顿。情况如下:

以前所有战斗初始化都是在Awake()里面执行,全部时间大概是1-2s,但由于是在awake中,从体验上会觉得是和loading一块,所以没有影 响。但现在增加了一个剧情,一开始设计的时候很简单,就是说剧情模式下执行剧情脚本,然后进入战斗再挂上战斗脚本。然后问题来了,我希望做到剧情和战斗的 无缝衔接,起码不要有明显的卡顿,不然剧情结束还要loading啥的太sb了。但现在的情况是,所有战斗脚本Awake有2s左右,基本就卡主了。性能 分析器也显示主要是资源加载和第一次初始化太耗时间。我主要从三个方面入手处理。 More

Unity教程之-Unity3d移动平台性能优化专题(十):大量物体的处理

 

上篇文章《Unity教程之-Unity3d移动平台性能优化(九):图形显示效果优化》,本篇文章我们继续探讨优化策略:

对于大量物体的处理,势必出现性能瓶颈,怎么采用折中的方式提升性能同时又不会明显降低表现形式是一个重要的问题。

同时在屏幕上呈现数百旋转、动态光照、金币收集。

  • 不可以:每个金币都是一个附有刚体和脚本的独立对象,以旋转并允许拾起金币。
  • 可以:金币是带动画纹理的粒子系统,一个脚本对所有金币进行碰撞检测,并按照它们与光源的距离设置颜色。

这是一个常见的案例,应该尽量在一个代码块中处理大量的对象,而不是让每个对象都自顾自的处理。

您的定制软体模拟

  • 不可以:这是一个枕头的世界,您可以到处乱扔并将其堆在一起。
  • 可以:您的角色就是一个枕头,且只是其中一个,它所处的环境在某种程度上是可以预测的(它仅仅与球体和轴对齐立方体碰撞)。对于功能并非全面,但是外观精致运行快速的软体模拟,可以为其编写代码。

30 个敌人角色同时向玩家射击

  • 不可以:每个敌人都有自己的蒙皮网格,拥有独立对象的武器,并在每次射击时实例化基于刚体的爆弹。在每帧运行的复杂的 AI 脚本中,每个敌人都考虑到其他同伴所处的状态。
  • 可以:大部分敌人距离很远,并且由单个子画面作为代表;或者,敌人是二维角色且不管如何只有一对子画面。每颗敌人的子弹都由同样的粒子系统绘制,并由只由处理基础物理的脚本模拟。每个敌人都按照该区域内其他敌人的状态,每秒更新两次 AI 状态。

这个AI的问题暂时不深入探讨。 对于大量的AI单元,让每一个AI都进行复杂思考是不切实际的。但具体的优化方案会十分复杂,单独在后面开启一个专题。 More

Unity教程之-Unity3d移动平台性能优化(九):图形显示效果优化

 
上篇文章《Unity教程之-Unity3d移动平台性能优化专题(八):Shader优化》,本篇文章我们继续探讨优化策略:为了好一点的图形效果可以酌情做哪些,哪些必须避免。

这次主要列举出一些可以提升游戏效果,但是却不会拖累性能的一些做法。

可以做的:

  • 有光照映射的静态几何体。但需注意:
    • 使用大量 alpha 测试的着色器。
    • 凹凸贴图 (Bumpmapping),尤其是使用内置着色器。
    • 高面多边形计算。
  • 动画角色,设置带有奇幻效果的着色器!但需注意:
    • 大规模人群或高模 (high-poly) 角色。
  • 子画面二维游戏。但需注意:
    • 过度绘制,或者大量图层在其他图层上方绘制。
  • 粒子效果。但需注意:
    • 大颗粒高密度。(大量粒子在其他粒子上方绘制。这是另一种过度绘制的情况)
    • 粒子数目很离奇,或者粒子碰撞体。
  • 物理。但需注意:
    • 网格碰撞体。
    • 大量活跃主体。

绝对不要做的:

  • 全屏屏幕效果,如光晕和景深。
  • 动态逐象素光照(多种光源标记为重要,且不会烘焙成光照贴图)
    • 每种受影响的对象会为您使用的每种动态光照吸引更多的时间,这将很快变慢。
  • 所有对象实时阴影
    • Unity 为移动平台的实时阴影提供本地支持,但是必须谨慎使用,且此功能可能仅限于更高端的设备。

毫无疑问,所有游戏都必须遵循自然规律。每颗抛物线炮弹的运动,闪亮镀鉻每一个像素的颜色,都通过第一次编写的公式获得,以模拟对现实世界的观测。但是, 游戏一部分是科学的模拟,另一部分则是绘画。仅使用物理上精确的渲染不足以让您在移动市场立足;因为这个市场的硬件有限,如果您想要原封不动地模拟现实世 界,最终将导致游戏受限制、单调且延迟。 More

Unity教程之-Unity3d移动平台性能优化专题(八):Shader优化

 

上篇文章《Unity教程之-Unity3d移动平台性能优化专题(七):GPU优化》,本篇文章我们继续探讨优化策略:

当然如果你完全可以采用内置的Mobile下面的shader是最好,性能肯定是杠杠的。但是相信绝大部分游戏还是不得不自己写shader,那就要注意写出高性能的shader。

1.复杂的数学函数(如 powexplogcossintan 等等)会大大增加 GPU 负担,所以一个好的经验法则是,此类运算在每个像素中不得超过一个。考虑在合适时使用查找纹理作为替代选择。

2.alpha 测试运算会让片段速度变慢。(on PowerVR GPUs found in iOS and some Android devices)

3.编写自定义的着色器时,应始终指定浮点变量精度。为获得最佳性能,挑选精度尽可能小的浮点格式至关重要。很多台式机 GPU 均完全忽略运算精确,但是它对于大量移动 GPU 的性能具有重大影响。

如果着色器使用 Cg/HLSL 编写,那么精度规定如下:

  • float — 完整的 32 位浮点格式,适合用于顶点变换,但性能最慢。
  • half — 简化的 16 位浮点格式,适用于纹理 UV 坐标且比 float 大约快两倍。
  • fixed — 10位定点格式,适合色彩、照明计算和其它高性能操作,速度大约比 float 快 4 倍

如果着色器以 GLSL ES 编写,那么浮点精度将分别规定为 highpmediumplowp

     4.大部分shader都有_Color属性,但如果你并没有使用,那么就应该去掉,避免无谓的计算。

5.通用的表面着色器虽然通用,但性能其实并不好,参考: More

Unity教程之-Unity3d移动平台性能优化专题(七):GPU优化

 

上篇文章《Unity教程之-Unity3d移动平台性能优化专题(六):动画优化》,本篇文章我们继续探讨优化策略:

GPU主要涉及的方面其实前面几个专题也提过了,现在主要提及一些针对GPU的方面的优化,当然有些手机是集成显卡的,那么可能就没啥效果了。

1.GPU 通常受供给比率或内存带宽的限制。所以你可以尝试降低分辨率,当然这个是已经跑步起来的机子才采用这种策略。

2.尽量降低 UV 贴图接缝和硬边缘的数目(顶点增加一倍)

       请注意,图形硬件处理顶点的实际数量通常和 3D 应用程序显示的数量有所不同。建模应用程序通常显示几何顶点的数量,例如构建模型不同角点的数量。但是,对于图形卡,将需要一些几何顶点拆分成两个或两个 以上的逻辑顶点来渲染。如果顶点有多个法线、UV 坐标或顶点颜色,则必须分割。因此,在 Unity 的顶点计数始终比 3D 应用程序计数高很多。

      3.使用压缩纹理 (Compressed Textures) 可以减少纹理的尺寸(使加载时间更快,内存占用更少),

     More

Unity教程之-Unity3d移动平台性能优化专题(六):动画优化

 

上篇文章《Unity教程之-Unity3d移动平台性能优化(五):音频优化》,本篇文章我们继续探讨优化策略:

动画的执行主要影响了cpu的性能,大概在10%左右的消耗。就是说33ms的消耗中,会有接近3-4ms在动画上。

首先不论如何,都建议采用新版的动画系统,新版动画系统各方面的优化有比旧版要强很多。

然后新版中有两种系统可以选择,一种是通用动画,一种是类人动画。这里建议使用通用,虽然类人在某种情况下性能更好,但在某种情况下会出现动画出现问题,以及更差的性能的情况,具体请参考官方文档。

接下来就谈谈新版通用动画的性能优化:

1.骨骼数。在已有 30 块骨骼的装置上增加 15 块骨骼,则在通用 (Generic) 模式下要多花 50% 的时间进行处理。所以尽量少的骨骼数是性能的基础。人的基本骨骼在30左右,即使加上附件,也尽量不要超过40。复杂一点50,再多就显得有点过头了。你可以自己算算,30个骨骼可以显示10个模型,但50个就只能显示6个了。 More

Unity教程之-Unity3d移动平台性能优化(五):音频优化

 

上篇文章《Unity教程之-Unity3d移动平台性能优化专题(四):设置性能级别》,本篇文章我们继续探讨优化策略:

这个也是往往会被大部分人忽略的点,因为从性能分析来看,似乎音频几乎没有任何消耗。其实是有的,不过确实很小,一般在百分之3的cpu。也就是说如果你是30帧,没帧33ms,那么这个消耗的部分就是33 * 0.03 = 1ms左右。就是1ms的消耗,看你愿不愿意节约了。我这里当然是建议节约,毕竟前面已经强调过好几次,u3d性能优化绝对不是你改了一两个点然后帧数嗖嗖的上去(除非你确实犯了低级错误),绝对是需要你修改几十个几百个点,然后性能才有积累性的提高。

扯了些废话,继续看怎么优化音频。这个主要参考unity3d官网提供的信息。 More

Unity教程之-Unity3d移动平台性能优化专题(四):设置性能级别

 

上篇文章《Unity教程之-unity3d移动平台性能优化专题(三):减少面数》,本篇文章我们继续探讨优化策略:

为不同性能的设备设置不同的性能级,这一条与其说是优化,不如说是折中。

为了表现基本的效果,即使你不停优化,有些硬性的东西在哪里,比如模型的精细程度,特效的绚丽程度。如果你要牺牲这种东西,可能会让游戏本身的质量 下降。那么是不是就啥都不管那些性能差的机子了。建议还是不要放弃,相信大部分人还是有老式机子的,而且正因为机子差,能玩的游戏不多,如果你的游戏还能 够跑起来,绝对是一个噱头,一种优势。

ok,说了那么多,就设想一下怎么让你的游戏在各个方面舍去然后才能跑在老设备上吧。首先你肯定需要找一台机子,然后要进行性能分析,查找到对应的瓶颈。 这里注意,u3d自带的性能分析器可能无法让你找到真正的瓶颈,因为你只能发现是渲染很费时,但你却不知道到底是啥原因引起的,这时候你需要找到对应的显 卡厂商提供的工具,这种工具一般能够显示非常详细的信息。 More

Unity教程之-unity3d移动平台性能优化专题(三):减少面数

 

上一篇文章Unity教程之-Unity3d移动平台上性能优化专题(二)我们学习了实时光照对优化的影响,本篇unity3d教程我们继续Unity3d移动平台优化专题:减少面数,下面开始

Watch out for vertex creep. Many mobile devices are actually pretty good at handling scenes with lots of verts.  But most GPUs fall down really hard after you pass a certain threshold of geometry per frame.  In order to run on lower-end hardware, we target 30k triangles per frame as a soft upper limit.  This might be a little conservative, but remember that some types of lights can increase your triangle count!

从这个大牛的原话我们可以看出,面数一旦到达了一定的阈值(这个阈值不同手机不一样),那么性能就会有所下降。他提供的参考是3w面。当然他说了这个比较保守,因为光照可能会引起更多的面,但如果你参考了专题(2),你就知道我们不会使用任何光照,所以我们可以提高这个数值,大概在5w面。

这个数值算是比较高的,然后很多游戏的场景其实都是用面片来做,往往就几百个面,那么就可以跳过这个专题了。 More

Unity教程之-Unity3d移动平台优化专题(二):不要使用实时光照

 

上一篇文章Unity教程之-Unity3d移动平台上性能优化专题(一)我们学习了如何减少unity中的Draw Call,本篇unity3d教程我们继续Unity3d移动平台优化专题:不要使用实时光照,下面开始

目前市面上的移动平台上的游戏,几乎没有用实时光照的,基本用的都是光照烘焙,因为对于大部分人而言,一个非常漂亮的光照烘焙过的场景已经足够好了,不用实时变化。而且如果你开了实时光照,基本上就和性能说byebye了。

那么光照烘焙相对来说也不难,可能对于大部分新手的问题是shader,我用的是光照shader啊,没有了光照,模型都变暗了。

这就涉及到shader的选择了,一般来说,不采用光照的话,你用的就会是显示纯纹理的shader,例如Unlit下面的Texture,mobile下面的Unlit,当然我建议你自己写一个,因为这种自带的如果你要修改其实并不好改。另外,你的贴图本身就要反映出明暗效果。不然质感会比较差。 More