2015-07-19 81 views
0

我有一個不斷被調用來更新遊戲的遊戲循環。在這個循環是下面的代碼:下面的代碼會導致我的遊戲循環中的性能問題

mySurfaceView.post(new Runnable() { 
      public void run() { 
       myView.setTranslationX(myCam.getX()); 
       myView.setTranslationY(myCam.getY()); 

      } 
     }); 

有人告訴我說把「新」的關鍵字在我的遊戲循環通常不是一個好主意,因爲內存不斷被分配給新的對象。然而,這是一個匿名的內部類,所以我不確定這裏是否適用。此代碼是否會導致性能問題?如果是這樣,那麼我將如何去解決它們?當他移動時,我使用這段代碼讓我的屏幕圍繞我的玩家。

回答

1

一種方法是將消息發送到UI線程上的處理程序,而不是發佈Runnable。如果你的翻譯X/Y值是整數,這是最簡單的。

例如,請參閱Grafika中的「記錄GL應用程序」活動中使用ActivityHandler的方式。 UI線程創建一個新的處理程序並將其傳遞給呈現器線程,該線程向其發送消息。 handleUpdateFps()就是一個很好的例子,因爲它將一對整數傳遞給UI線程。

如果您不能將這些值作爲定點傳遞,則必須將它們傳遞給一個Object,並且事情開始變得複雜。總體而言,這種方法比簡單發佈Runnable更爲重要。 (更好的方法是在內部調整你的座標,有一個「世界空間」和「屏幕空間」的概念,而不是混亂視圖的值。但是看着你的其他問題,你嘗試了這種方法並沒有成功。)

+0

幸運的我剛纔發現我的問題是我沒有適當調整我的TouchListener的x和y值,所以我不再需要再亂用視圖了。儘管如此,檢查和投票給你我的好先生。對於上面的代碼是否會導致性能問題,我從來沒有得到過是或否的答案。我猜是的? –

+0

最好避免在遊戲循環中分配,因爲虛擬機需要偶爾收集垃圾。垃圾收集器已經改進了多年,所以你不會像Android 1.0那樣得到100ms的打嗝,但收集垃圾總是比收集垃圾更昂貴。 – fadden