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