双缓冲大大降低了性能

时间:2015-07-28 09:29:34

标签: java swing awt

编辑:我知道这段代码不好,我只是好奇为什么它是如此糟糕,当它取自表面上有信誉的来源:http://www.amazon.com/Killer-Game-Programming-Andrew-Davison/dp/0596007302

我一直在研究迄今为止使用被动动画的基于网格的游戏,也就是说,只要用户按下按钮(字符弹出正方形),所有内容都会被重绘。一旦我让机制工作得很好,我就回过头来介绍一个有效的渲染循环,它可以获取FPS值并创建一个合适的UPS,如果需要可以跳过帧来维护相应的UPS。

一开始一切运转良好,FPS / UPS即使超过100FPS也能保持稳定/接近,但当我尝试实施双缓冲时,FPS击落至约17,而UPS仍然接近我理想的环境!

我已经完成了我的研究,下面我有一个次要的,或许更多的意见问题,但我的主要问题是为什么这会造成如此巨大的性能影响?

以下两种方法称为每个动画循环。

public void buildWorld(){
    if (dbImage == null){
          dbImage = createImage(pWidth, pHeight);
          if (dbImage == null) {
              System.out.println("dbImage is null");
              return;
          }
          else{
              dbg = dbImage.getGraphics();
          }
    }
    //When the above statements are commented out, and the following line
    //Is used without the paintScreen method, a very high FPS is achieved.
    //dbg = this.getGraphics();

    dbg.setColor(new Color(0, 0, 0));
    dbg.fillRect(0, 0, this.getWidth(), this.getHeight());
    //various other things are drawn...
}
private void paintScreen(){ 
    Graphics g;
    try {
      g = this.getGraphics();
      if ((g != null) && (dbImage != null)){
          g.drawImage(dbImage, 0, 0, null);
      }
      g.dispose();
    }
    catch (Exception e)
    { System.out.println("Graphics context error: " + e);  }
}

我错过了一些明显的东西吗?为什么这会造成80%或更多的FPS损失?

现在讨论一些次要问题。到目前为止,我的设计基于“Java中的杀手游戏编程”一本有趣但过时的书。我正在绘制一个JScrollPane中的JPanel,这给了我一些不错的click'n'drag,RTS就像控制战场一样,但是很难实现我一直在阅读的许多双缓冲解决方案。基本上我已经决定,我将不得不彻底改革我的设计来解决这个问题,所以问题仍然存在:

假设我希望程序能够同时运行窗口和全屏,哪种渲染方法可以提供最高性能?

a)AWT画布+ JFrame

b)AWT帧

c)直接到JFrame

d)我做得很好,除非有些错误

另外,我看到很多模糊的谈论从不混合AWT和Swing,但几乎我看到的每个教程在某些方面都将两者结合起来。这真的很糟糕,还是只在某些情况下?

0 个答案:

没有答案