目前,我的代码可以从Hololens的本地内存加载并呈现obj文件。但是,在此过程中,应用程序被完全挂起,这可能需要长达几秒钟的时间,具体取决于网格的大小和复杂性。由于可能会怀疑应用程序在此期间崩溃,因此我想将渲染移至后台进程并使主线程保持活动状态。
在加载和呈现obj文件时,应用程序被暂停了几秒钟。
[网格的加载和渲染是在后台过程中计算的,并且该应用程序保持活动状态。
public class FileExplorer: MonoBehaviour {
private FileOpenPicker openPicker;
public void OpenExplorer() {
UnityEngine.WSA.Application.InvokeOnUIThread(() = >OpenFileAsync(), false);
LoadModelFromFile();
}
private async void OpenFileAsync() {
openPicker = new FileOpenPicker();
openPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
openPicker.FileTypeFilter.Add(".obj");
StorageFile file = await openPicker.PickSingleFileAsync();
if (file != null) {
path = file.Path;
}
}
public void LoadModelFromFile() {
Mesh newMesh = Instantiate(GetComponent < ObjFileLoader > ().LoadModel(path)) as Mesh;
}
}
LoadModel(path)
返回网格await
应该是什么值如果有人遇到类似的问题,可以帮助我解决这个问题或给我提示,我将非常感激。
我认为您正在寻找的是这样的东西。
public async Task OpenExplorer() {
UnityEngine.WSA.Application.InvokeOnUIThread(async() => await OpenFileAsync(), false);
await Task.Run(LoadModelFromFile);
}
不过,我的建议是阅读有关Async和Await的更多信息,因为根据您的情况,以上代码可能不遵循最佳实践,并且可能很危险。
最主要的是Async and Await是关于多线程代码的not。异步和等待是关于更有效地使用单个线程。代码,IO和CPU有两个主要瓶颈,异步等待与IO瓶颈配合得很好,因为在等待磁盘操作或等待Web请求时,它可以释放线程以在其他事情上工作(这是不消耗任何线程)。
如果使方法异步,但使它异步的唯一方法是将许多长时间运行的代码启动到另一个线程上,除非您要释放的线程是UI,否则它没有什么用处线程,但是您唯一可以确定的唯一方法就是您是否在UI线程上。
因此,仅当需要释放UI线程时,才从UI上下文中执行await Task.Run...
类操作。在其他任何地方,只有将方法纯粹是与IO相关的异步方法(例如File.ReadAsync
或其他不消耗任何额外线程的方法)标记为异步方法。