这周主程看到我学习unityshader,叫我先不用着急看这个,现在(项目)还都用不上,因为我是cocos2d转unity,他让先看看unity文档,多了解下unity先。我觉得好像挺对,于是乎就先放下shader,转而先看unity文档,希望大家也要沉下心来,慢慢学习,一步一步走!
下面开始第一章unity中操作:(吐槽一下,这个文档加载起来有点慢,然后翻译也不太行,大家还是要多学学英文啊!)
着重学习
在手游中,你上架到平台上肯定是包体越小越好,所以怎么缩减包体呢?我们知道脚本在包体中占的比例是很小的,影响包体的一般是资源(图片,动画,音频....)
那么要缩减这些资源我们首先要看这些资源占用的情况,然后在去做优化,所以在打完包之后我们可以在console窗口右上角有个...按钮点击去打开editor日志查看整个包体的资源占用情况。
优化1:使用压缩的纹理格式
纹理通常在构建中占据最多空间( 纹理 ~ Texture, 就是美术提供的 png 图片)
优化2:AssetBundle
文档上说要保证在Resources文件夹里的文件都是有用的,齐次可以使用AssetBundle来替代Resources,因为可以动态加载资源就是从服务器下载下来,就像花钱买的那些dlc(拓展包)。
优化3:降低maxSize
我们可以在inspector面板中,调整纹理的大小MaxSize,更改它的大小并不会影响纹理资源,只会影响在游戏中的分辨率
二、内存管理
托管内存:
unity的内存管理机制是一个基于Mono或IL2cpp的虚拟机,托管内存的好处是内存会自动释放,不需要手动调接口释放内存。(应该也是引用计数吧)unity的内存管理系统使用的是垃圾收集和托管堆,当脚本对对象没有引用的时候,会自动释放内存(并不是意味着立即释放),因为每一次Gc操作是比较耗性能的。
值类型和引用类型:
当我们调用一个方法的时候,其实在脚本里的操作是把方法的参数复制到一个特定的内存区域里,这个区域就叫做栈,这个复制能快速复制一些占用几个字节的东西,例如int类型,但是对于obj或者string或者数组来说就很慢了(所以是创建一个指向堆的指针?)
所有的非空的引用类型对象和所有的装箱的值类型对象都必须要在堆上分配。(字面意思)
自动内存管理:
当一个对象创建的时候会被分配到托管堆上,然后unity项目会自动管理这个堆上的内存,做一些分配和释放的操作。
重点部分:内存碎片和堆拓展
当我们一开始创建对象的时候是这样的,很紧凑的:
当我们删除掉一些对象的引用,然后托管堆进行了回收后是这样的,断断续续的,并不会对剩余的对象挪位置,估计是消耗非常大:
当我们又要创建一些对象时是这样的,插入的:
关键部分,现在我们看到一个array很长它塞不进这些碎片的位置,这时候会进行操作:
1.首先运行一遍垃圾回收,然后再看看有没有位置能塞进去
2.如果还没有位置那么我们就向操作系统申请拓展(大佬,我不够用了再给我点),一般是拓展一到两倍
注意事项:
1.unity在垃圾回收的时候,并不会归还拓展了的内存给操作系统,可能是拓展的过程会比较消耗性能
2.大多数平台上,unity最终会将托管堆空部分的内存释放给操作系统,这种情况的发生时机不能确定,也不可靠(就是不确定性很高)。(这里我想到一个问题,是不是unity的应用我检测到切到后台后就释放一些没用的内存,然后在一个时间内会返回给操作系统,这样操作系统就认为我占用的内存很小就不杀我进程了,cocos2d有没有这个优化呢?因为我看某三国志我挂后台很久都不会被清掉,但是我的处女研发项目切后台就很容易被杀进程)
今天笔记到此结束,等下去对面马路吃那个新开的18元自助工作餐,哈哈哈哈哈哈!