сейчас у меня есть клиент и сервер.Сервер делает скриншоты и отправляет их моему клиенту в байтах.
Здесь я получаю байты и помещаю их в свою текстуру:
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;
}