Я разработал приложение для Microsoft Hololens в Unity, но когда я пытаюсь выполнить некоторые сложные операции (например, загрузить данные с удаленного сервера, десериализовать json или создать gameObject во время выполнения), сцена на моем Hololens исчезает на несколькосекунд и появляется снова, когда все операции завершены. Эта проблема не является незначительной, но я не знаю, как оптимизировать приложение. Я хочу выполнить эти операции в фоновом потоке, чтобы не влиять на основной поток.
Я не могу выполнить некоторые функции в фоновом потоке, поэтому мне нужен своего рода «диспетчер», который выполняет Unity. не поддерживается вызывать их в основном потоке, пока я запускаю фоновый поток, перехожу в спящий режим и возвращаюсь к выполнению только после завершения работы диспетчера.
Я пытался использовать потоки / задачи, но мне не удалось создать приложение, потому чтоКлассы потоков / задач не найдены (может быть, Hololens их не поддерживает?).
С потоками или задачами я пытался использовать Monitor.Wait () и Monitor.Pulse () для синхронизации операций, но кажется, что, когда я использую Monitor.Wait () во вторичном потоке, переводит в спящий режим основной поток, и приложение не отвечает, пока не получит Monitor.Pulse (), который никогда не будет получен.
Iпытался использовать некоторые коды, найденные в Интернете, чтобы сделать диспетчер (у меня нет диспетчера в Unity) для вызова основных функций во вторичном потоке, но они поместили эти функции в конец списка. Мы должны вызвать их мгновенно.
(https://github.com/PimDeWitte/UnityMainThreadDispatcher)
(https://www.youtube.com/watch?v=k5mbg5kVveU)
) Я также пытался использовать сопрограммы в главном потоке и использовать много«доходность», но это было неэффективно.
Это общая структура моего кода:
IEnumerator GetData() {
try {
// Get data from a remote database
CallTask();
yield return null;
}
catch (Exception e) { Network error }
}
void CallTask() {
Task t = new Task( () => BackgroundTask() );
t.Start();
t.Wait();
// Do stuff when "FunctionThatHaveToBeCalledInMainThread()" has ended
}
void BackgroundTask() {
// Do stuff
FunctionThatHaveToBeCalledInMainThread();
// Do stuff when "FunctionThatHaveToBeCalledInMainThread()" has ended
}