2015-07-19 83 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