我使用LibGDX创建了一款游戏,一切都在我的手机上运行正常,三星S3,但是我的一位朋友报告说,在他的索尼Xperia T上,在玩游戏约3分钟左右后屏幕变得空白。这是可重复的,每次都会发生。
我正在玩我的代码并意识到我可以通过处置资产然后尝试使用它们来强制显示空白屏幕。我也意识到我的代码有点废话,因为:
这让我觉得每次使用show()显示一个Screen时,都会创建一个新的Skin实例,并且在上一次调用show()期间创建的前一个Skin实例的任何引用都将丢失并可用于垃圾收集。
LibGDX documentation表示图形资产不可用于垃圾收集器,并且无论如何垃圾收集器只会看到对类的小引用,而不是实际的图形资产,这就是为什么你必须自己调用dispose()以节省内存。
我的问题是:如果垃圾收集器运行并清理我的旧皮肤引用,那么它会自动处理()它附加的图形资产,这样当我尝试创建一个引用这些资产的新皮肤时,它们会已被处置?
如果是这样,有没有办法测试?
我认为我朋友的Xperia T对垃圾收集的态度比我的S3更具侵略性。
感谢您的帮助。
答案 0 :(得分:0)
对于在LibGDX中实现Disposable接口的任何Object,在它超出范围并获得GC之前,必须自己调用dispose()
。那是因为所有这些类都有GC不知道的本机或GPU内存。
由你决定如何组织你的代码,但是我会说你用来实例化东西的任何类也应该在你停止引用之前通过调用所有Disposables上的dispose()
来清理它们。
所以你可能有一个实现Screen的自定义类。我会给你的Screen实现类它自己的dispose()
方法,它在它实例化的任何Disposable上调用dispose()
。然后记得在屏幕超出范围之前在屏幕上调用dispose()
。
只要在更换参考之前清理旧皮肤,理论上使用静态变量来引用皮肤应该没问题。但看起来这似乎不会对bug有很强的抵抗力。
我无法确切地说明为什么你的屏幕在没有看到更多代码的情况下会变黑。您可以做的一个测试是使用除黑色之外的清晰颜色,因此如果它只是纹理加载问题,您将看到网格的轮廓。
答案 1 :(得分:0)
希望这有帮助。