2015-08-25 109 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將滯後遊戲,所以更好地重用子彈時,其顯示屏幕上的範圍結束 –