http://forum.china.unity3d.com/thread-27044-1-1.html

在Unity开发Android应用优化指南(上)一文中,从游戏性能,脚本等方面进行了分析和总结,今天这篇文章将由Niels Tiercelin继续分享在光照,UI,着色器等方面优化的经验。

光照

接下来讨论渲染优化,首先要讲的是光照。尽可能不要使用动态光照,尽量使用不带光照的纹理。因为光照计算需要占用大量资源,尤其是当场景中有很多物体需要渲染时。

烘焙光照

如果可以,尽量利用烘焙光照(Baked Lighting)技术来满足项目需求,该技术会将光照结果一次性地直接“绘制”在纹理中,最后游戏中无需进行任何计算。

通过这种方法您可以随意放置光源,制作复杂场景而无需考虑性能,因为所有光照都会被烘焙到纹理中。当然,这样就失去了动态光照的一些特性,例如动态阴影,且由于光源没有任何变化,物体在场景中的移动可能会让玩家产生违和感。

光照探头

可以利用光照探头(Light Probes)来解决烘焙光照无法动态变化的问题。这些探头会在光照烘焙时将环境光信息存储起来,不同的是它并非保存在纹理而是停在空间的某个位置。通过这种方式,物体在探头活动区域内移动时就会被预先烘焙好的光照“照亮”。

阴影投射器

另一种方式是为场景中的重要角色使用假动态阴影。可以在角色的脚底放个圆形黑色纹理,让玩家觉得“这就是阴影”,和老式电影一样。当然前提是这种做法适合您的游戏。

 

右侧:初始阴影 —— 左侧:“blob 阴影” 纹理

您也可以使用阴影投射器,这种技术会利用物体本身的网格信息,在其下方投射出以假乱真的阴影。尽管这不是动态光源投射出的那种真实阴影,但用在项目中应该足够了,而且它使用的资源也更少。

还可以借助Fast Shadow Receiver插件来实现阴影投射。3D空间中,阴影是不可或缺的重要元素。然而阴影的渲染会给GPU带来很大的负担。

阴影

如果一定要用动态光照,请保证数量越少越好,并且整个游戏中仅使用一个方向光源。当然,使用动态光源有个很大的益处,尤其是在3D世界中,可以实现比较真实的阴影,但这也是光照处理过程中占用资源最多的步骤。

为了达到实用与性能之间的平衡,可以通过调整参数来得到理想的阴影效果。

方向光设置

在场景唯一的方向光上,可以将Culling Mask设为仅影响需要被光照的GameObject,以免消耗更多性能。多多尝试设置 Shadows Resolution 的值,找到刚好合乎需求的设置。当然,分辨率越低,消耗的资源就越少。但有一点要注意,编辑器中的效果不一定与设备上的显示效果一致。例如设置了某种低分辨率阴影,在电脑上看起来可能很粗糙,但在设备上可能刚刚好。因此记得在设备上查看最终结果。

质量设置

打开Quality Settings (Edit > Project Settings > Quality),看看其中的设置。

这些设置会切实影响到游戏性能表现,所以尽量理解它们的作用。

  • Pixel Count:如需减少光照计算所需的量,将 “Pixel Count” 的值降为1,如果没有任何光源则设为0。

  • Antialiasing:最好不要启用抗锯齿(Antialiasing),因为对于移动设备来说这是消耗过大。

  • Soft particles:如果对软粒子没有特别需求则不要启用该选项。

  • Shadows:仔细调整阴影相关的参数,它非常重要。

软阴影(Soft Shadows)会占用更多资源,您可以选择仅使用硬阴影“Hard Shadows Only”。不过硬阴影有个缺点,分辨率很低时这种阴影看起来颗粒感很强。解决方案是设置 “Shadow Projection” 选项,将“Stable Fit” 改为 “Close Fit”,这样可以或多或少地缓解这种颗粒感。如果调整后画面看起来效果很差,别急!在设备上运行看看实际效果。

最后,慢慢减少“Shadow Distance”的值。可以看到远处的阴影开始消失。这个选项就是用来设置需要处理的阴影距离。超过该距离的阴影会被忽略。所以将该值减小至理想效果即可。

现在Quality Settings窗口如下图:

纹理

如果仔细研究编辑器日志,会发现纹理是游戏内存占用大头。大多数情况下,这些纹理占用的内存远远地超过了它们的价值。可以先在项目窗口中点击纹理,进入纹理的 “Import Settings”。

