在 Android 设备上使用 Texture2d.LoadImage(byte[]) 加载图像时出现不稳定错误

Erratic errors loading image with Texture2d.LoadImage(byte[]) on Android devices

我有一个应用程序必须根据字节数组(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);

这工作正常,但是,根据设备和图像的大小,随机数量的图像后,应用程序冻结,然后将被 OS 关闭。它总是另一个失败的图像。此外,数据源无关紧要。

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

编辑器中没有出现错误。在开发版本和生产版本中的 android 设备 (2) 上发生错误。

在网上搜索,我发现了下面的条目,它指出了同样的问题,但没有发布解决方案(他们绕着 www-part 转了一圈,但问题不在于此):

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

更新

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

texture.LoadImage(data,true);      

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