前言

正在学习Doctor 张.鑫大佬的移动游戏加载性能和内存管理,内容非常非常的干,所以我烧了很多开水,边喝边看,一边拿小本几做好笔记

本文只是关于前2章的内容笔记,关于各种资源的加载耗时

纹理资源加载耗时


重复加载十次,取平均值

纹理尺寸测试结论

1、纹理资源的分辨率对加载性能影响较大,分辨率越高,其加载越为耗时。设备性能越差,其耗时差别越为明显;

2、设备越好,加载效率确实越高。但是,对于硬件支持纹理(ETC1/PVRTC)来说,中高端设备的加载效率差别已经很小,比如图中的红米Note2和三星S6设备,差别已经很不明显。


纹理格式测试结论

1、纹理资源的格式对加载性能影响同样较大,Android平台上,ETC1和ETC2的加载效率最高。同样,iOS平台上,PVRTC 4BPP的加载效率最高。

2、RGBA16格式纹理的加载效率同样很高,与RGBA32格式相比,其加载效率与ETC1/PVRTC非常接近,并且设备越好,加载开销差别越不明显;

3、RGBA32格式纹理的加载效率受硬件设备的性能影响较大,ETC/PVRTC/RGBA16受硬件设备的影响较低。

网格资源加载耗时

网格面数加载耗时结论

1、资源的数据量对加载性能影响较大,面片数越多,其加载越为耗时。设备性能越差,其耗时差别越为明显;

2、随着硬件设备性能的提升,其加载效率差异越来越不明显。

相同面片数、不同顶点属性的加载效率测试

网格顶点属性测试结论

1、顶点属性的增加对内存和AssetBundle包体大小影响较大。与测试1中未引入Tangent顶点属性的网格数据相比,测试2中的网格数据在内存上均大幅度增加(增加量与网格顶点数有关),且AssetBundle大小同样有成倍(1~2)的增加。

2、顶点属性增加对于加载效率影响较大,且顶点数越多,影响越大。

网格加载结论

1、在保证视觉效果的前提下,尽可能采用“够用就好”的原则,即降低网格资源的顶点数量和面片数量;

2、研发团队对于顶点属性的使用需谨慎处理。通过以上分析可以看出,顶点属性越多,则内存占用越高,加载时间越长;

3、如果在项目运行过程中对网格资源数据不进行读写操作(比如Morphing动画等),那么建议将Read/Write功能关闭,既可以提升加载效率,又可以大幅度降低内存占用。

AnimationClip资源加载耗时

防范大于救灾!

资源加载耗时测试结论

  1. Optimal压缩方式确实可以提升资源的加载效率,无论是在高端机、中端机还是低端机上;
  2. 硬件设备性能越好,其加载效率越高。但随着设备的提升,Keyframe Reduction和Optimal的加载效率提升已不十分明显;
  3. Optimal压缩方式可能会降低动画的视觉质量,因此,是否最终选择Optimal压缩模式,还需根据最终视觉效果的接受程度来决定。

这里是说的一个动画精度的问题,unity的动画文件是一个txt,打开后可以把浮点数的精度,从小数点8位,压缩到3位。 在内存跟体积上都有很大提升

动画类型,Humanoid会比Generic类型小很多,其原理是因为Humanoid把动画数据转到了肌肉空间,从原来的xyzw四个值,变成了一个value值,所以体积小很多

Shader加载耗时

Shader解析耗时结论

1、Shader资源的物理体积与内存占用虽然很小,但其加载耗时开销的CPU占用很高,这主要是因为Shader的解析CPU开销很高,成为了Shader资源加载的性能瓶颈;

2、Mobile/Particles Additive在解析方面的耗时远小于Mobile/Diffuse、Mobile/Bumped Diffsue甚至Mobile/VertexLit;

3、除Mobile/Particles Additive外,其他三个主流Shader在加载时均会造成明显的降帧,甚至卡顿。因此,研发团队应尽可能避免在非切换场景时刻进行Shader的加载操作;

4、随着硬件设备性能的提升,其解析效率差异越来越不明显。

Shader解析耗时如何优化?

1、通过依赖关系打包,将项目中的所有Shader抽离并打成一个独立的AssetBundle文件,其他AssetBundle与其建立依赖;

2、Shader的AssetBundle文件在游戏启动后即进行加载并常驻内存,因为一款项目的Shader种类数量一般在50~100不等,且每个均很小,即便全部常驻内存,其内存总占用量也不会超过2MB;

3、后续Prefab加载和实例化后,Unity引擎会通过AssetBundle之间的依赖关系直接找到对应的Shader资源进行使用,而不会再进行加载和解析操作。

音频资源

结论

从包体大小来说,使用mp3包的体积会下来,如果对音质要求不大的,建议用mp3格式

背景音乐建议用Streaming + 开启Load in Background模式在子线程加载

技能音效可以使用Decompressed On Load,降低cpu开销,内存会大一些,不过技能音频都比较短

粒子系统加载耗时

