assetbundle

Unity 游戏框架:资源管理神器 ResKit

|▌冷眼眸甩不掉的悲伤 提交于 2020-03-26 11:08:16
此篇文章准备了将近两周的时间,写了改,改了删。之前有朋友反馈,上一个文章太冗长了,影响阅读体验,这一讲就走个精简路线。所以只要不是很重要的内容就都删减掉了。 文章分两个部分,第一部分是原理,第二部分是实战。 原理部分,初学者尽量去理解就好,不用跟着敲,列出的代码都是示意代码。 实战部分是留给初学者的,希望敲完代码,这样有助于理解前边的原理。 当然原理不是很难。 第一部分:原理 ResKit 中值得一说的 Feature 如下: 引用计数器 可以不传 BundleName 当然也有很多不值得一提的 Feature。 比如统一的加载 API,一个 ResLaoder.LoadSync API 可以加载 Resources/AssetBundle/PersistentDataPath/StreamingAssets,甚至是网络资源。这个很多开源方案都有实现。 Simulation Mode,这个功能最早源自于 Unity 官方推出的 AssetBundleManager,不过不维护了,被 AssetBundleBrowser 替代了。但是这个功能真的很方便就加入到 ResKit 里了。 对象池,是管理内存的一种手段,在 ResKit 中作用不是很大,但是是一个非常值得学习的优化工具,所以也列到本次 chat 里了。 接下来就按着以上顺序聊聊这些 Feature。 首先先看下 ResKit

unity 内存方面优化

大城市里の小女人 提交于 2020-03-17 12:29:58
作者写的很好,看了他的书收获很大。以下内容摘自: https://www.cnblogs.com/murongxiaopifu/p/4284988.html 既然要聊Unity3D运行时候的内存优化,那我们自然首先要知道Unity3D游戏引擎是如何分配内存的。大概可以分成三大部分: Unity3D内部的内存 Mono的托管内存 若干我们自己引入的DLL或者第三方DLL所需要的内存。 第3类不是我们关注的重点,所以接下来我们会分别来看一下 Unity3D内部内存 和 Mono托管内存 ,最后还将分析一个官网上 Assetbundle的案例 来说明内存的管理。 Unity3D内部内存 Unity3D的内部内存都会存放一些什么呢?各位想一想,除了用代码来驱动逻辑,一个游戏还需要什么呢?对,各种资源。所以简单总结一下Unity3D内部内存存放的东西吧: 资源:纹理、网格、音频等等 GameObject和各种组件。 引擎内部逻辑需要的内存:渲染器,物理系统,粒子系统等等 Mono托管内存 因为我们的游戏脚本是用C#写的,同时还要跨平台,所以带着一个Mono的托管环境显然必须的。那么Mono的托管内存自然就不得不放到内存的优化范畴中进行考虑。那么我们所说的Mono托管内存中存放的东西和Unity3D内部内存中存放的东西究竟有何不同呢?其实Mono的内存分配就是很传统的运行时内存的分配了:

【转】Unity3D AssetBundles 动态加载游戏资源

微笑、不失礼 提交于 2020-02-29 13:30:11
AssetBundles are files which you can export from Unity to contain assets of your choice. These files use a proprietary compressed format and can be loaded on demand in your application. This allows you to stream content like models, textures, audio clips and even entire scenes separately from the scene in which they will be used. They have been designed to make it easy to download content to your application. 在一些大型的网络游戏,或者加载比较多的一些场景时,如果要等待所有模型,贴图等各种资源文件加载完毕才能执行游戏,对用户将会是一个很头大的事情。所以就需要用到动态加载,即AssetBundles。比如玩家在进入游戏时先加载一些周围的场景文件,这样不仅可以提高速度还可以减少内存资源的消耗。

17 Resources AssetBundle资源打包

匆匆过客 提交于 2020-02-28 13:38:32
Resources 在Unity中可以使用www类加载远程文件或本地文件,或是在脚本中定义字段或数组从外部拖入. 在Unity中提供了Resources类读取资源 要通过Resources类读取的文件必须将要读取的文件放到Assets下创建的Resources(名字唯一)文件夹下. 在脚本中通过Resources类的方法可直接加载Resources文件夹中的数据 1.通过名称获取资源 Resources.Load("文件名"); 2.通过名称获取指定类型的资源(泛型方法) Resources.Load<Texture>("文件名"); 3.通过名称获取指定类型的资源 Resources.Load("文件名",typeof(Texture)) as Texture; //通过代码直接创建游戏对象 //CreatePrimitive,创建一个带有基本网格渲染器和相应放入碰撞器的游戏对象 GameObject cylinder = GameObject.CreatePrimitive (PrimitiveType.Cylinder); cylinder.transform.position = new Vector3 (2f, 0, 0); cylinder.GetComponent<MeshRenderer> ().material.color = new Color (Random

Unity AssetBundle笔记

江枫思渺然 提交于 2020-02-26 13:48:02
1.入门: Resources:表示U3D自动将资源打成一个AssetBundle包,所有放在Resources下的文件夹都会打成一个AssetBundle包,资源非常大,Resources文件夹在真机上最大只有2G的内存(专业版会增大内存) AssetBundle包:其实可以看成一个压缩包(有固定格式的),默认情况下使用LZMA压缩方式压缩的资源文件;和压缩ZIP一样的,只不过里面的格式变了   Unity3D引擎为我们提供了三种压缩策略来处理AssetBundle的压缩,即:     1、LZMA格式:         在默认情况下,打包生成的AssetBundle都会被压缩。在U3D中,AssetBundle的标准压缩格式便是LZMA(LZMA是一种序列化流文件),因此在默认情况下,打出的AssetBundle包处于LZMA格式的压缩状态,在使用AssetBundle前需要先解压缩。使用LZMA格式压缩的AssetBundle的包体积最小(高压缩比),但是会相应的增加解压缩的时间     2、LZ4格式:         Unity5.3之后的版本增加了LZ4格式压缩,由于LZ4的压缩比一般,因此经过压缩后的AssetBundle包体的体积较大(该算法基于chunk)。     3、不压缩 Resources和AssetBundle的区别:   1、Resources

