我正在开发一款直播应用,它能够接收JPEG图像的字节数组并使用UI.Image
在屏幕上显示。目前它已经很好地工作,但我想要进行优化并有一些问题需要解决。当前,下面的代码将字节数组转换为Texture2D
,然后从Texture2D
创建Sprite
,最后将该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;
}
以上代码目前需要执行三个步骤才能将图像显示到屏幕上:
byte数组
-> Texture2D
-> Sprite
-> UI.Image
。
但我想让它看起来像这样:byte数组
-> Texture2D
-> UI.Image
。
我想直接将Texture2D
写入到UI.Image
,而不是创建一个新的Sprite
,因为我认为每次调用Sprite.Create(camTexture, new Rect(0, 0, camTexture.width, camTexture.height), Vector2.zero, 0);
都会分配新的内存。我查看了 Unity 文档,但没有找到其他方法。
我的问题是:
如何将
camTexture(Texture2D)
分配给屏幕screenDisplay(UI.Image)
,而不是先转换为Sprite
?每次调用
Sprite.Create
时是否会分配新的内存?如果有一个解决方案,那么在
性能
和内存管理
方面,这个解决方案是否更好?
注意:我没有计划使用OnGUI
来绘制Texture2D
。我想使用新的 Unity UI 进行操作。谢谢。
编辑: 根据Joe的答案,最终代码如下:
RawImage screenDisplay;
if(updateScreen){
camTexture.LoadImage(JPEG_VIDEO_STREAM);
screenDisplay.texture = camTexture;
updateScreen = false;
}
不再需要Sprite。
RawImage
吗? - Fattie