2015-08-25 71 views
3

我的应用程序出现了一些问题。有时它滞后,并给我“GC_CONCURRENT释放”。我使用MAT来查看消耗这么多内存的东西,并且我发现对象列表吃掉了很多内存。问题在于我的游戏中有块,我需要看看我的玩家是否踩在他们身上,这就是为什么我使用这个列表。我目前有200块,但我会有更多,我不认为他们应该使用这么多的内存,我能做些什么来解决这个问题?这是块类的样子:Android Studio Libgdx内存问题

package com.NeverMind.DontFall.android; 

import android.util.Log; 

import com.badlogic.gdx.Gdx; 
import com.badlogic.gdx.graphics.Texture; 
import com.badlogic.gdx.graphics.g2d.Sprite; 
import com.badlogic.gdx.graphics.g2d.SpriteBatch; 

/** 
* Created by user on 20-Aug-15. 
*/ 
public class blockClass { 
    private SpriteBatch spriteBatch; 
    public float x, y, sizeX = 100, sizeY = 100, startTime; 
    private boolean isTouched = false; 
    private Texture texture; 
    Sprite blockSprite; 
    public blockClass(float sentX, float sentY, Texture sentTexture, float scaleX, float scaleY){ 
     x = sentX; 
     y = sentY; 
     sizeY *= scaleY; 
     sizeX *= scaleX; 
     spriteBatch = new SpriteBatch(); 
     texture = sentTexture; 
     blockSprite = new Sprite(texture); 
     startTime = System.currentTimeMillis(); 
    } 
    public void draw(float cameraX, float cameraY) { 
     spriteBatch.begin(); 
     spriteBatch.draw(blockSprite, x + cameraX, y + cameraY, sizeX, sizeY); 
     spriteBatch.end(); 
    } 
    public void update(float posX, float posY, boolean immune){ 
     if (isTouched == false && immune == false) 
      if (touched(posX, posY)) 
       isTouched = true; 
     if (isTouched == true) { 
      y -= 10; 
     } 
    } 
    public boolean touched (float posX, float posY) 
    { 
     if (posX >= x && posX < x + sizeX && posY == y + sizeY) 
      return true; 
     return false; 
    } 
    public boolean toKill (float posY){ 
     if (isTouched && y < posY - 1000) 
      return true; 
     return false; 
    } 
} 
+1

在开始游戏或运行时,您何时创建200块? –

+0

它是一个全局变量,因此列表在游戏开始时创建,但只有一次。在列表创建后,我将其中的对象放在create()方法中,该方法只运行一次。 –

+1

游戏渲染时,你是否会杀死对象? –

回答

5

GC_CONCURRENT freed意味着垃圾收集器调用,因为杀的对象(例如分配null他们)。

有一个概念调用Object Pooling,它重用死对象,而不是杀死它,并从池中获取对象,而不是创建一个新的,所以你没有GC调用,同样没有GC_CONCURRENT freed

+0

你确定吗?您可能会误解,我认为它不应该暂停我的游戏,这会导致滞后,例如:GC_CONCURRENT已释放355K,15%免费11033K/12935K,暂停17ms + 2ms,总计58ms –

+2

是的,我确信池化是一种避免gc呼叫的常用方法。正如你的评论“是的,当我不再需要这个对象时”。你通过杀死你的对象来调用gc –

+0

gdx给出了它自己的池类,如果你不想使用它,你可以编写自己的逻辑。作为一个拇指规则,我的对象数量是一次激活的对象的最大数量加上3个以避免任何空指针,然后与它们一起分配它们,从而节省memeory和gc调用。一个例子可以是一个子弹在射击游戏,如果我每次做一个新的对象,然后使其为空,那么gc将滞后游戏,所以更好地重用子弹时,其显示屏幕上的范围结束 –