如何解决Libgdx 动画内存泄漏
我正在用 libgdx 制作游戏。
我以每 1 秒的速度在 update() 中创建新球。我添加了球接触墙壁时的爆炸动画。
如您所知,如果我不删除()或处置()所有动画,有时游戏会因动画内存泄漏而崩溃。为了避免这种崩溃,我使用了 Pool 类。
当我尝试 remove() 爆炸演员时,问题就开始了。我正在使用 Stage 类来创建动画。 Animation 类具有使用 loadAnimationFromSheet()
的构造函数,后者具有另一个类,如 TextureRegion。
我认为当我尝试删除动画时,动画正在删除,但像 textureRegions 一样没有删除,这是内存泄漏的原因。
我正在使用 android profiler 查看分配和内存使用情况
10 分钟后内存增加。
我该怎么做才能删除所有子元素,例如 loadAnimationFromSheet()
方法的 Texture 或 TextureRegion。
加载动画
fun loadAnimationFromFiles(fileNames: Array<String>,frameDuration: Float,loop: Boolean,textureFilter: TextureFilter = TextureFilter.Linear): Animation<TextureRegion> {
val textureArray: Array<TextureRegion> = Array()
for (i in 0 until fileNames.size) {
val texture = Texture(Gdx.files.internal(fileNames[i]))
texture.setFilter(textureFilter,textureFilter)
textureArray.add(TextureRegion(texture))
}
val anim: Animation<TextureRegion> = Animation(frameDuration,textureArray)
if (loop)
anim.playMode = Animation.PlayMode.LOOP
else
anim.playMode = Animation.PlayMode.norMAL
if (animation == null)
setAnimation(anim)
return anim
}
设置动画
fun setAnimation(anim: Animation<TextureRegion>) {
animation = anim
val tr: TextureRegion = animation!!.getKeyFrame(0.toFloat())
val w: Float = tr.regionWidth.toFloat()
val h: Float = tr.regionHeight.toFloat()
setSize(w,h)
setorigin(w/2,h/2)
if (boundarypolygon == null)
setBoundaryRectangle()
}
动画类被称为“爆炸”
class Explosion (x: Float,y: Float,s: Stage) : MyActors(x,y,s) {
init {
loadAnimationFromSheet("explosion1.png",6,.03f,true)
}
}
动画池类
class ExplosionPool(x: Float,s: Stage): Pool<Explosion>() {
var x = 0f
var y:Float = 0f
var s:Stage=s
init {
this.x=x
this.y=y
this.s=s
}
override fun newObject(): Explosion {
return Explosion(x,s)
}
}
最后是我在 GameScreen 类中的 initialize()
和 update()
方法。
lateinit var explosions:Array<Explosion>
lateinit var pool: ExplosionPool
---------
---------
override fun initialize() {
-------
-------
pool= ExplosionPool(0f,0f,mainStage)
explosions= Array()
}
override fun update(dt: Float) {
-------
-------
if (ball.isTouching()==true) {
val explosion=pool.obtain()
explosion.centeratActor(ball)
explosions.add(drop)
if(explosions.isAnimationFinished()==true)
{ explosions.removeValue(drop,true)
pool.free(explosions)
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。