2013-01-24 145 views
-2

我正在開發Android中的2D視頻遊戲,使用JAVA和OpenGL-ES。GC與Android視頻遊戲

我有一個問題,我認爲這是垃圾收集器。無論我在做什麼,每隔幾秒鐘,遊戲就會凍結。

我一直在閱讀關於它的一些文檔,並且刪除了我所有的循環迭代器,現在我用於(i = 0,...)等解決方案。案件是,它沒有做任何與性能...

我一直在尋找我的代碼,我發現了一些我認爲可能會造成問題,這是我在動畫中的精靈之間更改的方式。

例如,我有一個可以按下某些鍵的英雄。當它走路時,他的精靈在幀之間變化。爲此,我移動紋理緩衝區來瞄準我想要的圖像部分。而每它的時候,我用這個函數:

protected void SetTextureBuffer(float xo, float xf, float yo, float yf) { 

    float textureVertexs[] = { 
      xo, yf,  // top left 
      xf, yf,  // bottom left 
      xf, yo,  // top right 
      xo, yo  // bottom right 
    }; 

    // a float has 4 bytes so we allocate for each coordinate 4 bytes 
    ByteBuffer byteBuffer = ByteBuffer.allocateDirect(textureVertexs.length * 4); 
    byteBuffer.order(ByteOrder.nativeOrder()); 

    // allocates the memory from the byte buffer 
    textureBuffer = byteBuffer.asFloatBuffer(); 

    // fill the vertexBuffer with the vertices 
    textureBuffer.put(textureVertexs); 

    // set the cursor position to the beginning of the buffer 
    textureBuffer.position(0); 
} 

它分配的內存來創建緩衝每次被調用,這可能是很多次每秒,因爲有更多的實體動畫...

你認爲這可能是一個問題?還是我看錯了?如果這是一個問題...我怎麼能以另一種更有效的方式解決這個問題?

+0

嘗試刪除'ByteBuffer byteBuffer = ByteBuffer.allocateDirect(textureVertexs.length * 4); byteBuffer.order(ByteOrder.nativeOrder());'行 – m0skit0

+0

然後我分配給textureBuffer呢? – Frion3L

+0

對不起,也刪除'textureBuffer = byteBuffer.asFloatBuffer();'。在你的類的構造函數/初始化器中分配'textureBuffer'一次。由於您不需要保留以前的數據,因此無需再次重新創建緩衝區。所以你只需要覆蓋同一緩衝區中的舊數據。 – m0skit0

回答

1

嘗試刪除這些行:

ByteBuffer byteBuffer = ByteBuffer.allocateDirect(textureVertexs.length * 4); 
byteBuffer.order(ByteOrder.nativeOrder()); 
textureBuffer = byteBuffer.asFloatBuffer(); 

在類的構造函數/初始化分配textureBuffer一次。由於您不需要保留以前的數據,因此無需再次重新創建緩衝區。所以你只需要覆蓋同一緩衝區中的舊數據。