在Android设备上加载带有Texture2d.LoadImage(字节[])的图像时出现异常错误

在Android设备上加载带有Texture2d.LoadImage(字节[])的图像时出现异常错误,android,unity3d,texture2d,Android,Unity3d,Texture2d,我有一个应用程序,它必须根据字节数组(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, textur

我有一个应用程序,它必须根据字节数组(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部分进行了圈圈,但问题并不在于此):

更新

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

texture.LoadImage(data,true);      

纹理不会被垃圾收集。因此,如果使用“新纹理”创建纹理,则需要在不再需要时使用“销毁”(纹理)来销毁纹理。我相信精灵的物体也需要被摧毁。 在你的例子中,加载的纹理一直保留在内存中,直到Android操作系统因为内存压力关闭你的应用程序。
UnloadUnusedAssets()还应该销毁所有不再被引用的纹理和精灵,但这需要很多时间(大约1秒),因此只有在更改场景时调用它才有意义。

如何加载图像?通常通过Web服务加载,但我也尝试了从资源文件夹加载。同样的效果。最后它是一个字节数组(byte[])。映像数据未损坏。请尝试在加载下一个映像之前等待0.1-0.5秒。在正常操作中,情况就是这样。每次加载操作之间总有几秒钟的时间间隔。然而,这没有什么区别。在随机数张图像之后,它失败了。@Aleksandr:这确实只是一个内存问题。由于错误的随机发生,我过早地错误地排除了这种可能性。我只是通过清除对它的引用才释放了精灵。然而,这似乎还不够。在对纹理和精灵调用destroimmediate后,问题消失了。对答案发表评论,我会接受的。也许你也想在你的答案中写下,最好的方法是什么,释放精灵和它的纹理?谢谢你帮我省去了很多悲伤,