Hololens-Unity:LoadImage冻结主线程

时间:2019-02-18 14:24:29

标签: multithreading performance unity3d augmented-reality hololens

现在我有一个客户端和服务器。服务器正在制作屏幕截图,并以字节为单位将其发送给我的客户端。


我在这里获取字节并将其放入我的纹理中:

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;
}

这有效,但会导致hololens短暂冻结,可能持续1/2秒。

1。。我已经多次阅读 LoadImage 将在主线程上运行,并且您无法将其移动到其他地方。
2。。使用 Texture2D.LoadRawTextureData 应该可以更快地工作并解决我的问题。但是使用它会引发一个例外,即Im无法提供足够的数据。编写类似
var texture = new Texture2D(128, 128, TextureFormat.RGBA32, false);之类的内容无法解决问题。

sb知道如何以一种更有效的方式对字节进行编码,或者使主线程在解码图像时不会卡住吗?

-编辑- 我忘了说我正在使用此Main-Thread-Dispatcher,但没有帮助:

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 :(得分:0)

好的,我通过使用服务器和此Nativ Render Plugin解决了该问题。 Render插件使用Direct3D和RenderAPI设置纹理。