首页 > 解决方案 > 在 Android 设备上使用 Texture2d.LoadImage(byte[]) 加载图像时出现错误

问题描述

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

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/

更新

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

texture.LoadImage(data,true);      

标签: androidunity3dtexture2d

解决方案


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


推荐阅读