我是靠谱客的博主 诚心咖啡豆,最近开发中收集的这篇文章主要介绍unity3d性能优化(资源篇)_skybeauty_新浪博客,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

大家应该知道在游戏中,占用内存最大的还是资源,下面就讲讲我们项目是如何做的:
首先就是资源大打包格式,大家可以参考官方地址:
file:///D:/Program Files/Unity/5.5.4p1/Unity/Editor/Data/Documentation/en/Manual/class-TextureImporterOverride.html

这里面列举了不同纹理打包格式所占用的内存大小,大家可以结合自己的项目美术风格做相应的设置,如果项目中美术风格比较明朗,色彩渐变比较细的话,那打包格式可以设置成RGBA32(完全无损无压缩),如果是针对色彩比较单一的可以采用对应的压缩格式,这样会极大的减少游戏中资源的内存占用。针对不同的平台可以选择对应的压缩格式,比如ios比较流行的是使用PVRTC对应格式,如果是android的话建议使用ETC2格式(GL ES 3.0)目前大部分手机还是支持GL ES3.0的,所以这个不用担心。从官方文档中可以看出一张1024X1024纹理图在RGBA 32 bit格式下占用内存是4M而在Android平台下RGBA Compressed ETC2格式下是1M,在IOS平台下RGBA Compressed PVRTC 4 bits中是0.5M,无论怎样的格式都需要根据项目情况而定。

如果情况好的话,是可以节省很大的内存的,如果因为项目原因,比如项目的美术风格比较明亮,那可能美术不愿意压缩图片,这样的话就需要自己做资源管理了,我在这里以我们的项目为例介绍一下。我们的项目就属于色彩比较明亮的美术风格,所以很多纹理图都是不能压缩的,这样的话,我们的纹理打包格式几乎都是设置成RGBA32格式的,游戏能也不少,这样下来游戏运行的过程中会达到很大的峰值导致闪退,比如ios6(内存1g)当内存占用查过600M左右的时候就会闪退,针对这一类低内存的手机我们做了资源删除,以功能为单位打包纹理图,并且提出公用的纹理图一直缓存。当功能界面关闭的时候就把该功能引用的纹理图删除,这样在运行的过程中就不会达到很大的峰值,大家可能目前都是用assetBundle加载资源的,所以就需要根据功能模块打一个ab,这样的话就可以根据ab卸载对应的纹理资源了。这样做的优势就是能保证游戏可以在底端手机上也能很好的运行,劣势就是可坑游戏的体验不是很好,就是加载比较慢,可能会很卡。所以如果游戏的总内存占用不是很大的话,建议不要这样做,毕竟体验不好,如果游戏的占用内存和美术商量不好的话,那可能就是要牺牲一部分玩家的体验了。不过还好就是,这些操作都是针对底端设备设置的,高端手机也就是内存>=2g的完全没必要这样处理。

资源管理也是性能优化的重中之重啊,我个人还是建议,无论怎样都需要将纹理按照功能细分开,这样就不需要一进游戏就加载很多资源,其次就是在后面做资源热更的时候,也不需要因为稍微的修改就更新很大。当然了,我们在做项目的时候一定要把握好度,并不是越细分越好。毕竟还是要考虑drawcall的。大家都了解影响drawcall的主要因素就是纹理图集。一般建议峰值drawcall不要超过150,不然玩家就会感觉到卡顿的情况。

性能优化的终极目标就是减少drawcall和overdraw:
影响drawcall主要有两个因素:1,纹理图集;2,shader
尽量一个单独的功能使用一个图集和公用shader
在以上的资源管理的时候一定要考虑drawcall的

下面说一下overdraw,主要是图片叠加导致的,特别是透明图片,目前可能有些项目中使用透明图片做点击操作,这边可以通过下面这个组件实现点击,不需要渲染:
using UnityEngine;
using System.Collections;

namespace UnityEngine.UI
{
    public class Empty4Raycast : MaskableGraphic
    {
        protected Empty4Raycast()
        {
            useLegacyMeshGeneration = false;
        }

        protected override void OnPopulateMesh(VertexHelper toFill)
        {
            toFill.Clear();
        }
    }
}
给物体添加这个组件就可以做相关点击操作了,建议项目中尽量减少透明图片的使用。还有一种情况就是在只做prefab的时候美术有时候可能为了效果,叠加好多层,当然有时候为了效果也就牺牲了overdraw,当然了这也是经常遇到的事情,其次就是prefab的排版问题导致的,比如两个image边缘透明像素叠加,有些情况是可以适当调整一下的。

在只做prefab的时候也要特别注意,有动画的部分和静态的部分尽量放到不同canvas上(unity的绘制是以canvas为单位的,这样可以减少不必要的绘制)

综上所述:资源合理管理,减少内存使用情况,减少drawcall,overdraw,

最后

以上就是诚心咖啡豆为你收集整理的unity3d性能优化(资源篇)_skybeauty_新浪博客的全部内容,希望文章能够帮你解决unity3d性能优化(资源篇)_skybeauty_新浪博客所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部