unity 移动开发优化二 图形优化,脚本优化概述

手机优化实用指南

本指南是为刚接触手机游戏开发的开发者准备的,他们可能会感到不知所措,他们要么正在计划并制作一款新的手机游戏原型,要么正在将一个现有的项目移植到移动设备上以使其顺利运行. 本指南对于任何针对旧的pc和上网本开发手机游戏或浏览器游戏的人来说都是有用的参考。

优化是一个广泛的主题,如何实现它在很大程度上取决于你的游戏。因此,最好将本指南作为介绍或参考,而不是保证产品顺利的逐步指南。

并非所有的移动设备都是一样的

这里的信息假设硬件水平在Apple A4芯片组附近,这是用于最初的iPad、iPhone 3GS和第三代iPod Touch上的. O在Android方面,这意味着像Nexus One这样的Android手机,或者大多数运行Android 2.3 Gingerbread的手机.这些设备大部分是在2010年初发布的。在迫切需要应用程序的市场之外,这些设备是较旧的、速度较慢的部分,但是它们应该得到支持,因为它们代表了市场的很大一部分。

浏览苹果移动设备技术规格概述, see documentation on iPhone hardware. 非常低端的苹果移动设备(如iPhone 3G)和第一代和第二代iPod touch都是非常有限的,必须更加小心地优化它们.然而,对于没有升级设备的消费者是否会购买应用程序,还存在一些问题. 所以,除非你是在做一个免费的应用程序,否则支持旧的硬件可能是不值得的

市面上有速度慢得多、速度快得多的手机,移动设备的计算能力正在以惊人的速度增长.新一代移动GPU的速度是上一代的5倍,这并非闻所未闻。与PC行业相比,这个速度快得令人难以置信。

将优化作为设计考虑,而不是最后一步

英国计算机科学家迈克尔·a·杰克逊经常被引用他的程序优化规则:

“The first rule of program optimization: don’t do it. The second rule of program optimization (for experts only!): don’t do it yet.”

他的基本原理是,考虑到计算机的速度有多快,它们的增长速度有多快,如果你编写一个程序,它很有可能运行得足够快。此外,如果您试图进行过多的优化,您可能会使事情过于复杂,限制自己,或者产生bug。

然而,如果你正在开发手机游戏,还有另外一个需要考虑的问题: 目前市场上的硬件与我们使用的电脑相比是非常有限的,所以创造一些不能在设备上运行的东西的风险抵消了从一开始就进行优化所带来的过于复杂的风险。

在本指南中,我们将尝试指出哪些情况下优化会有很大帮助,而哪些情况下优化只是无关紧要的。

优化:不只是针对程序员

艺术家们还需要知道这个平台的局限性,以及用来绕过它们的方法,这样他们就可以做出创造性的选择,而不必重新制作作品。

扫描二维码关注公众号,回复: 9600143 查看本文章
  • 如果游戏设计需要将氛围和灯光绘制到纹理中而不是烘焙,那么更多的责任将落在艺术家身上。
  • 只要任何东西可以烘焙,艺术家就可以制作烘焙内容,而不是实时渲染
    .这允许他们忽略技术限制,自由工作

为你的游戏设计一个流畅的运行时间

这两个页面详细描述了游戏性能的总体趋势,并解释了如何才能最好地设计出需要优化的游戏,以及如何在已经投入生产的情况下直观地找出需要优化的内容。

Profile early and often:经常profile

Profiling 是很重要的,因为它可以帮助您辨别哪些优化会带来较大的性能提升,哪些优化会浪费您的时间.由于渲染是在单独的芯片(GPU)上处理的,渲染一帧所用的时间不是CPU所用的时间加上GPU所用的时间。相反,它是两者中较长的一个。

这意味着如果CPU速度比较慢,优化你的着色器根本不会增加帧率,如果GPU速度比较慢,优化物理和脚本将毫无帮助。

通常,游戏的不同部分和不同的情况表现也不同. 这意味着游戏的一部分可能会因为一个脚本而导致100毫秒的帧数,游戏的另一部分可能会导致相同的减速,但这是由于正在呈现的内容.如果你想优化你的游戏,你至少需要知道所有的瓶颈在哪里。

Unity Profiler

你可以用main Profiler in Unity 当针对iOS、Android或Tizen. See documentation on the Profiler for basic instructions on how to use it.

Internal profilers

Android和iOS都有一个内置的内部分析器, 每30帧分析一次,打印一次报告.它可以帮助你确定到底是那一部分拖慢了速度 (such as physics, scripts, or rendering), 但并没有涉及太多细节 (例如,它不能告诉你哪个脚本或渲染器是罪魁祸首).

  • 如果分析器指出您的大部分处理时间花费在渲染上, see documentation on Rendering Optimizations
  • 如果分析器指出您的处理时间大部分花费在渲染之外, see documentation on Scripting Optimizations

