Hololens - Unity: LoadImage замораживает основной поток - PullRequest
0 голосов
/ 18 февраля 2019

сейчас у меня есть клиент и сервер.Сервер делает скриншоты и отправляет их моему клиенту в байтах.


Здесь я получаю байты и помещаю их в свою текстуру:

private IEnumerator RenderImage(byte[] values)
{
    var texture = new Texture2D(128, 128);
    texture.LoadImage(values); // <-- is running on main thread -> lag
    texture.Apply();
    RawImage.texture = texture;

    yield return null;
}

Это работает, но еговызывает кратковременное замораживание гололин, возможно, на 1/2 секунды.

1. Я много раз читал, что LoadImage будет работать на основной поток и вы не можете переместить его в другое место.
2. Использование Texture2D.LoadRawTextureData должно работать быстрее и решить мою проблему.Но используя его, он выдает исключение, что я не предоставляю достаточно данных.Запись чего-то вроде
var texture = new Texture2D(128, 128, TextureFormat.RGBA32, false); не решит проблему.

Знает ли sb, как кодировать байты более эффективным способом или таким образом, что основной поток не застревает при декодировании изображения?

- РЕДАКТИРОВАТЬ - Я забыл сказать, что использую этот Диспетчер основных потоков , но это не помогает:

private void OnMessageReceived(byte[] values)
{
    UnityMainThreadDispatcher.Instance().Enqueue(RenderImage(values));
}

private IEnumerator RenderImage(byte[] values)
{
    var texture = new Texture2D(128, 128, TextureFormat.RGBA32, false);
    texture.LoadImage(values); // <-- is running on main thread -> lag
    texture.Apply();
    RawImage.texture = texture;

    yield return null;
}

1 Ответ

0 голосов
/ 07 мая 2019

Хорошо, я исправил проблему, используя сервер и этот Nativ Render Plugin .Плагин Render использует Direct3D и RenderAPI для установки текстуры.

...