【问题标题】:Creating UI Image from Texture2D从 Texture2D 创建 UI 图像
【发布时间】:2016-03-16 18:32:15
【问题描述】:

我正在开发一个直播应用程序,它接收 JPEG 图像作为字节数组屏幕上显示强> 与UI.Image。它工作很好,但我正在进行优化并且有几个问题。目前,我下面的代码将字节数组转换为Texture2D,然后创建Texture2DSprite,然后将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);

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

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 而不创建new Sprite,因为我相信Sprite.Create(camTexture, new Rect(0, 0, camTexture.width, camTexture.height), Vector2.zero, 0); 分配新内存每次Sprite.Create 打电话。我查看了 Unity 文档,但找不到任何其他方法。

我的问题是:

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

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

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

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

编辑: 用 Joe 对 RawImage 的回答,最终的代码是这样的:

RawImage screenDisplay;
if(updateScreen){
camTexture.LoadImage(JPEG_VIDEO_STREAM);
screenDisplay.texture = camTexture;
updateScreen = false;
}

不再需要 Sprite。

【问题讨论】:

标签: c# performance optimization unity3d


【解决方案1】:

认为通过专门使用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。它立即解决了诸如此类的问题。

【讨论】:

  • 谢谢。我删除了 Image 并创建了 RawImage ,就是这样。感谢您提供镜子和翻转的东西。我为此制作的相机支持翻转/镜像图像的命令,但其他一些不支持,您的示例将有助于实现这一点。
猜你喜欢
  • 1970-01-01
  • 2015-06-24
  • 2013-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-06
相关资源
最近更新 更多