See documentation on Internal profilers for information on how they work and how to turn them on.

一:Graphics Methods

移动设备能做什么?你应该如何计划你的游戏?如果你的游戏运行缓慢,且 profiler表示这是一个渲染瓶颈,你如何知道要改变什么,如何使你的游戏看起来不错,但仍然运行得很快? 这一页是专门为方法的一般和非技术的说明. If you are looking for the specifics, see the Rendering Optimizations page.

 你可以期待运行什么在当前消费者的手机上:

  • Lightmapped静态几何物体. 但要注意的:
    • 不要使用大量的alpha-test shaders
    • 凹凸贴图, 尤其是使用内置的shaders
    • 高面多边形数量
  • 动画人物,即使有简洁的着色器!但要注意的:
    • 大量的人群或高多边形人物
  • 2D 游戏. But beware of:
    • drawcall, or, 许多层画在彼此的上面,叫过度绘制.
  • 粒子特效. But beware of:
    • 有很多半径比较大的粒子. (很多粒子绘制在一起.这是overdraw 的另外一种情况)
    • 粒子数太多,或者粒子碰撞太多
  • Physics. But beware of:
    • 少用Mesh colliders.
    • 很多的 active bodies.

手机上不能期望什么:

  • 全屏图像效果,如辉光和景深
  • 动态照明 (多个标记为重要的灯并没有被放入光照图中)
    • 每一个受影响的对象都要为你使用的每一个动态光绘制额外的时间,这很快就会变慢。
  • 实时投影到每一个游戏物体上
  •   Unity支持移动平台上的实时阴影,但它们的使用必须非常谨慎,并且可能仅限于高端设备。

Examples - 顶级手机游戏是如何制作的

  • 暗影枪神

 

“Shadowgun”是一个令人印象深刻的例子,说明了在当前的移动硬件上可以做什么. 但更具体地说,这是一个很好的例子,说明什么是不能做的,以及如何绕过限制。特别是因为这篇博客文章已经公开了游戏的一小部分

这里是一个基本纲要的事情,Shadowgun做,以保持性能:

  • 动态照明- 尽量少用.
    • 使用斑点阴影和光照贴图来代替任何真实的阴影。
    • Lightprobes,而不是真正的灯,被用在他们的角色上.
      • 通过脚本将枪口闪光添加到lightprobe数据中.
    • 唯一的动态逐像素照明是用于计算人物上的BRDF的任意光方向s.
  • 凹凸贴图- 尽量少用.
    • 真正的凹凸映射只用于角色身上.
    • 漫反射贴图中包含了尽可能多的对比度和细节。来自凹凸贴图的照明信息被加入其中。
    • 一个很好的例子是他们的雕像纹理,或者他们闪亮的墙壁,就像右边看到的那样. 有使用凹凸贴图来渲染这些,通过烘烤纹理来伪造镜面效果.Lightmapping与基于顶点光照的高光相结合,使这些模型具有闪亮的外观。
    • If you want to learn how to create textures like this one, check out the Rendering Optimizations page.
  • 密集的粒子 - 避免
    • uv滚动纹理代替了密集的粒子效果
  • 雾效果- 避免.
    • 他们的神射线是手工制作的。
    •  用一张面片淡入淡出是用来实现电影雾效果,而实际上没有渲染任何雾。
      • 这更快,因为plane很少,而且间隔很远, 这意味着雾不需要在每个像素和每个着色器中计算。
  • 光晕 - avoided.
    • 多个混合的sprite来表示一个物体的光晕,而不是真实的光
  • Sky Castle Demo:天空城堡演示

    这个演示旨在展示Unity在高端安卓设备上的能力。

  •  动态光照- 没有使用
    • 只是用了光照贴图.
  • 凹凸贴图- 使用了
    • 所有的砖块都是凹凸映射的,由定向光映射来照明. 这就是“高端设备”发挥作用的地方.
  • 实时反射光 - 限制使用.
    • 将反射探头放在单独的区域, 所以同时只有一个起作用,需要渲染两次的环境可以很容易地剔除。

底线-这对你的游戏意味着什么

你越尊重和理解移动设备的局限性,你的游戏看起来就越好,它会变得更平滑.如果你想做一个高级的手机游戏,你将受益于理解Unity的图形管道和能够编写自己的着色器. 但是如果你想要抓点什么东西马上就用,这里有ShadowGun的着色器,是个不错的开始。

不要模仿它,烘焙它!

毫无疑问,游戏试图遵循自然法则.游戏是科学模拟和绘画的一部分.如果你一直试图模仿真实世界,你的游戏将会变得有限、乏味和落后。

你必须选择你的多边形和混合模式,就像他们是画笔。

What works well:

