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

了解缓冲策略

程毅
2023-03-14
问题内容

我是Java的新手。我想做一个游戏。经过大量研究,我不了解缓冲策略的工作原理。.我了解基础知识..它创建了一个屏幕外图像,您以后可以将其放入Windows对象中。

public class Marco extends JFrame {
    private static final long serialVersionUID = 1L;
    BufferStrategy bs; //create an strategy for multi-buffering.

    public Marco() {
       basicFunctions(); //just the clasics setSize,setVisible,etc
       createBufferStrategy(2);//jframe extends windows so i can call this method 
       bs = this.getBufferStrategy();//returns the buffer strategy used by this component
    }

   @Override
   public void paint(Graphics g){
      g.drawString("My game",20,40);//some string that I don't know why it does not show
      //guess is 'couse g2 overwrittes all the frame..
      Graphics2D g2=null;//create a child object of Graphics
      try{
         g2 = (Graphics2D) bs.getDrawGraphics();//this new object g2,will get the
         //buffer of this jframe?
         drawWhatEver(g2);//whatever I draw in this method will show in jframe,
         //but why??
      }finally{
         g2.dispose();//clean memory,but how? it cleans the buffer after
         //being copied to the jframe?? when did I copy to the jframe??
      }
      bs.show();//I never put anything on bs, so, why do I need to show its content??
      //I think it's a reference to g2, but when did I do this reference??
   }

   private void drawWhatEver(Graphics2D g2){
       g2.fillRect(20, 50, 20, 20);//now.. this I can show..
   }
  }

我不知道..我已经研究了很长时间了..根本没有运气..我不知道..也许所有的东西都在里面,而且它很清楚很简单,我我太愚蠢而看不见..

感谢所有的帮助.. :)


问题答案:

运作方式如下:

  1. JFrame构造了一个BufferStrategy当你调用createBufferStrategy(2);。该BufferStrategy知道它属于那个特定实例JFrame。您正在检索它并将其存储在bs现场。
  2. 到了该画画的时候,您正在Graphics2D从中检索一个bs。该Graphics2D对象绑定到拥有的内部缓冲区之一bs。绘制时,所有内容都将进入该缓冲区。
  3. 当您最终调用时bs.show()bs将使您刚才绘制的缓冲区成为的当前缓冲区JFrame。它知道如何执行此操作,因为(请参阅第1点)它知道该JFrame服务的目的。

这就是所有的事情。

通过注释代码…您应该稍微更改绘图例程。代替这个:

try{
    g2 = (Graphics2D) bs.getDrawGraphics();
    drawWhatEver(g2);
} finally {
       g2.dispose();
}
bs.show();

您应该有一个像这样的循环:

do {
    try{
        g2 = (Graphics2D) bs.getDrawGraphics();
        drawWhatEver(g2);
    } finally {
           g2.dispose();
    }
    bs.show();
} while (bs.contentsLost());

这将防止丢失丢失的缓冲帧,根据文档,这种情况可能偶尔发生。



 类似资料:
  • 本文向大家介绍详细了解JAVA NIO之Buffer(缓冲区),包括了详细了解JAVA NIO之Buffer(缓冲区)的使用技巧和注意事项,需要的朋友参考一下 当我们需要与 NIO Channel 进行交互时, 我们就需要使用到 NIO Buffer, 即数据从 Buffer读取到 Channel 中, 并且从 Channel 中写入到 Buffer 中。缓冲区本质上是一块可以写入数据,然后可以从

  • 我试图理解netty缓冲区和水印。 作为一个测试用例,我有一个netty服务器,它向客户端写入数据,客户端被阻塞(每次读取之间的睡眠时间基本上为10秒) > 它是否正在写入操作系统或TCP缓冲区,netty通道是否也有内部缓冲区?如果是这样,我如何配置它? 我跟踪bytesBeforeUnWritable,但它们似乎没有减少 代码如下: 使用端到端源代码重新创建的详细步骤: > 具体来说,代理代码

  • 出于性能的考虑,servlet 容器允许(但不要求)缓存输出到客户端的内容。一般的,服务器是默认执行缓存,但应该允许 servlet 来指定缓存参数。 下面是 ServletResponse 接口允许 servlet 来访问和设置缓存信息的方法: getBufferSize setBufferSize isCommitted reset resetBuffer flushBuffer 不管 ser

  • 问题内容: 是缓冲还是无缓冲? 我读到这是的对象,并且是所引用的对象的类型。 而且它们都是Unbuffered的,所以为什么要刷新unbuffered …是否可以刷新unbuffered,我已经读过它们被立即写入。 问题答案: 是“标准”输出。在大多数操作系统上,终端io被缓冲,并且支持分页。 在Javadoc中, “标准”输出流。该流已经打开并且准备接受输出数据。通常,此流对应于主机环境或用户指

  • 这篇文章说默认的溢出策略是缓冲区。 doOnNext内部的subscribe()调用有不同的策略吗?

  • 稳定性: 2 - 稳定的 在 ECMAScript 2015 (ES6) 引入 TypedArray 之前,JavaScript 语言没有读取或操作二进制数据流的机制。 Buffer 类被引入作为 Node.js API 的一部分,使其可以在 TCP 流或文件系统操作等场景中处理二进制数据流。 TypedArray 现已被添加进 ES6 中,Buffer 类以一种更优化、更适合 Node.js 用