点击 “Advanced” 箭头,勾选 “Generate Mip Maps”。Unity强烈推荐勾选该选项,它可以加快纹理的载入速度,降低渲染时间。

试着调整 “Max Size” 选项,该选项可以压缩纹理从而减少内存占用,当然纹理总是需要很大空间的。考虑到纹理的用途(角色纹理,UI元素,环境纹理等等),您应尝试尽量降低 “Max Size”中的值,降低到您觉得合适为止。

最后,可以使用纹理图集(Atlas)减少DrawCall。所谓图集就是一张大的纹理,其中包含游戏中部分或全部的纹理。这种做法确实可以带来很大的性能提升!

UI

谈到Unity Android优化,另一个很大的课题是UI方面的优化。可以利用一些小技巧来获得最佳性能表现。

Sprites

在UI中使用精灵(Sprite)时,保证其中透明区域越少越好,因为这会影响性能表现。可以像纹理一样将所有UI Sprite放到一个图集中,然后将 “Max Size” 设为可以接受的值。

同时勾选 “Generate Mip Maps” 选项,UI不仅需要更快的渲染速度,同时最好也能流畅地显示在屏幕上。

Canvas

Unity中,UI是与Canvas一起搭配使用的。尽量减少Canvas存在的数量,因为一个Canvas就表示需要进行一次渲染处理。

有时候您的UI不需要与用户交互,此时可以移除 “Graphic Raycaster” 组件。因为后者是用来检测交互操作的。

此外,取消勾选“Pixel Perfect”选项可以获得更佳性能,尤其是使用Scrool Rects时。

文本与图像

文本(Text)组件对移动设备的性能要求很高,所以可以禁用 “Rich Text”功能。

如果图像与文本组件无需与玩家交互,可以取消勾选 “Raycast Target”,从而避免不必要的射线检测计算。

字体

使用文本对象时常希望自己设置字体。但要小心,网上的一些低质量字体可能会带来性能方面的问题。尽量使用字符集较小的字体,如果遇到性能问题,请尝试取消勾选所有Text组件的 “Best Fit”选项。

UI材质

经确认,如果图像和文本组件的材质一栏为空,那么它将拖慢运行速度。我们要做的是新建一个材质,着色器就用“UI/Default”,然后让所有的图像和文字组件使用该材质。

Rect Mask 2D

Rect Mask 2D是一种UI组件,与Mask组件类似。不同的是前者可以在UI元素超出遮罩区域时禁用这个元素,从而避免多余的渲染工作。

Scroll Rect

另一种UI组件Scroll Rect是用来显示大量内容的,它会隐藏部分内容并允许用户进行滚动操作。这种组件的交互可以给玩家带来更佳体验,但尽量少用,因为它对移动设别并不是特别友好。可以将其与Rect Mask 2D组件配合使用,以获得更佳性能。

Canvas Group与动画菜单

与菜单元素交互时,一般做法是在元素显示时启用,不显示时禁用。但这并不是最高效的办法。实际上,启用与禁用会重新激活部分GameObject上的一些操作。例如前面提到的Scroll Rect,在启用时会重新载入其中填充的内容,这种操作可能会产生卡顿。

还有一种方法是就让GameObject保持激活,但使用Canvas Group进行管理。

​ 

这些组件很实用,它可以将UI元素分组,并整体地控制它们的行为。您可以尝试调整透明度,即Canvas Group的“Alpha”,然后禁用UI的交互功能(使用“Interactable” 和 “Blocks Raycasts”选项)。

着色器

最后也是最重要的,来探讨一下着色器。从渲染的角度来看,这是一种很神奇的东西,但对于移动设备,它可能会瞬间榨干设备的性能,因此一定要当心。

从Niels的经验来看,着色器的Keyword越少越好、着色器数量越少越好、内容越简单越好。PostProcessing着色器是性能消耗大户,所以不要在移动设备上使用,或者提前做好功课做足测试,保证移动设备上的运行性能。

总结

以上就是Niels从刚做完的Android项目中学到的经验,并将其总结在这篇文章里,以帮助其他更多的Unity开发者。优化通常需要花费大量时间来寻找性能瓶颈并进行测试,希望这篇文章对正在使用Unity进行开发的朋友们有帮助。我们还会分享一些Unity项目制作及优化经验在Unity官方中文社区(unitychina.cn),请保持关注!

