从 Texture2D 创建 UI 图像

Pro*_*mer 5 c# optimization performance unity-game-engine

我正在开发一个实时流应用程序,该应用程序接收JPEG图像作为字节数组并将其显示屏幕UI.Image。它工作正常,但我正在优化并且几乎没有问题。目前,代码我具有低于转换字节数组Texture2D随后创建一个Sprite从所述Texture2D然后分配SpriteUI.Iamge显示在屏幕上。

Texture2D camTexture;
Image screenDisplay;
public byte[] JPEG_VIDEO_STREAM;
bool updateScreen = false;
Run Code Online (Sandbox Code Playgroud)

//初始化

JPEG_VIDEO_STREAM = new byte[20000];
camTexture = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, false);
Run Code Online (Sandbox Code Playgroud)

//在更新函数中运行的主要代码

if(updateScreen){
camTexture.LoadImage(JPEG_VIDEO_STREAM);
Sprite tempSprite = Sprite.Create(camTexture, new Rect(0, 0, camTexture.width, camTexture.height), Vector2.zero, 0);
screenDisplay.sprite = tempSprite;
updateScreen = false;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码目前执行 3 个步骤只是为了将图像显示到屏幕上。

byte array -> Texture2D -> Sprite -> UI.Image

但我希望它看起来像byte array -> Texture2D-> UI.Image

我想Texture2D直接写入UI.Image 而不创建新的 Sprite,因为我相信每次调用都会Sprite.Create(camTexture, new Rect(0, 0, camTexture.width, camTexture.height), Vector2.zero, 0); 分配新的内存Sprite.Create。我查看了 Unity 文档,找不到任何其他方法来做到这一点。

我的问题是:

  1. 如何camTexture(Texture2D)screenDisplay(UI.Image)不先转换camTexture(Texture2D)为的情况下分配给屏幕Sprite

  2. Sprite.Create调用时是否分配新内存?

  3. 如果有解决方案,该解决方案在性能内存管理方面是否比我目前拥有的更好

注意:我没有使用OnGUI绘制的计划Texture2D。我想用新的 Unity 做到这一点UI。谢谢。

编辑: 根据 Joe 对 RawImage 的回答,最终代码如下所示:

RawImage screenDisplay;
if(updateScreen){
camTexture.LoadImage(JPEG_VIDEO_STREAM);
screenDisplay.texture = camTexture;
updateScreen = false;
}
Run Code Online (Sandbox Code Playgroud)

不再需要雪碧。

Fat*_*tie 3

认为通过专门使用 aRawImage而不是Image,可以做到这一点。

RawImage广泛使用,因为我们必须“显示 PNG”,而且它更容易。

考虑一个非常方便的技巧:

只需从您导入的一个简单的灰色PNG开始..然后修改它..而不是尝试从头开始构建?

我发现的一个有趣的好奇心是:通常要镜像图像,您只需将 x 或 y 缩放到 -1 即可。除非已修复,否则 Unity 会遇到一个问题,即该方法不适用于RawImage.

    // currently in Unity, the ONLY way to mirror a RAW image is by fooling with
    // the uvRect. changing the scale is completely broken.

    if ( shouldWeMirror )
      rawImage.uvRect = new Rect(1,0,-1,1); // means mirror
    else
      rawImage.uvRect = new Rect(0,0,1,1);  // means no flip
Run Code Online (Sandbox Code Playgroud)

另一个有趣的因素。出于这个原因,许多 Unity 项目仍然使用(即使是 2017 年)最高级的2dToolkit。它可以立即解决诸如此类的问题。