建议材质剥离,不然每个粒子系统都要加载材质耗时变高
建议多个常用粒子系统,捆绑在一起加载

总结

本篇从以下几大块,列举了unity游戏加载的各类耗时

  1. 纹理资源加载
  2. 网格加载
  3. Animation加载
  4. Shader解析
  5. 音频资源

资源加载的优化是游戏性能优化非常重要的部分!

各种类型的资源,都可以通过合理的设置跟取舍,极大的影响到我们的加载耗时跟内存开销。

比如shader,去掉FallBack,就可使MobileDiffuse之解析耗时从59.9降低到27.6ms,降低了64%

视频里有一句话说的很好:

防范大于救火

这章就结束啦,后面还有加载卸载的管理,以及实例化、内存优化。

好了我要睡觉了 —— 02:43

参考:

https://edu.uwa4d.com/course-intro/1/112

https://blog.uwa4d.com/archives/Loading_AnimationClip.html

Unity移动游戏加载性能和内存管理-学习笔记的更多相关文章

  1. C++内存管理学习笔记(7)

    /****************************************************************/ /*            学习是合作和分享式的! /* Auth ...

  2. C++内存管理学习笔记(5)

    /****************************************************************/ /*            学习是合作和分享式的! /* Auth ...

  3. C++内存管理学习笔记(6)

    /****************************************************************/ /*            学习是合作和分享式的! /* Auth ...

  4. C++内存管理学习笔记(2)

    /****************************************************************/ /*            学习是合作和分享式的! /* Auth ...

  5. C++内存管理学习笔记(4)

    /****************************************************************/ /*            学习是合作和分享式的! /* Auth ...

  6. C++内存管理学习笔记(3)

    /****************************************************************/ /*            学习是合作和分享式的! /* Auth ...

  7. C++内存管理学习笔记(1)

    /****************************************************************/ /*            学习是合作和分享式的! /* Auth ...

  8. JVM自动内存管理学习笔记

    对于使用 C.C++ 的程序员来说,在内存管理领域,他们既是拥有最高权力的皇帝又是从事最基础工作的劳动人民——拥有每一个对象的“所有权”,又担负着每一个对象生命开始到终结的维护责任.对于 Java 程 ...

  9. IOS内存管理学习笔记

    内存管理作为iOS中非常重要的部分,每一个iOS开发者都应该深入了解iOS内存管理,最近在学习iOS中整理出了一些知识点,先从MRC开始说起. 1.当一个对象在创建之后它的引用计数器为1,当调用这个对 ...

随机推荐

  1. Java连载6-变量的要求

    一.数据类型的作用 (1)不同的数据有不同的类型,不同的数据类型底层会分配不同的大小的空间 (2)数据类型是指程序在运行阶段应该分配多大的内存空间 二.变量要求 变量中存储的具体的“数据”必须和变量的 ...

  2. 字符串的排列(剑指offer)

    题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 思路: 利用 ...

  3. Appium+python自动化(二十三)- 真假美猴王Monkeyrunner与Monkey傻傻的分不清楚(超详解)

    简介 看<西游记>第五十七回,说是“六耳猕猴”化作孙悟空的摸样,伤了唐僧,后又和孙悟空大打出手…… 这位假孙悟空,实力不用多说了吧,和真孙悟空一般无二,大战孙悟空,闹到上天入地下海. 在唐 ...

  4. Java EE.JSP.概述

    JSP最终会被转换成标准Servlet,该转换过程一般出现在第一次请求页面时. JSP页面的主要组成部分如下: HTML 脚本:嵌入Java代码 指令:从整体上控制Servlet的结构 动作:引入现有 ...

  5. 《VR入门系列教程》之18---Oculus代码剖析

    代码剖析 原文作者:Tony Parisi     那么,Unity究竟是如何支持Oculus VR运行的?首先,我们来看看Unity场景是如何构建的.在Unity集成开发包中有一个相机预设体,这个预 ...

  6. ThinkPHP 5.0 控制器-》请求-》数据库

    ThinkPHP 5.0 控制器->请求->数据库 控制器总结 无需继承其他的类(若继承了Think/Controller,可直接调用view函数渲染模板),位置处于application ...

  7. 分布式锁----Redis实现

    分布式锁 为什么需要有分布式锁呢,在单点的时候synchronized 就能解决,但是服务拆分之后,每个服务都是单独的机器,无法解决,所以出现了分布式锁,其实也就是用各种手段,实现获取唯一锁,别人无法 ...

  8. 《css的总结》

    一.span标签:能让某几个文字或者某个词语凸显出来 <p> 今天是11月份的<span>第一天</span>,地铁卡不打折了 </p> 二.字体风格 ...

  9. Jquery第二次考核

    1. 名词解释 实例对象:var p1=new Person();  p1就是实例对象 构造:function Person(){} 原型对象:在 JavaScript 中,每当定义一个对象(函数也是 ...

  10. RocketMQ中NameServer的启动

    在RocketMQ中,使用NamesrvStartup作为启动类 主函数作为其启动的入口: public static void main(String[] args) { main0(args); ...