2017-07-14 516 views
1

我们在Unity3D上开发一个应用程序,它将从屏幕上获取图像并将其传输到Texture2D。 我们在平均(虚弱)设备上的性能遇到困难。
代码如下。我们做了一个截图,然后我们读取像素(ReadPixels) - 这里出现问题,应用程序运行非常缓慢。RenderTexture到Texture2D非常缓慢

我们尝试从相机中取出纹理,但它不起作用,因为我们的扫描仪与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); 
} 

回答

1

有改善这种代码或RenderTexture转换为Texture2D可选方式几个方面。

.Declare WaitForEndOfFrame作为函数外的变量,因此每次调用函数时都不必这样做。

。您每次调用该函数时都会创建一个新的Texture2D。在Start函数中执行一次,然后重新使用它。如果宽度或高度改变,您可以自由调整纹理的大小。

。您每次调用该函数时也会创建新的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的机端++然后从创建的OpenGL纹理和加载带指针的C#使用Texture2D.CreateExternalTexture函数并使用Texture2D.UpdateExternalTexture函数继续更新。


做到这一点,最快的方法就是放弃RenderTexture。使用OpenGL glReadPixels函数从C++端截取图像,然后使用指针将图像发送到Unity,并使用Texture2D.CreateExternalTexture函数加载它,并使用Texture2D.UpdateExternalTexture函数继续更新它。您可以修改我的other post中的鼠标像素代码并使其执行此操作。