避免不必要的检查
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 次的状态进行持续测试似乎非常不必要。但如果它真的无关紧要,那么我想我不会改变任何东西。以上是关于避免不必要的检查的主要内容,如果未能解决你的问题,请参考以下文章