前言
- 今天在项目打包后遇到一个bug
- 项目在电脑上跑没问题,但是在手机端时,由于手机较差的性能,导致异步加载的资源需要等待较长的时间.
- 而我在一个地方本以为是同步加载的资源,但是在调用时发现本该被加载完成的资源加载失败,
- 大佬查看过底层实现后给出结论:这个资源使用了异步的加载方式,这就导致了我后面的访问越界.
- 我的解决办法是通过开启协程,等待资源加载完毕
不太了解协程的同学可以点击这里: 协程简介和常用方法
主要逻辑
- 资源加载未完成时,后面的逻辑可以使用协程来进行等待
- 比如我这里异步创建5个对象
for (int i = 0; i < 5; i++)
{
// 异步创建对象5个
}
- 那么在这段循环之后的代码,都需要考虑被创建的5个对象是否会被调用
- 如果需要被调用,则开启协程等待
异步加载方法 (string name , Action<GameObject> action)
{
//...
}
Coroutine cor = null;
void func()
{
List<GameObject> list = new List<GameObject>();
for (int i = 0; i < 5; ++i)
{
异步加载方法 (str , (gO) =>
{
list.Add(gO);
});
}
//开启协程等待
cor = StartCoroutine(SendData(list));
}
IEnumerator SendData(List<GameObject> list)
{
//等待list的元素个数达到5个
while (list.Count != 5) yield return null;
//处理逻辑
}
- 由于协程不会自动被关闭,所以即使销毁了这个页面时协程仍然会执行
- 通常的处理方式是将协程存储下来,如果不需要再次加载,那么就直接将它销毁即可