【发布时间】: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 文档,但找不到任何其他方法。
我的问题是:
如何在不先将
camTexture(Texture2D)转换为Sprite的情况下将camTexture(Texture2D)分配给屏幕screenDisplay(UI.Image)?Sprite.Create调用时是否分配新内存?如果对此有解决方案,该解决方案是否比我目前在性能和性能方面更好 strong>内存管理?
注意:我没有计划使用OnGUI 绘制Texture2D。我想用新的 Unity UI 做到这一点。谢谢。
编辑: 用 Joe 对 RawImage 的回答,最终的代码是这样的:
RawImage screenDisplay;
if(updateScreen){
camTexture.LoadImage(JPEG_VIDEO_STREAM);
screenDisplay.texture = camTexture;
updateScreen = false;
}
不再需要 Sprite。
【问题讨论】:
-
这里有机会使用
RawImage吗? -
在场景中,我将要更改的图像是一种 Image 而不是 RawImage。但是,如果可以投射 RawImage 或 Image 甚至将 RawImage 直接显示到屏幕上,那我就可以了。
-
我刚刚阅读了这个answers.unity3d.com/questions/1070280/raw-image-vs-image.html,它看起来就像我正在寻找的东西。继续你的答案。
-
感谢上帝 .... 迫不及待想看看您是如何实现这一点的
标签: c# performance optimization unity3d