2011-08-30 45 views
2

我想測試一下繪製到Canvas的一些不同的方法,而不觸發垃圾收集。即使是最基本的例子也會導致頻繁的gcs。例如:不能避免在簡單循環中的GC

class Panel extends View { 
    private int mX = 0; 
    private Paint mPaint = new Paint(); 

    public Panel(Context context) { 
     super(context); 
     mPaint.setColor(0xFFFF0000); 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 
     canvas.drawColor(Color.BLACK); 
     canvas.drawRect(mX, 0, mX+40, 40, mPaint); 
     mX++; 

     postInvalidate(); 
    } 
} 

獲得帶有SurfaceView(登月艙實例)相同的結果。 GC每10秒鐘左右一次,在實時遊戲中相當震撼。我沒有在上面的繪製循環中進行任何分配,所以必須在畫布等類中分配一些東西(不幸的是)。

我用opengl測試成功了,沒有gcs,但我希望避免進入opengl。我對它很熟悉,但使用opengl繪製一些我想實現的效果會很困難。

感謝

回答

2

postInvalidate()可能必須創建一個對象。使用invalidate()代替,這裏沒有理由使用postInvalidate()。

+0

嗨羅曼,我認爲這有助於。 LogCat仍然顯示GC調用,但是來自不同的PID比我的應用程序。我不認爲我們可以對其他流程的GC做任何事情,對吧? – user291701

+0

@ user291701:「我不認爲我們可以對其他進程的GC進行任何操作,對嗎?」 - 正確,但他們應該對你的前臺進程的性能有輕微的影響。 – CommonsWare

2

而不是猜測,你應該在what is allocated看一看的。

+0

我以前使用MAT,但不知道如何在這種情況下有效地使用它。我猜測canvas類或其他android sdk類正在分配。如果MAT可以對快照進行區分以僅顯示新的分配,這將會有所幫助。 – user291701

+2

而不是MAT,使用DDMS的分配跟蹤功能來查看您的應用正在分配的內容。這就是@mibollma指出的,而不是MAT。 – CommonsWare