【问题标题】:what happens to the value returned by 'createBufferStrategy'?'createBufferStrategy' 返回的值会发生什么变化?
【发布时间】:2013-07-02 01:45:43
【问题描述】:

我正在学习 BufferStrategy,但我对 BS 的创建有点困惑。

我的代码看起来像这样...

public class Game extends Canvas{


    /*code not relevant to this topic..
                                       */



    public void render(){
        BufferStrategy bs = this.getBufferStrategy();
        if(bs == null){
             createBufferStrategy(3);
        }
    }

}

基本上,我的“游戏”类是 Canvas 的子类。 并且该类获取缓冲区策略并将其存储在bs中。

但是,bs 没有“创建”缓冲区策略,如果它为 null(在本例中为 null),我会说“createBufferStrategy(3)”。

我很困惑当我createBufferStrategy(3) 或this.createBufferStrategy(3)(这是同一件事)时会发生什么。

createBufferStrategy(3) 的值究竟存储在哪里?

它不能存储在bs.. 所以当我只告诉我的子类创建缓冲区策略时,bs 如何从null 到实际被初始化或持有一个值。我看不出我是如何将bs 的状态从 null 更改为任何..

我尝试做bs = createBufferStrategy(3),但显然它不起作用。我想知道为什么、如何以及到底发生了什么。

提前谢谢你。

【问题讨论】:

标签: java graphics buffer graphics2d bufferstrategy


【解决方案1】:

来自JavaDocs

公共缓冲区策略 getBufferStrategy()

返回此组件使用的 BufferStrategy。这种方法将 如果尚未创建或已创建 BufferStrategy,则返回 null 处置。

默认情况下,Canvas 不创建或使用任何类型的缓冲区策略。在您的代码中,当您调用时

BufferStrategy bs = this.getBufferStrategy();
if(bs == null){

您正在检查是否有任何先前的缓冲区策略已被创建并处于活动状态(尚未被释放),这可确保在调用此方法时,所有尝试都会提供有效的BufferStrategy

当您调用createBufferStrategy(3); 时,它会在内部构造一个BufferStrategy 以满足您的要求,并将结果分配回一个内部实例变量,该变量通过调用getBufferStrategy 返回

您可以尝试将您的代码更改为类似...

BufferStrategy bs = this.getBufferStrategy();
if(bs == null){
    createBufferStrategy(3);
    bs = this.getBufferStrategy();
}

if (bs == null) {
    // It might not be possible to create a buffer strategy for your hardware,
    // or the component is not attached to a native peer
} else {
    // Start painting :D
}

【讨论】:

  • 另见Invaders 教程。
  • 很好的解释,我现在明白了,谢谢:)
  • 当调用 getBufferStrategy 时,我们检索了 Buffer Strategy 的一个实例,但它实际返回的是什么?它是否只包含我们要处理的当前缓冲图像的一个实例,在三个实例中?
  • 基本上,是的,内部机制是维护对“工作”缓冲区和“显示”缓冲区的引用,因此保证您不会获得“显示”缓冲区
【解决方案2】:

您将 BufferStrategy bs 初始化为该组件 BufferStrategy (this.getBufferStrategy)。我不太了解内部工作原理,但我现在已经并且正在将它用于我的游戏。这主要用于缓冲要显示的图像(即在游戏中),您每次在屏幕上绘画时都会调用 getBufferStrategy ,因此 bs 只是一个参考。你也可以这样写:

if(this.getBufferStrategy() == null)

所以我要说的是 BufferStrategy 是在组件中创建的,检查它是否为 null 可能只是为了防止程序启动时出错,因为我认为在您手动创建它之前没有 BufferStrategy .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-12
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多