Сцена исчезает и снова появляется в приложении Microsoft Hololens из-за сложных операций - PullRequest
2 голосов
/ 10 октября 2019

Я разработал приложение для 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
}
...