有几种方法可以改进此代码或转换RenderTexture 为Texture2D.
1 .声明WaitForEndOfFrame为函数外部的变量,这样您就不必在每次调用该函数时都这样做。
2Texture2D .每次调用该函数时,您都在创建一个新函数。在函数中执行一次,Start然后重新使用它。如果RenderTexture宽度或高度发生变化,您可以自由调整纹理的大小。
3RenderTexture .每次调用该函数时,您也会创建新的。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。使用 OpenGLglReadPixels函数从 C++ 端截取屏幕截图,然后使用指针将图像发送到 Unity 并使用该函数加载它并使用该Texture2D.CreateExternalTexture函数不断更新它Texture2D.UpdateExternalTexture。您可以从我的另一篇文章中修改鼠标像素代码并使其执行此操作。