[翻译]Unity中的AssetBundle详解(三)

早过忘川 提交于 2020-02-26 12:22:18
构建AssetBundles 在 AssetBundle工作流程 的文档中,我们有一个示例代码,它将三个参数传递给 BuildPipeline.BuildAssetBundles 函数。让我们更深入地了解我们实际上在说什么。 Assets/AssetBundles :这是AssetBundles将被输出到的目录。您可以将其更改为所需的任何输出目录,只需在尝试构建之前确保文件夹实际存在。 BuildAssetBundleOptions 有多种不同的 BuildAssetBundleOptions 选项可以选择。相关的各个选项可以参阅脚本API文档中的关于 BuildAssetBundleOptions 的内容。 虽然随着需求的变化和增加,您可以自由组合 BuildAssetBundleOptions 选项,但有三个特定的 BuildAssetBundleOptions 是用来处理AssetBundle压缩: BuildAssetBundleOptions.None:此bundle选项使用LZMA格式压缩,这种压缩是序列化的数据文件的单一压缩的LZMA流。 LZMA压缩的文件在使用前需要对整个bundle解压缩。这导致最小的文件大小和由于解压缩而稍微增加的加载时间。值得注意的是,当使用此 BuildAssetBundleOptions 时,为了使用捆绑包中的任何资源

Unity3D AssetBundle自我总结(打包)

落花浮王杯 提交于 2020-01-28 12:14:33
打包AssetBundle代码 `using UnityEditor; using System.IO; using UnityEngine; public class CreateAssetBundles { //创建打包按钮 [MenuItem(“Assets/Build AssetBundles”)] static void BulidAllAssetBundles() { //创建文件夹 string assetBundleDirectory = “Assets/StreamingAssets”; if (!Directory.Exists(Application.streamingAssetsPath)) { Directory.CreateDirectory(assetBundleDirectory); } //打包 BuildPipeline.BuildAssetBundles(assetBundleDirectory, BuildAssetBundleOptions.None, EditorUserBuildSettings.activeBuildTarget); } }` 命名规则:为了方便管理,我们通常命名AssetBundle的时候带有文件夹路径: 我在这里根据文件夹命名的Scenes1/Building1 (不去分大小写)

Unity AssetBundle自动化打包

六月ゝ 毕业季﹏ 提交于 2020-01-26 06:49:03
//先批量创建配置Prefab,方便AB包加载后导入场景 private void CreatePrefab ( GameObject obj , string path ) { PrefabUtility . CreatePrefab ( path + "/" + obj . name + ".prefab" , obj , ReplacePrefabOptions . ConnectToPrefab ) ; AssetDatabase . SaveAssets ( ) ; } //清理所有AssetBundle名字 private void ClearAssetBundleName ( ) { foreach ( var abName in AssetDatabase . GetAllAssetBundleNames ( ) ) { AssetDatabase . RemoveAssetBundleName ( abName , true ) ; } AssetDatabase . RemoveUnusedAssetBundleNames ( ) ; } //设置路径下打包文件AssetBundle名和后缀 private void SetAssetImport ( string Assetpath ) { //获取路径下所有文件及子目录路径 var paths =

资源管理(5)——资源加密

╄→гoц情女王★ 提交于 2020-01-09 00:52:11
#region AssetBundleEncrypt 资源包加密 /// <summary> /// 资源包加密 /// </summary> /// <param name="path"></param> private void AssetBundleEncrypt(bool isDelete = false) { //循环设置文件夹包括子文件里边的项 for (int i = 0; i < m_List.Count; i++) { AssetBundleEntity entity = m_List[i];//取到一个节点 if (entity.IsEncrypt)//是否需要加密 { string[] folderArr = new string[entity.PathList.Count]; for (int j = 0; j < entity.PathList.Count; j++) { string path = Application.dataPath + "/../AssetBundles/" + dal.GetVersion() + "/" + arrBuildTarget[buildTargetIndex] + "/" + entity.PathList[j]; if (entity.IsFolder == false)//是否文件夹 { //不是遍历文件夹打包

AssetBundle应用分享

丶灬走出姿态 提交于 2019-12-25 13:01:41
AssetBundle应用 按照步骤 命名 打包资源 加载AssetBundle 按照步骤 命名 使用AssetBundle最先注意到的便是资源的命名。 最普通的命名方式,便是: 如图上标识的地方直接手动输入,命名。 但如果资源量较大时,这种方式会很枯燥、繁琐,而且自己想对应的名字,也是件很头疼的事情。所以,我便使用了代码的方式,实现了批量的资源命名。 using System . IO ; using UnityEditor ; public class AutoName : AssetPostprocessor { /// <summary> /// 该函数在所有资源被动的时候会自动调用,对资源进行处理------UnityEditor名字空间中 /// 为导入的和移动的自动加上assetBundle的名字 /// </summary> /// <param name="importedAssets">导入的资源</param> /// <param name="deletedAssets">删除的资源</param> /// <param name="movedAssets">移动的资源</param> /// <param name="movedFromAssetPaths">从资源路径中的移动</param> static void