What does not work:

    • static几何图形使用光照贴图
    • 舞台照明和动态环境不能混合,选择其中的一个.
  • 对移动对象使用Lightprobes
    • 目前的移动硬件并不能真正地适应大量的动态光,也不能做阴影。Lightprobes对于带有静态照明的复杂游戏世界来说是一个非常棒的解决方案。
  • Specialized shaders and detailed, high-contrast textures
    • The shaders in ShadowGun minimize per-pixel calculations and exploit complex and high-quality textures. See the Rendering Optimizations page for information on how to make textures that look great even when the shader is simple.
  • Cartoon Graphics
    • 谁说你的游戏必须看起来像一张照片?如果你让灯光和氛围的责任纹理的艺术家,而不是引擎,你几乎不必担心优化渲染
  • 光晕和其他预处理镜头效果
    • 使用blended quads,来代替这种效果
  • Bumpmapping,特别是内置的着色器
    • 尽量少用,只在最重要的人物或对象上使用.任何可以占据整个屏幕的东西都不应该被bumpmap。
    • 而不是使用凹凸贴图,烘焙更多的细节和对比度到漫反射纹理.

二:脚本和游戏方法

这里的核心思想是游戏设计和优化并不是真正独立的过程; 你在设计游戏时所做的决定能够让游戏变得既有趣又快速。

A historical example

你可能还记得以前的游戏,玩家一次只能在屏幕上玩一次, 重新加载的速度是由子弹是否错过来控制的,而不是由计时器来控制的. 这种技术叫做对象池,它简化了内存管理,使程序运行更顺畅.

太空入侵者的创造者只有少量的RAM,他们必须确保他们的程序永远不需要分配超过可用的内存。如果他们让玩家每秒钟开火一次,他们必须分配足够的内存, 所以他们只分配了一个投掷物.一旦弹丸死亡,它只是失活,并重新定位和激活时,它再次发射.但它总是存在于内存中的相同空间中,不需要四处移动或不断地删除和重新创建.

优化,还是游戏玩法的精华?

这几乎是不现实的,但它碰巧是有趣的. 紧张是在一个高潮时刻,当外星入侵者接近地面,类似于电影或文学的高潮. 入侵者的近距离攻击给了内行玩家近乎瞬间的重新加载时间,让他们能够在完美的时间内通过粉碎火焰键奇迹般地保卫地球. .

你可能无法同时在与移动硬件互动和玩游戏时规划出游戏的各个方面.

Will X run fast on Mobiles?

通常情况下,如果你以最简单的方式编写游戏代码,或者以最通用和通用的方式编写游戏代码,你将很快遇到性能问题. 你越依赖特定的结构和技巧去运行你的游戏,你的视野便会越开阔,你便能够在屏幕上塞入更多内容。

简单和多才多艺,但缓慢

  • Rigidbodies在2D游戏中限制为2个维度
  • Rigidbodies 在炮弹.
  • 使用实例化和销毁很多。
  • 人物有许多的个人3D物品
  • 每一帧进行计算
  •  使用OnGUI

复杂和有限,但更快

  • 为2D游戏编写自己的物理代码。
  • 自己处理弹丸的碰撞检测。
  • 使用对象池而不是实例化和销毁。
  • 在粒子上使用动画精灵来表示简单的对象。
  • 每隔几帧执行昂贵的计算并缓存结果。
  • 自定义GUI解决方案.

Examples

数以百计的旋转,动态照明,可收集的硬币在屏幕上绘制一次

  • NO: 每个硬币都是一个独立的物体,有一个刚体和一个旋转它的脚本,允许它被捡起来。
  • YES: 这些硬币是一个带有动画纹理的粒子系统,一个脚本对所有的硬币进行碰撞测试,并根据到光的距离设置它们的颜色。
    • 这个例子是在 Scripting Optimization page.

您定制的软体模拟

  • NO: 世界上到处都有枕头,你可以把它们扔来扔去,堆成一堆。
  • YES: 你的角色是一个枕头,它们只有一个,并且它所处的情况在某种程度上是可以预测的(它只与球体和轴向排列的立方体发生碰撞)。你也许可以编写一些不是全功能的软体模拟,但看起来确实令人印象深刻,运行速度很快的东西。

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

  • NO: 每个敌人都有自己的 skinned mesh, 一个单独的武器, 并在每次发射时实例化一个基于刚体的投射体. Each enemy takes 在运行每一帧的复杂人工智能脚本中,所有同胞的状态都被考虑在内。
  • YES: 大多数敌人都是远距离的,并且是由单个精灵代表的,或者,敌人是2D的,并且只是一对精灵,每一个敌人的子弹都是被同一个粒子系统绘制的.每个敌人根据其区域内其他敌人的状态每秒更新AI状态两次。

 

发布了80 篇原创文章 · 获赞 7 · 访问量 2677

猜你喜欢

转载自blog.csdn.net/qq_37672438/article/details/104477388