避免不必要的检查

Posted

技术标签:

【中文标题】避免不必要的检查【英文标题】:Avoiding unnecessary checks 【发布时间】:2016-05-01 21:11:46 【问题描述】:

我的游戏有两种模式:限时限时和限时限时(有点像粉碎兄弟)。在我的游戏循环中,调用了一个名为 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() 时测试定义该状态的条件我的游戏循环?有点像铁路道岔。

例如:它应该在启动过程中绘制一个“准备就绪”序列,在游戏过程中绘制玩家统计数据,并且应该在比赛结束后指示比赛获胜者。它也应该取决于游戏类型。例如:显示一个计时器,该计时器将在股票匹配期间递增,但在定时匹配期间递减。

【问题讨论】:

您可以提供具有“draw”方法的不同类,该方法仅绘制特定实现所需的功能,然后您可以根据需要更改使用的实例 @MadProgrammer 我想我知道可以这样做,但我试图找到一个不涉及新类的较低级别的解决方案。 那么你总是需要做一些状态检查:P @MadProgrammer 我明白了。 【参考方案1】:

大问题:

您正在覆盖油漆并调用super.paintComponent - 这是一件非常危险的事情。取而代之的是 paintComponent 并调用同一个 super 的方法。 您正在处理 JVM 提供给您的 Graphics 对象,这是另一件非常危险的事情,因为它完全破坏了图形链。不要这样做,而只是处置您自己创建的 Graphics 对象。 Swing 是单线程的,因此没有理由同步绘制或绘制组件,如果这样做会冒风险。

回复:

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

大多数状态检查不应该很昂贵,但如果有的话,您可以使用某种布尔开关,如果状态改变,则设置该开关,绘画方法可以对其进行测试然后重置。

【讨论】:

感谢您指出这些问题 - 我只是进入图形领域,我不太了解。但只是为了澄清你的答案 - 我无法避免某种测试? 你也可以有不同的类(来自一个公共接口或类)呈现不同的状态,作为一个想法 +1 不少 @hjl 不知何故必须确定。他的意思是没有什么可以优化的,因为这些测试很可能比绘画本身快得多。不要优化不需要的东西。 +++ 如果它很慢(测量!),您可以不时进行这样的检查(例如每 10 次油漆)并存储结果。或者在事件发生时存储结果,例如游戏开始。 @maaartinus 我只是认为对每场比赛只会改变大约 3 次的状态进行持续测试似乎非常不必要。但如果它真的无关紧要,那么我想我不会改变任何东西。

以上是关于避免不必要的检查的主要内容,如果未能解决你的问题,请参考以下文章

Null-Checks的频率和位置

如何避免不必要的控制台窗口

SQL语句优化

代码规范

DB concept 恢复系统

避免使用finalize方法