编辑:我知道这段代码不好,我只是好奇为什么它是如此糟糕,当它取自表面上有信誉的来源: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,但几乎我看到的每个教程在某些方面都将两者结合起来。这真的很糟糕,还是只在某些情况下?