在从事2D游戏时,我读了很多有关Double Buffering的文章。我遇到了许多不同的实施策略,但不确定如何将Double
Buffering放入我创建游戏窗口的方式中。例如,我遇到的一篇文章(http://content.gpwiki.org/index.php/Java:Tutorials:Double_Buffering)建议使用一种单独的绘制方法;但是,我怀疑如果您正在绘制形状,而不是向窗口中添加组件,这将适用。
这是我的主要GUI代码(省略了keylistener方法)
public class MainWindow extends JFrame implements KeyListener{
private Dimension dim;
private CardLayout layout;
private JPanel panel;
private JLayeredPane gameLayers;
private Menu menu;
private MiniGame miniGame;
private Board board;
private Sprite sprite;
private Game game;
private Map map;
private GameState gs;
private Boolean[] keys;
public MainWindow(Game game, GameState gs, Map map, Sprite sprite){
//Call superclass.
super();
addKeyListener(this);
//Sore references to critical game components.
this.game = game;//So we can call methods when an event occurs.
this.gs = gs;
this.map = map;//Used to construct the board.
//The board needs to know the layout of the map.
this.sprite = sprite;//Used to add the sprite to one of the layers.
//Instantiate objects.
dim = new Dimension(800, 600);
layout = new CardLayout();
panel = new JPanel(layout);
menu = new Menu();
miniGame = new MiniGame();
board = new Board(map);
gameLayers = new JLayeredPane();
//Remove decoration and place window in center of screen.
setUndecorated(true);
Dimension screenDim = Toolkit.getDefaultToolkit().getScreenSize();
setBounds((screenDim.width /2)-(dim.width/2),
(screenDim.height/2)-(dim.height/2),
dim.width,
dim.height);
//Add the board to a layer.
gameLayers.add(board, JLayeredPane.DEFAULT_LAYER);
board.setBounds(0, 0, dim.width, dim.height);
board.setBoard();
//Add the sprite to a layer.
gameLayers.add(sprite, JLayeredPane.PALETTE_LAYER);
sprite.setBounds(0, 0, 50, 50);
//Add components to window.
panel.add(gameLayers, "gameLayers");
panel.add(miniGame, "miniGame");
panel.add(menu, "menu");
//Add the "cards" to the window.
add(panel);
//JFrame housekeeping.
pack();
setSize(dim);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setResizable(false);
setVisible(true);
//Holds state when an event is triggered.
//Ugly hack to circumvent delay issue.
keys = new Boolean[4];
for(int i=0; i<keys.length; i++){
keys[i] = false;
}
}
}
您如何建议我采取这种方法?请记住,Board是一个由缩放图像网格组成的JPanel,而子画面将是一个显示缩放图像的JComponent。
杰克。
重写JPanel的paintComponent()方法,然后首先将内容绘制到BufferedImage图像中。完成后,将BufferedImage的内容复制到从paintComponent()获得的图形上下文中。
protected void paintComponent(Graphics g)
{
BufferedImage bufferedImage = new BufferedImage(500, 500, BufferedImage.TYPE_ARGB);
Graphics2D g2d = bufferedImage.createGraphics();
//paint using g2d ...
Graphics2D g2dComponent = (Graphics2D) g;
g2dComponent.drawImage(bufferedImage, null, 0, 0);
}
问题内容: 我正在研究一个项目,并且在使用Java的双重缓冲方面已经读了尽可能多的内容。我想做的是向我的JFrame添加一个组件或面板或包含要绘制到其上的双缓冲表面的东西。如果可能,我想使用硬件加速,否则请使用常规软件渲染器。到目前为止,我的代码如下所示: 我创建了一个抽象的游戏类和一个调用Update和Draw的游戏循环。现在,如果您看到我的评论,那就是我主要关注的领域。有没有一种方法可以获取图
问题内容: awt是否可以进行双缓冲(在Java中)?目前,我知道awt不应该与swing一起使用,所以我不能使用BufferStrategy之类的东西(我已经用awt编写了一些我不想在swing中重写的代码)。 如果使用awt可以进行双缓冲,我是否必须手动写入缓冲区?与swing不同,awt似乎没有相同的内置双缓冲功能。 如果必须手动编写代码,是否有一个不错的教程可以看?还是对于新手程序员来说,
问题内容: 到目前为止,我已经通过创建和图像完成了双重缓冲,使用其关联的Graphics对象向该图像绘制了我想要的图像,然后使用paint方法的Graphics对象将该图像绘制到了屏幕上。最近,我了解了BufferStrategy类及其用法。我想知道这两种方法的优缺点。 编辑:我认为我的问题不太清楚。我想知道DIY方法和BufferStrategy的优缺点,以及何时应该使用其中一种。 问题答案:
问题内容: 我想做的是在缓冲区上绘制图形,然后将其原样复制到画布上,这样我就可以制作动画并避免闪烁。但是我找不到这个选项。有人知道我该怎么做吗? 问题答案: 下面的有用链接除了显示使用双缓冲的示例和优点之外,还显示了使用html5 canvas元素的其他一些性能提示。它包含指向jsPerf测试的链接,这些链接将跨浏览器的测试结果汇总到Browserscope数据库中。这样可以确保性能提示得到验证。
本文向大家介绍C#双缓冲技术实例详解,包括了C#双缓冲技术实例详解的使用技巧和注意事项,需要的朋友参考一下 本文实例分析了C#双缓冲技术。分享给大家供大家参考,具体如下: 双缓冲解决闪烁问题。 整理: GDI+的双缓冲问题 一直以来的误区:.net1.1 和 .net 2.0 在处理控件双缓冲上是有区别的。 .net 1.1 中,使用:this.SetStyle(ControlStyles.Dou
出于性能的考虑,servlet 容器允许(但不要求)缓存输出到客户端的内容。一般的,服务器是默认执行缓存,但应该允许 servlet 来指定缓存参数。 下面是 ServletResponse 接口允许 servlet 来访问和设置缓存信息的方法: getBufferSize setBufferSize isCommitted reset resetBuffer flushBuffer 不管 ser