知识点一:Resources异步加载是什么?
在Unity中,资源加载可以分为同步加载和异步加载两种方式。同步加载会在主线程中直接进行,如果加载的资源过大,可能会导致程序卡顿,因为从硬盘读取数据到内存并进行处理是需要时间的。而异步加载则是Unity内部新开一个线程进行资源加载,这样就不会造成主线程卡顿,从而提高应用的响应性和流畅性。
知识点二:Resources异步加载方法
1. 通过异步加载中的完成事件监听使用加载的资源
- 方法:使用
Resources.LoadAsync<T>()
方法进行异步加载,并通过监听completed
事件来获取加载完成的通知。 - 示例:
ResourceRequest rq = Resources.LoadAsync<Texture>("Tex/TestJPG");
rq.completed += LoadOver; // 注册完成事件
- 注意:异步加载不能马上得到加载的资源,至少要等一帧。因此,在
completed
事件触发之前尝试访问rq.asset
是错误的。
2. 通过协程使用加载的资源
- 方法:在协程中使用
Resources.LoadAsync<T>()
方法,并通过yield return
语句等待资源加载完成。 - 示例:
IEnumerator Load()
{
ResourceRequest rq = Resources.LoadAsync<Texture>("Tex/TestJPG");
yield return rq; // 等待资源加载完成
tex = rq.asset as Texture; // 获取加载的资源
}
- 优点:协程允许在加载资源的同时处理其他逻辑,如更新进度条或同时加载多个资源。
- 缺点:写法相对复杂一些。
代码讲解
1.通过完成事件监听使用加载的资源(线程方式)
private Texture tex; // 声明一个Texture变量用于存储加载的资源
void Start()
{
// 使用Resources.LoadAsync<T>()方法进行异步加载
ResourceRequest rq = Resources.LoadAsync<Texture>("bk");
// 注册完成事件,当加载结束时调用LoadOver方法
rq.completed += LoadOver;
print(Time.frameCount);
}
// 完成事件的回调函数
private void LoadOver(AsyncOperation operation)
{
// 获取加载的资源
tex = (operation as ResourceRequest).asset as Texture;
// 输出加载完成的通知和当前帧数
print("加载结束");
print(Time.frameCount);
}
private void OnGUI()
{
// 在GUI中绘制加载的纹理
if (tex != null)
GUI.DrawTexture(new Rect(0, 0, 100, 100), tex);
}
2.通过协程使用加载的资源(协程方式)
private Texture tex; // 声明一个Texture变量用于存储加载的资源
void Start()
{
// 使用协程进行异步加载
StartCoroutine(Load());
}
IEnumerator Load()
{
// 使用Resources.LoadAsync<T>()方法进行异步加载
ResourceRequest rq = Resources.LoadAsync<Texture>("bk");
// 输出当前帧数以观察异步加载的效果
print(Time.frameCount);
// 等待资源加载完成
yield return rq;
// 输出加载完成的通知和当前帧数
print(Time.frameCount);
// 获取加载的资源
tex = rq.asset as Texture;
// 这里可以添加额外的逻辑,如更新UI或处理加载后的资源
}
private void OnGUI()
{
// 在GUI中绘制加载的纹理
if (tex != null)
GUI.DrawTexture(new Rect(0, 0, 100, 100), tex);
}
结果:
总结
- 异步加载:通过新开线程进行资源加载,避免主线程卡顿。
- 完成事件监听:写法简单,但只能在资源加载结束后进行处理。
- 协程异步加载:允许在加载资源的同时处理其他逻辑,写法相对复杂。
- 注意:异步加载不能马上得到加载的资源,需要等待加载完成。