AssetBundle学习笔记:Resources文件夹

Resources文件夹

  • 这个章节内容不多,但是也很有用。我们可以从这个章节中学习如何更合理的使用它。

Resources系统的最佳实践

不要使用它

  • 是的,不要使用它。因为它有以下问题:
    • 使用 Resources 文件夹会让内存颗粒度管理变得更困难
    • 不正确的使用 Resources 文件夹会增加应用启动时间(因为要创建上一章讲的映射图)和包的大小,随着在 Resources 文件中的文件增加,管理这些文件会变得很困难。
    • Resources系统降低了项目自定义分发内容到具体平台的能力,消除了增量更新的可能。AssetBundle 变体是 Unity 用来在不同设备上调整内容的基础。

AssetBundle学习笔记:资产、对象和序列化

前言

  • 这篇及后续的几篇笔记是我阅读A guide to AssetBundles and Resources的一些记录。官方的这个系列文章详细的阐述了unity是管理资源的。从一个asset的导入开始,unity就在背后开始了它的工作。它为每个资源创造了一个mate文件,给予了资源一个唯一的ID,从此这个资源的一切都与这个ID紧密结合到了一起。可能我们的一些操作会导致资源丢失它的mate文件,这会造成一些很不好的后果。
  • 与此同时,系列文章中还重点阐述了什么是AssetBundle,如何下载AssetBundle和如何从AssetBundle中加载asset。
  • 最关键的是最后一章,在这一章中详细的描写了AssetBundle的制作策略。AssetBundle可以说是unity中至关重要的一个概念,但是在日常的工作中按照怎么样的颗粒度来划分AssetBundle,如何平衡AssetBundle的精细度和方便性,这一直以来是一个让人头痛的问题,第四章中给出了一些答案。

5.6混合光照

原文地址

原有混合光照的问题

  • 5.6之前的光照存在一个严重的问题就是: 混合光照仅当只有一个定向光时才能正常工作。
  • 这是什么个意思呢?
    • 首先说一下unity的GI一直以来都是依靠烘焙来做的,但是在unity5中加入了PRGI。
    • 目前的unity在一个场景中可以混合使用烘焙光照和实时光照,一部分静态对象使用烘焙好的光照和影子,而一些非静态的对象可以继续接受实时光照的影响。这个需要我们把Light Type设置为Mixed。
    • 不过静态对象会既受烘焙的影响又受实时光的影响,从而产生不好的效果。mixed模式就是为了解决这个问题而出现的,理想情况下,混合模式会为你料理好一切,照亮相同平衡范围内的动、静态对象(从而保留了视觉逼真度与一致性)。只是一切都不是那么的美好,事实上是动态物体不会从spotlight上产生阴影。
    • 需要特别声明一下,我自己的测试中完全没有发现上面的问题,目前不知道原因。

AssetBundle学习笔记:4、AssetBundle的下载与asset的加载

AssetBundle的下载

下载AssetBundle

  • 首先需要理解的是这个下载就是指的从网络下载。因此只有WWW和 WWW.LoadFromCacheOrDownload两个方法。
  • www是不带缓存的,而后者是带缓存的。
  • LoadFromCacheOrDownload的version参数,如果缓存中不存在,或者version低于指定的版本就会重新下载,否则直接从缓存拿数据。缓存数据应该是始终在磁盘上的,而5.3以后缓存文件也压缩为LZ4(好像是可配置的),所以读取cache的数据很可能与LoadFromFile是等效的。
  • 如果多个AssetBundle使用WWW.LoadFromCacheOrDownload下载,每帧只能完成一个。
  • LoadFromCacheOrDownload中如果发现缓存文件夹已经满了,会优先删除最近没有使用的cache,但是如果磁盘本身就满了或者说cache folder已经满了(这个东西是有容量限制的)那么会把AssetBundle数据直接按照stream的形式放到内存,这个和new WWW的做法完全一样。

AssetBundle学习笔记:3、AssetBundle内部结构

本质

  • AssetBundle在本质上是一些被分组保存在一个序列化文件中的对象。被部署为一个数据文件,这些文件按照普通包和场景包的不同,在结构上有些差别。

Normal AssetBundle structure

image

  • 对于第一个块中的main serialized file应该是可以通过AssetBundle.mainAsset获取的,而谁是mainAsset呢?在build的时候第一个放置进去的资源就是mainAsset,所以可以采用将AssetBundle中所有的资源的名称写入一个文件,然后文件作为mainAsset来使用。具体代码参考引用的第二部分

AssetBundle学习笔记:2、压缩

格式

  • 谈压缩就要谈到格式,unity目前在制作AssetBundle时默认就是压缩的,当然也可以设置为不压缩,但是显然不科学尤其是在移动端的开发上。

  • LZMA:这个是一个序列化数据文件流,也是AssetBundle的默认压缩格式。LZMA提供最佳的压缩比,但是在使用的时候需要完全解压后才能使用,因此加载时需要的事件比较多。

  • LZ4:5.3以后才加入的一种压缩格式,被unity自己大量使用。这是一种基于块的压缩方式,当一个对象从LZ4压缩的AssetBundle中加载时,会按照需要解压部分的块。这样的好处在于快速的加载对象,后面会提到一个最佳实践。当然,按照这个原理,你也可以想象如果一个LZ4AssetBundle中只包含了一个GameObject,那么也不存在什么按需加载了。当使用AssetBundle.LoadFromFile加载LZ4格式的文件时,其实不会将问价加载到内容,而是加载AssetBundle的Header。

  • AssetBundle也可以选择不压缩,这样体积最大但是加载最快。

游戏设计模式读书笔记:原型模式

原型模式

定义

  • 定义:原型模式是创建型模式的一种,其特点在于通过“复制”一个已经存在的实例来返回新的实例,而不是新建实例。被复制的实例就是我们所称的“原型”,这个原型是可定制的。
    原型模式多用于创建复杂的或者耗时的实例,因为这种情况下,复制一个已经存在的实例使程序运行更高效;或者创建值相等,只是命名不一样的同类数据。
  • 看图
    image

我所了解的法线贴图

两篇文章

AssetBundle学习笔记:1、概述和创建

前言

  • 打算彻底搞清楚AssetBundle的原理和使用,目前计划刷完官方文档和最佳实践系列文章,而且笔记中的内容会大量是官方文档的内容。

概述

  • AssetBundle可以包含任意unity能识别的类型文件,甚至是一个场景。如果想包含自定义的二进制文件,需要文件后缀名是.bytes,unity会将这样的文件导入为TextAsset。

SendMessage测试

  • 5.5.2中没有了以前那种参数是对象的SendMessage方法,WTF.
  • obj.SendMessage(“Foo”, 1, SendMessageOptions.DontRequireReceiver);如果设置了DontRequireReceiver,那么找不到Foo方法不会报错,如果没有写这个参数默认是RequireReceiver,则报错。
  • 如果Foo的参数不对,会提示MissingMethodException: The best match for method Foo has some invalid parameter.
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×