我们在 Unity3D 上开发了一个应用程序,它将从屏幕上获取图像并将其传输到 Texture2D。
我们在普通(微弱)设备上的性能方面存在困难。
代码如下。我们做一个屏幕截图,然后我们读取像素(ReadPixels)——这里出现了问题,一个应用程序运行得非常慢。
我们试图从相机中获取纹理,但它不起作用,因为我们的扫描仪与 Kudan 并行工作,从而阻止了对相机的访问。然后我们尝试限制要扫描的屏幕区域(通过扫描小窗口,而不是全屏) - 但性能没有明显提高。
有人能帮忙吗?
这是我们的代码:
IEnumerator DecodeScreen()
{
yield return new WaitForEndOfFrame();
RenderTexture RT = new RenderTexture(Screen.width, Screen.height,24);
Texture2D screen = new Texture2D(RT.width, RT.height, TextureFormat.RGB24, false, false);
screen.ReadPixels(new Rect(0, 0, RT.width, RT.height), 0, 0);
screen.Apply();
Debug.Log(resultText.text);
GetComponent().targetTexture = null;
Destroy(RT);
}
最佳答案
有几种方法可以改进此代码或将 RenderTexture
转换为 Texture2D
的可选方法。
1 . 将 WaitForEndOfFrame
声明为函数外部的变量,这样您就不必在每次调用该函数时都这样做。
2 。每次调用该函数时都会创建一个新的 Texture2D
。在 Start
函数中执行一次,然后重新使用它。如果 RenderTexture
宽度或高度发生变化,您可以自由调整纹理的大小。
3 。每次调用该函数时,您也在创建新的 RenderTexture
。
使用 RenderTexture.GetTemporary
获取临时 RenderTexture
更快。使用完毕后,可以通过 RenderTexture.ReleaseTemporary
释放它。
Texture2D screen = null;
WaitForEndOfFrame frameEndWait = new WaitForEndOfFrame();
void Start()
{
screen = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, false, false);
}
IEnumerator DecodeScreen()
{
yield return frameEndWait;
RenderTexture RT = RenderTexture.GetTemporary(Screen.width, Screen.height, 24);
//Resize only when Texture2D is null or when its size changes
if (screen == null || screen.width != RT.width || screen.height != RT.height)
{
screen.Resize(RT.width, RT.height, TextureFormat.RGB24, false);
//screen = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, false, false);
}
screen.ReadPixels(new Rect(0, 0, RT.width, RT.height), 0, 0);
screen.Apply();
RenderTexture.ReleaseTemporary(RT);
}
您还有其他选择:
在 C++ 中使用原生插件 :
将
RenderTexture.GetNativeTexturePtr()
发送到 C++ 的 native 端,然后从中创建一个 OpenGL 纹理,并使用 Texture2D.CreateExternalTexture
函数从 C# 加载它的指针,并继续使用 Texture2D.UpdateExternalTexture
函数更新它。最快的方法是 放弃
RenderTexture
。使用 OpenGL glReadPixels
函数从 C++ 端截取屏幕截图,然后使用指针将图像发送到 Unity 并使用 Texture2D.CreateExternalTexture
函数加载它,并使用 Texture2D.UpdateExternalTexture
函数不断更新它。您可以从我的 other post 修改鼠标像素代码并使其执行此操作。关于c# - RenderTexture转Texture2D很慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45100993/