Unity中的线程以避免动画冻结

Posted

技术标签:

【中文标题】Unity中的线程以避免动画冻结【英文标题】:Threads in Unity to avoid Animation freeze 【发布时间】:2019-09-04 08:31:00 【问题描述】:

每次我从保存的文件加载纹理时,我的场景中的任何动画都会被冻结,直到从文件加载完成。 我阅读了很多关于 Threads 的不同意见,但没有一个得到答案。但我必须在不同的线程中加载纹理以避免冻结。 我的代码附加到一个游戏对象,它是一个 UI 弹出窗口

void Start() 
Texture2D tex = LoadTexFromFile(); //Should be in a diffrent thread that returns a texture
sprite = Sprite.Create(tex, 
                       new Rect(0, 0, tex.width, tex.height), 
                       new Vector2(tex.width / 2, tex.height / 2));

picFrame.GetComponent<Image>().overrideSprite = sprite; 

如何在我的代码中安全地使用线程?

【问题讨论】:

android Unity - Load a file on background thread的可能重复 不是重复的。此外,该用户没有得到答案。 我当时在想,为什么@Michał Powłoka 勾选了那个答案呢? 他用解决方法回答了自己的问题,因为人们没有回答他。此外,他读取文件的方式与我的代码不同,我无权访问 LoadTexFromFile(),他在阅读器本身上找到了我无权访问的解决方法 【参考方案1】:

Best practices 说您应该不要在关卡期间加载资源,而应在开始时加载资源,以避免中断。你为什么要反对 Unity 提供的中间件?让它为您管理资产并在关卡开始时加载它们。

资产流式传输有一个用例(不是特定于 Unity),但通常保留用于 AAA 按需资产加载,例如纹理;网;以及大型开放世界游戏中的其他资产,但我怀疑这里的情况。这样的功能非常复杂,这里就不赘述了。

告诉我更多

Gregory, J, Game Engine Architecture, 2009

【讨论】:

感谢您的回答。我无法在一开始就加载所有内容,因为在内存中加载大量 tex 屏幕截图是徒劳的。我的场景是一张地图,每个关卡都存储一个截图纹理。单击关卡时,应从文件中加载已保存的纹理。如果我从一开始就开始加载所有级别的所有屏幕截图,那么场景开始需要很长时间,这已经是这种情况了。这就是为什么我想在不同的线程上分离加载纹理 @SHAI 在我看来,您的游戏资产没有按级别优化。 Unity 可以为您做这种事情。如果您发现情况并非如此,则说明有问题

以上是关于Unity中的线程以避免动画冻结的主要内容,如果未能解决你的问题,请参考以下文章

Android 上 Unity 中的多线程

Kivy:为长功能加载动画(避免冻结)

当 Unity 中的生命被移除时,游戏会冻结 [重复]

c#多线程应用程序中的界面冻结

Unity C# - 在完成之前停止执行IJobParallelFor

Firebase 使任务仅在主线程上执行,导致 Unity 冻结