我正在处理一个实时流应用程序,该应用程序以字节数组的形式接收 JPEG 图像,并且屏幕上用UI.Image显示。它可以工作很好,但是我正在优化优化,并且对有几个问题。当前,我下面的代码将字节数组转换为Texture2D,然后Sprite创建一个Texture2D,然后将该Sprite分配给UI.Iamge以显示在屏幕上。

Texture2D camTexture;
Image screenDisplay;
public byte[] JPEG_VIDEO_STREAM;
bool updateScreen = false;

//初始化
JPEG_VIDEO_STREAM = new byte[20000];
camTexture = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, false);

//在Update函数中运行的主代码
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;
}

上面的代码当前仅执行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文档,找不到其他方法来执行此操作。

我的问题是:
  • 如何在不先将camTexture(Texture2D)转换为screenDisplay(UI.Image)的情况下将camTexture(Texture2D)分配到屏幕Sprite
  • 调用时Sprite.Create是否分配新的内存吗?
  • 如果对此有一个解决方案,就性能内存管理而言,该解决方案 是否比我目前拥有的解决方案更好?

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

    编辑:
    有了Joe对RawImage的回答,最终代码如下所示:
    RawImage screenDisplay;
    if(updateScreen){
    camTexture.LoadImage(JPEG_VIDEO_STREAM);
    screenDisplay.texture = camTexture;
    updateScreen = false;
    }
    

    不再需要雪碧。

    最佳答案

    我认为,通过专门使用RawImage而不是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
    

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

    关于c# - 从Texture2D创建UI图像,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36044140/

    10-10 18:18