Hi!
文章来源:Unity: Android Optimization Guide
现在开始渲染优化部分!首先,是光照! 如果可能不要使用动态的光照,而是选择无光照的纹理,因为光照计算会占用很多资源,尤其是要渲染很多对象。
你能使用烘焙光,如果它适合你的项目,因为它直接对纹理做一次光照的计算和绘制,并且它不会在游戏中会处理它。 https://docs.unity3d.com/Manual/LightMode-Baked.html
它允许你放置很多光照,创建复杂的光照场景,而不用考虑性能问题,因为所有的东西都将被烘焙到纹理上。 但是当然会失去动态光照的所有优点,比如动态阴影和你的移动对象在没有光照变化的情况下载关卡中前进时可能会感到不合适。
你可以用光照探测器来解决这个问题: https://docs.unity3d.com/Manual/LightProbes.html
这些探测器在光照烘焙的过程中也会存储光照信息,不是在纹理上,而是在空旷的地方。这样当有物体在光探测器周围移动的时候,之前烘焙的光照就不会照亮。
你可以做的另一件事情是在主要角色下面设置假的动态阴影。 如果适合你的游戏,你可以仅仅使用一个圆形的黑色阴影纹理在你的角色的周围移动,来代表它的影子,就像老的动画电影一样。
或者,你可以使用阴影投影器,它使用物体网格在它下面投射一个假的阴影,它不像动态照明那样逼真,但也许它对你的项目来说已经足够了,而且他需要更少的资源。
这里是一个使用阴影投射的Unity资产: https://assetstore.unity.com/packages/tools/particles-effects/fast-shadow-receiver-20094
如果你必须使用动态光照,一定要尽可能少的使用它们,并且在你整个游戏中只是用一个定向光照。 当然,在使用动态光照时,特别是在3D世界中,最重要的是真实的影子,但这正是在光照过程中渲染所需要资源最多的地方。
不过,我们可以使用一些值来得到我们想要的阴影,而不是牺牲性能。
在你仅有的定向光照上,你可以从设置剔除蒙板开始,只设置你想要投射的光照的物体层,因为我们不想要不必要的计算。
使用阴影分辨率设置,看看哪一个足够令人满意。当然,一个较低的分辨率会花费较少的资源。但是要注意,你再编辑器上看到的并不能代表你在设备上显示的内容,例如,一个低分辨率的阴影设置在你的电脑上可能会被认为是像素化的,但是在你的设备上就足够了。总要直接构建并且测试。
现在打开质量设置(Edit > Project Settings > Quality),来研究一下这些高级设置。 这里是你的窗口应该显示的样子:
这些设置真的会影响你的游戏性能,所有尽量去熟悉它。
为了减少光照计算,降低像素数量为1,或者0如果你没有光照。 抗锯齿 禁用抗锯齿如果可能的话,因为它会在手机上会消耗很多资源。 软粒子 如果你没有特别适用软粒子,也禁用它。 阴影 现在阴影才是真正重要的设置。 由于软阴影需要更多的资源,你可以选择“只使用硬阴影”选项。 但是使用这个选项,在非常低分辨率的时候,阴影会真的像素化和锯齿化。所有,你能做的就是把选项“Shadow Projection” 从“Stable Fit”到”Close Fit”,并且你将会看到阴影会降低像素化。
不要担心它在你的电脑屏幕上看上去很糟糕,记得去构建并直接在你的设备上测试。
现在设置“Shadow Cascades” 为”No Cascades”。 最终,调整”Shadow Distance”的值,慢慢缩小。你将发现远处的阴影正在消失。实际上,这个值表示阴影处理的距离。超过这个距离的阴影是不会被计算。所以减少这个值直到你满意你的阴影,同时,有了一个比较低的“Shadow Distance”。 所以,现在你的质量设置窗口应该像这样的:
当你查看编辑器Log的时候,你将一定会看到你的纹理占用了游戏中最多的内存。事实上,它们往往太大,无法达到它们的目的。 所以在你开始抱怨你的美术们之前,你能做的是去你的纹理“导入设置”里,在你的工程窗口里仅仅点击你的纹理。
1、点击“高级”箭头,现在检查“生成Mip地图”,Unity特别推荐它因为更快的的纹理加载速度和更低的渲染时间。 2、然后你可以使用“Max Size”选项,它压缩纹理以减少内存占用。事实上,纹理往往太大。 3、考虑到他们的目的(角色纹理,UI精灵,环境纹理等),你应该试着尽可能地减少”Max Size”,只要视觉方面适合你。
4、最后为了减少绘制调用,你可以使用纹理图集。图集是大的纹理文件,它包含几个或者全部的游戏纹理。这个真的能带来很大的性能收益。
Unity Android优化的另一个重要的章节是UI优化。因为正如你所看到的的,Unity的UI系统并没有得到很好的优化,但是幸运的是你可以找到一些聪明的想法来获得最好的性能。
当你在UI中使用精灵的时候,确定你的精灵尽可能减少透明区域,因为这些会产生多次绘制并且降低性能。 像纹理一样,你可以把你所有的UI精灵放到一个图集里,同时把它们的最大尺寸减小到最小。 另外,检查“Genetate Mip Maps”选项,这对你的UI来说真的很重要。因为它不仅花费更少的时间渲染,而且会使它在你的屏幕上更流畅。
在Unity里,U使用画布,尽可能的减少画布的使用,因为画布代表了在渲染过程中额外的计算。 也许你使用Canvas只用于显示目的,而不需要交互。在这种情况下,移除掉它上面的”Graphic Raycaster”组件,因为这意味着Canvas将会交互,并且必须检查交互。
当然,要提高性能,只需要取消”Pixel Perfect” 选项!你将会看到很棒的结果,尤其是在Scroll Rects。
文字组件在设备上真的会需要很多资源! 所以你所能做的就是禁用它的”富文本”。 对于没有交互的Image和Text组件,你可以取消选中”Reycast Target”,因为它将从Raycast计算中删除掉它们。
Unity推荐不要在很多文本中使用”Best Fit”选项,但是我还没有测试过,所以我不能说这是不是真的是一个坏习惯。
对于文本,你肯定会使用自定义字体,但是请小心,因为使用一些从网上找到的差质量的字体,你可能会有性能问题。 试着去保持小的字体数量,并且如果你有性能问题,试着禁用你所有文本组件的“Best Fit”选项。
我在一个论坛上看到这个小提示,并且我确定当你把Image和Text组件的“Material”留空,你的性能会比较慢。 所以你所能做的是在你的项目中创建一个新的Material,并且设置它的Shader为”UI/Default”,并且在每一个Image和Text上设置这个材质。
Rect Mask 2D是一个UI组件,和Mask组件相似,但是它有一个禁用UI 元素的优点,当UI元素位于Mask区域之外时,UI因此不会被渲染。这个会有助于改善性能。
另一个UI组件,Scroll Rect,被用来显示大量的内容,隐藏它的一部分,滚动它。它用做交互真的很酷很好。但是尽量不要使用太多,因为它真的没有对移动设备进行优化。 你可以使用前一个组件,Rect Mask 2D来改善Scroll Rect性能。
当启动菜单元素时,你自然会在元素显示在屏幕上和屏幕外时启用和禁用它们,但这不是最优化的方法。
实际上,禁用和启用可以在某些gameobject上能重启某些进程。例如,前面的Scroll Rect组件在启用是会重新填充和加载其内容,这会导致延迟峰值。
另一种可能是让GameObjects 启用但是使用Canvas Group。
这些组件非常有用,它们允许将元素分组并作为一个整体来控制它们的行为。 你可以使用透明度,组的Alpha,并且通过”Interactable”和”Blocks Raycasts”选项来禁用它们的交互性。所以使用这些选项来确保隐藏的菜单不能交互。
最后的但并非是最不重要的,你的游戏着色器。就渲染而言,这些都是非常神奇的。但是在设备上,它们真的会牺牲你的性能,所以你必须要小心它们。 我真的不是着色器方面的专家,所以我只能听警告你在移动设备上,优化着色器是多么的重要,并建议你看看互联网上是怎么做这个的。
我只知道关于移动设备着色器的关键字是保持简单。很少着色器不是很复杂但是很高效。 我能肯定的是,后处理着色器真的很耗费资源,所以不要在设备上使用它们或者优化并测试它们以保证游戏不会受太多影响。
这是我从我的上一个android项目上学到的。 我想把这些都放到一篇文章中,以便能分享并帮助其他的Unity开发者。 由于搜索和测试优化的过程花费了大量的时间,我也想为自己做一些类似的教程/提醒,以供将来的项目使用。 希望你能从中学到一些东西。
这里有一些链接可以引导你找到其他android优化的好技巧: Unity documentation on optimization: https://docs.unity3d.com/Manual/OptimizingGraphicsPerformance.html Other articles: https://divillysausages.com/2016/01/21/performance-tips-for-unity-2d-mobile/ http://www.paladinstudios.com/2012/07/30/4-ways-to-increase-performance-of-your-unity-game/
To use, see:Jektify - Doc
Goodbye!
Put a very powerful message.