内容简介:AssetBundle.LoadFromMemory基本上是无法在手机上用的,因为要多占一份内存,所以大多Unity项目都不进行资源加密。Unity2017.2提供了一个新的API AssetBundle.LoadFromStream,通过名字就可以知道它是流加载,那么就不会像AssetBundle.LoadFromMemory那样多占一份很大的内存了。打包Assetbundle的同时生成加密文件的两个文件分别加载它。
AssetBundle.LoadFromMemory基本上是无法在手机上用的,因为要多占一份内存,所以大多Unity项目都不进行资源加密。
Unity2017.2提供了一个新的API AssetBundle.LoadFromStream,通过名字就可以知道它是流加载,那么就不会像AssetBundle.LoadFromMemory那样多占一份很大的内存了。
打包Assetbundle的同时生成加密文件的两个文件分别加载它。
myab.unity3d
encypt_myab.unity3d
[MenuItem("Tools/BuildAB")]
static void BuildAB()
{
FileUtil.DeleteFileOrDirectory(Application.streamingAssetsPath);
Directory.CreateDirectory(Application.streamingAssetsPath);
var manifest = BuildPipeline.BuildAssetBundles(Application.streamingAssetsPath, BuildAssetBundleOptions.ChunkBasedCompression | BuildAssetBundleOptions.ForceRebuildAssetBundle, BuildTarget.iOS);
foreach (var name in manifest.GetAllAssetBundles())
{
var uniqueSalt = Encoding.UTF8.GetBytes(name);
var data = File.ReadAllBytes(Path.Combine(Application.streamingAssetsPath, name));
using (var myStream = new MyStream(Path.Combine(Application.streamingAssetsPath, "encypt_" + name),FileMode.Create))
{
myStream.Write(data, 0, data.Length);
}
}
AssetDatabase.Refresh();
}
这里测试的Assetbundle一共有20M, 使用LZ4压缩格式。
加密和解密我这里随便写个简单的异或 ^ 。后面也可以用一些更好的算法,总之加密可以慢,但是解密一定要快。
using System.IO;
public class MyStream : FileStream
{
const byte KEY = 64;
public MyStream(string path, FileMode mode, FileAccess access, FileShare share, int bufferSize, bool useAsync) : base(path, mode, access, share, bufferSize, useAsync)
{
}
public MyStream(string path, FileMode mode) : base(path, mode)
{
}
public override int Read(byte[] array, int offset, int count)
{
var index = base.Read(array, offset, count);
for (int i = 0 ; i < array.Length; i++)
{
array[i] ^= KEY;
}
return index;
}
public override void Write(byte[] array, int offset, int count)
{
for (int i = 0; i < array.Length; i ++)
{
array[i] ^= KEY;
}
base.Write(array, offset, count);
}
}
界面上放两个Image 分别加载它。
using System.IO;
using UnityEngine;
using UnityEngine.UI;
public class TestStream : MonoBehaviour
{
[Header("是否启用Stream加载")]
public bool isStream = true;
float m_LoadTime ;
void Start()
{
if (isStream)
{
float t = Time.realtimeSinceStartup;
using (var fileStream = new MyStream(Application.streamingAssetsPath + "/encypt_myab.unity3d", FileMode.Open, FileAccess.Read, FileShare.None, 1024 * 4, false))
{
var myLoadedAssetBundle = AssetBundle.LoadFromStream(fileStream);
m_LoadTime = Time.realtimeSinceStartup - t;
GetComponent<Image>().sprite = myLoadedAssetBundle.LoadAsset<Sprite>("1");
myLoadedAssetBundle.Unload(false);
}
}
else
{
float t = Time.realtimeSinceStartup;
var myLoadedAssetBundle = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/myab.unity3d");
m_LoadTime = Time.realtimeSinceStartup - t;
GetComponent<Image>().sprite = myLoadedAssetBundle.LoadAsset<Sprite>("1");
myLoadedAssetBundle.Unload(false);
}
}
private void OnGUI()
{
if (isStream)
{
GUILayout.Label(string.Format("<size=50>\nAssetBundle.LoadFromStream :{0} </size>", m_LoadTime));
}
else
{
GUILayout.Label(string.Format("<size=50>AssetBundle.LoadFromFile :{0} </size>", m_LoadTime));
}
}
}
如下图所示,在iPhone7上,基本上加载时间差不多。
加密以后资源就无法被打开了。
注意:Android下的streamingAssets目录不能使用,因为android下是放在jar里并不是文件系统。一定要用的话需要拷贝到 Application.persistentDataPath下。
- 本文固定链接: https://www.xuanyusong.com/archives/4607
- 转载请注明:雨松MOMO 于雨松MOMO程序研究院 发表
雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
捐 赠 如果您愿意花20块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Bitker研究院:加密犯罪报告--解密日益复杂的黑客攻击、暗网市场及骗局(一)
- 巨头们的AI研究院战事
- 清华人工智能研究院成立「知识智能研究中心」,发布四大知识平台
- AWS在上海成立人工智能研究院
- 微软亚洲研究院:NLP将迎来黄金十年
- 微软亚洲研究院27篇论文入选AAAI 2019
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
C Primer Plus(第6版)中文版
普拉达 (Stephen Prata) / 姜佑 / 人民邮电出版社 / 2016-4-1 / CNY 89.00
《C Primer Plus(第6版)中文版》详细讲解了C语言的基本概念和编程技巧。 《C Primer Plus(第6版)中文版》共17章。第1、2章介绍了C语言编程的预备知识。第3~15章详细讲解了C语言的相关知识,包括数据类型、格式化输入/输出、运算符、表达式、语句、循环、字符输入和输出、函数、数组和指针、字符和字符串函数、内存管理、文件输入输出、结构、位操作等。第16章、17章介绍C......一起来看看 《C Primer Plus(第6版)中文版》 这本书的介绍吧!