微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Libgdx 动画内存泄漏

如何解决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)
                                                  
                          }
       
        
        }

游戏启动时,android profiler 数据

enter image description here

enter image description here

10 分钟后

enter image description here

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。