当前位置: 首页 > 面试题库 >

Java双缓冲

喻珂
2023-03-14
问题内容

我正在研究一个项目,并且在使用Java的双重缓冲方面已经读了尽可能多的内容。我想做的是向我的JFrame添加一个组件或面板或包含要绘制到其上的双缓冲表面的东西。如果可能,我想使用硬件加速,否则请使用常规软件渲染器。到目前为止,我的代码如下所示:

  public class JFrameGame extends Game {

    protected final JFrame frame;
    protected final GamePanel panel;
    protected Graphics2D g2;

    public class GamePanel extends JPanel {

        public GamePanel() {
            super(true);
        }

        @Override
        html" target="_blank">public void paintComponent(Graphics g) {
            g2 = (Graphics2D)g;
            g2.clearRect(0, 0, getWidth(), getHeight());
        }
    }

    public JFrameGame() {
        super();
        gameLoop = new FixedGameLoop();

        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        panel = new GamePanel();
        panel.setIgnoreRepaint(true);
        frame.add(panel);

        panel.setVisible(true);
        frame.setVisible(true);
    }

    @Override
    protected void Draw() {
        panel.repaint(); // aquire the graphics - can I acquire the graphics another way?
        super.Draw(); // draw components

        // draw stuff here

        // is the buffer automatically swapped?
    }


    @Override
    public void run() {
        super.run();
    }
}

我创建了一个抽象的游戏类和一个调用Update和Draw的游戏循环。现在,如果您看到我的评论,那就是我主要关注的领域。有没有一种方法可以获取图形,而不是通过repaint和paintComponent然后为每次重绘分配一个变量?另外,此硬件默认情况下是否加速?如果不是,我应该怎么做才能使其硬件加速?


问题答案:

如果要更多地控制窗口的更新时间并利用硬件页面翻转(如果有)的优势,可以使用BufferStrategy该类。

您的Draw方法将如下所示:

@Override
protected void Draw() {
    BufferStrategy bs = getBufferStrategy();
    Graphics g = bs.getDrawGraphics(); // acquire the graphics

    // draw stuff here

    bs.show(); // swap buffers
}

缺点是这种方法不能与事件驱动的渲染很好地结合在一起。通常,您必须选择一个。也getBufferStrategy仅在Swing组件中实现,Canvas并且Window使其与Swing组件不兼容。

教程可以在这里,这里和这里找到。



 类似资料:
  • 问题内容: 在从事2D游戏时,我读了很多有关Double Buffering的文章。我遇到了许多不同的实施策略,但不确定如何将Double Buffering放入我创建游戏窗口的方式中。例如,我遇到的一篇文章(http://content.gpwiki.org/index.php/Java:Tutorials:Double_Buffering)建议使用一种单独的绘制方法;但是,我怀疑如果您正在绘制

  • 我有一个MIPS 64位架构的缓存,每个块4KB的2路和16个字的行(每个块)。我必须确定: > [标记|索引|偏移] 每个字段的位大小 整个内存由多少位组成? 我不知道我所做的是否正确,因为我没有结果,因为我们使用的是64位MIPS而不是32位,我认为一个单词应该由8个字节而不是4个字节组成。 我通过执行4KB/(16个字*8个字节)计算了块的数量 然后我完成了=- 然后我得到字和字节偏移量,如

  • 问题内容: awt是否可以进行双缓冲(在Java中)?目前,我知道awt不应该与swing一起使用,所以我不能使用BufferStrategy之类的东西(我已经用awt编写了一些我不想在swing中重写的代码)。 如果使用awt可以进行双缓冲,我是否必须手动写入缓冲区?与swing不同,awt似乎没有相同的内置双缓冲功能。 如果必须手动编写代码,是否有一个不错的教程可以看?还是对于新手程序员来说,

  • 问题内容: 我想做的是在缓冲区上绘制图形,然后将其原样复制到画布上,这样我就可以制作动画并避免闪烁。但是我找不到这个选项。有人知道我该怎么做吗? 问题答案: 下面的有用链接除了显示使用双缓冲的示例和优点之外,还显示了使用html5 canvas元素的其他一些性能提示。它包含指向jsPerf测试的链接,这些链接将跨浏览器的测试结果汇总到Browserscope数据库中。这样可以确保性能提示得到验证。

  • 问题内容: 到目前为止,我已经通过创建和图像完成了双重缓冲,使用其关联的Graphics对象向该图像绘制了我想要的图像,然后使用paint方法的Graphics对象将该图像绘制到了屏幕上。最近,我了解了BufferStrategy类及其用法。我想知道这两种方法的优缺点。 编辑:我认为我的问题不太清楚。我想知道DIY方法和BufferStrategy的优缺点,以及何时应该使用其中一种。 问题答案:

  • 本文向大家介绍java用applet画图用到的方法(涉及双缓冲),包括了java用applet画图用到的方法(涉及双缓冲)的使用技巧和注意事项,需要的朋友参考一下 准备学习java2游戏编程。(其实这是一本书啦) 然后作为基础的基础的基础,必须学习如何让键盘与界面进行交互。下面就是对一个基础得不能再基础的applet程序。 虽然这是个小程序,但其中关于双缓冲概念的介绍是很重要的,要深入理解。(高级