在Android设备上使用Texture2d.LoadImage(byte [])加载图像时发生的错误错误

问题描述 投票:0回答:1

我有一个必须基于字节数组(PNG和JPG)中包含的数据即时创建Sprite实例的应用程序。以下代码用于创建精灵:

Texture2D texture = new Texture2D(2, 2, TextureFormat.RGBA32,false,false); 
texture.LoadImage(data);
Vector2 pivot = new Vector2(0.5f, 0.5f);
Rect tRect = new Rect(0, 0, texture.width, texture.height);        
return Sprite.Create(texture, tRect, pivot);

但是,这取决于设备和图像的大小,在随机数量的图像后,该应用程序将冻结,然后被操作系统关闭。它始终是另一个图像,但会失败。另外,数据源也无关紧要。

通过adb查看应用程序日志不会显示任何内容。如果我写调试日志,我可以看到,被调用的最后一条语句是texture.LoadImage。但是,没有异常或有关该错误的其他信息。捕获异常也不起作用。

在编辑器中不会发生此错误。在开发版本和生产版本的android设备(2)上发生错误。

搜索网络,我发现下面的条目,它指出同样的问题,但尚未发布解决方案(它们在www-part周围盘旋,但问题并不在于此:]]

https://forum.unity.com/threads/android-crash-when-using-multiple-www.483941/

UPDATE

[一个有趣的发现是,如果将markNonReadable方法的texture.LoadImage() -Parameter设置为true,则错误发生的频率降低了,但仍然存在。

texture.LoadImage(data,true);      

我有一个必须根据字节数组(PNG和JPG)中包含的数据动态创建Sprite-instances的应用程序。以下代码用于创建精灵:Texture2D texture = new ...

android unity3d texture2d
1个回答
1
投票

纹理不是垃圾收集的。因此,如果使用新的Texture创建纹理,则在不再需要时使用Destroy(texture)销毁该纹理。我相信Sprite对象也需要销毁。在您的情况下,加载的纹理会保留在内存中,直到Android OS由于内存压力而关闭您的应用程序为止。UnloadUnusedAssets()还应该销毁所有不再引用的纹理和精灵,但是这会花费很多时间(大约1秒),因此只有在更改场景时才调用它是有意义的。

© www.soinside.com 2019 - 2024. All rights reserved.