Unity开发Android应用优化指南(下)

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。所谓图集就是一张大的纹理,其中包含游戏中部分或全部的纹理。这种做法确实可以带来很大的性能提升!

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

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

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

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

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

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

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

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

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

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

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

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

与菜单元素交互时,一般做法是在元素显示时启用,不显示时禁用。但这并不是最高效的办法。实际上,启用与禁用会重新激活部分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应用优化指南(上)
转载自Unity官方中文社区

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容