Unity开发Android应用优化指南(下)的更多相关文章

  1. Unity开发Android应用优化指南(上)

    http://forum.china.unity3d.com/thread-27037-1-2.html 如今越来越多的开发者使用Unity开发Android及iOS项目,开发过程中难免会遇到一些性能 ...

  2. Unity开发Android应用程序:调用安卓应用程序功能

    开发环境: Eclipse3.4 + adt12 + jdk6 + AndroidSDK2.2 Unity3.4 + windows7 测试设备: HTC Desire HD 本文要涉及到的几个重点问 ...

  3. unity开发android游戏

    环境搭建: Unity+JDK+Android Studio+Android SDK(+NDK) 教程:unity开发android游戏(一)搭建Unity安卓开发环境 注意“Build System ...

  4. unity开发android游戏(一)搭建Unity安卓开发环境

    unity开发android游戏(一)搭建Unity安卓开发环境 分类: Unity2014-03-23 16:14 5626人阅读 评论(2) 收藏 举报 unity开发androidunity安卓 ...

  5. Android图片优化指南

    图片作为内存消耗大户,一直是开发人员尝试优化的重点对象.Bitmap的内存从3.0以前的位于native,到后来改成jvm,再到8.0又改回到native.fresco花费很多精力在5.0系统之前把B ...

  6. 【转】unity开发android游戏(一)搭建Unity安卓开发环境

    http://blog.csdn.net/chenggong2dm/article/details/20654075 1,下载安装Java的JDK: http://www.oracle.com/tec ...

  7. 使用Unity开发Android的几种调试方法

    前言 本文举例几种Android 调试的方法(PS:我是通过unity引擎来开发安卓游戏) Eclipse + adt 查看LOG 1.为Eclipse 装上adt 插件 2.打开Eclipse 的L ...

  8. Unity编译Android的原理解析和apk打包分析

    作者介绍:张坤 最近由于想在Scene的脚本组件中,调用Android的Activity的相关接口,就需要弄明白Scene和Activity的实际对应关系,并对Unity调用Android的部分原理进 ...

  9. 面向英特尔® x86 平台的 Unity* 优化指南: 第 1 部分

    原文地址 目录 工具 Unity 分析器 GPA 系统分析器 GPA 帧分析器 如要充分发挥 x86 平台的作用,您可以在项目中进行多种性能优化,以最大限度地提升性能. 在本指南中,我们将展示 Uni ...

随机推荐

  1. fragment静态加载

    import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.util.Log; / ...

  2. debian7配置

    输入法: apt-get install ibus ibus-pinyin 并执行ibus-setup进行配置,首选项->输入法->中文,然后按添加按钮即可. 软件开发基本软件:apt-g ...

  3. BZOJ 1207 [HNOI2004]打鼹鼠:dp【类似最长上升子序列】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1207 题意: 有一个n*n的网格,接下来一段时间内会有m只鼹鼠出现. 第i只鼹鼠会在tim ...

  4. css(3)

    行内元素和块内元素可以通过定义display的属性值进行相互转换. 想要叫ul中的li实现横向显示可以在li中加入布局"float:left": 如: /*这个用于控制单个图片区域 ...

  5. Linux下的磁盘缓存

    转自:http://blog.csdn.net/cywosp/article/details/21126161 前段时间在开发一个使用SSD做缓存的系统,在高速写入数据时会出现大量的磁盘缓存.太多的磁 ...

  6. 集训Day4

    在bzoj刷了好几天杂题感觉手感不是很好 继续回来集训一下 好几天没更新了啊... bzoj1875 一个无向图,一个人要从起始点走$t$步走到终点,不能沿着刚走过来那条边回去,问有多少种走法 $m ...

  7. win8、win10下卸载程序报错误2502、2503的解决办法

    首先打开任务管理器,可以通过右键点击桌面上的任务栏打开任务管理器,也可以通过同时按下键盘上的Ctrl+Alt+Delete键打开任务管理器. 打开任务管理器后,切换到“详细信息”选项卡,找到explo ...

  8. bzoj 4515: 游戏 树链剖分+线段树

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=4515 题解: 先让我%一发lych大佬点我去看dalao的题解 讲的很详细. 这里纠正一 ...

  9. JVM内存溢出环境备份方法

    线上Tomcat服务内存溢出,且不容易重现,又没配置JMX监控端口,如何在不重启Tomcat的情况下备份堆dump和线程dump,进而分析原因? 因为Tomcat以服务模式运行,直接用JVisualV ...

  10. MySQL 用户管理与权限管理

    MySQL 用户管理与权限管理 -- 操作环境mysql> show variables like 'version';  +---------------+--------+| Variabl ...