避免不必要的检查

时间:2016-05-01 21:11:46

标签: java optimization graphics game-loop

我有一个游戏有两种模式:定时限制和股票限制(有点像粉碎兄弟)。在我的游戏循环中,调用一个名为renderGame()的方法,它更新移动对象的显示坐标,然后调用repaint()。

@Override
public synchronized void paint(Graphics g) {
   super.paintComponent(g);

   Graphics2D g2d = (Graphics2D) g;

 //Background Image
   g2d.drawImage( displayBackground, 0, 0, null );

 //Stage Image
   g2d.drawImage( displayMap, 0, 0, null );

 //Players Images
   for( Player p: players ){
      if( p.getPlayerNumber() == 1 )
         g2d.drawImage( displayMario, p1XDisplayCoord, p1YDisplayCoord, null);
      else
         g2d.drawImage( displayLuigi, p2XDisplayCoord, p2YDisplayCoord, null);
    }

 //Not implemented yet  
   drawHUD( g2d );

   g2d.dispose();
}

我的问题是:我怎样才能使drawHUD()方法根据匹配中的当前进程绘制不同的东西,而不必在每次调用renderGame()时测试定义该状态的条件我的游戏循环?有点像铁路开关。

例如:它应该在启动期间绘制一个'ready-set-go'序列,在游戏过程中绘制玩家统计数据,并且一旦比赛结束它应该指示一个匹配赢家。它也应该依赖于游戏类型。例如:显示一个在股票匹配期间递增但在定时匹配期间递减的计时器。

1 个答案:

答案 0 :(得分:1)

重大问题:

  • 你正在重写油漆而又叫super.paintComponent - 这是一件非常危险的事情。而是paintComponent并调用相同的super方法。
  • 你正在处理JVM给你的Graphics对象,这是另一个非常危险的事情,因为它完全打破了图形链。不要这样做,而是只处理你自己创建的Graphics对象。
  • Swing是单线程的,所以没有理由同步paint或paintComponent,如果你这样做会有风险。

回复:

  

我的问题是:我怎样才能使drawHUD()方法根据匹配中的当前进程绘制不同的东西,而不必在每次调用renderGame()时测试定义该状态的条件我的游戏循环?有点像铁路开关。

大多数状态检查不应该很昂贵,但如果有的话,你可以使用某种类型的布尔开关,如果状态发生变化则设置它,绘制方法可以测试然后重置。