gpt4 book ai didi

java - BufferStrategy.getDrawGraphics() 在切换到全屏独占模式后有时会失败

转载 作者:行者123 更新时间:2023-12-04 06:24:01 31 4
gpt4 key购买 nike

我用 BufferStrategy 等初始化一个扩展的 jFrame,在屏幕上得到一个漂亮的动画圆圈。我设置了一个关键监听器(在更新绘制线程之外),它告诉更新绘制线程在全屏独占模式之间切换,在更改完成之前不进行更新或绘制。这通常有效,但有时,更新绘制线程的绘制部分(更新到目前为止什么都不做)会出现异常并在切换后立即崩溃。大多数情况下,它不会发生这种崩溃,但即使是这样,对于任何程序来说也是 Not Acceptable 。

编辑:啊,它又做了一次。但值得注意的是,它实际上在切换后几帧执行,而且似乎只在我的计算机启动后第一次运行时执行!这是堆栈跟踪:

java.lang.IllegalStateException: Buffers have not been created
at sun.awt.windows.WComponentPeer.getBackBuffer(Unknown Source)
at java.awt.Component$FlipBufferStrategy.getBackBuffer(Unknown Source)
at java.awt.Component$FlipBufferStrategy.updateInternalBuffers(Unknown Source)
at java.awt.Component$FlipBufferStrategy.revalidate(Unknown Source)
at java.awt.Component$FlipBufferStrategy.revalidate(Unknown Source)
at java.awt.Component$FlipBufferStrategy.getDrawGraphics(Unknown Source)
at albeyamakiir.lightspeed.LightSpeedFrame.screenUpdate(LightSpeedFrame.java:194)
at albeyamakiir.lightspeed.LightSpeedFrame.run(LightSpeedFrame.java:187)
at java.lang.Thread.run(Unknown Source)

结束编辑。

我怀疑某种线程问题,但这就是为什么我告诉它在线程内在全屏和窗口模式之间切换,所以它不会在摆弄显示器时尝试访问任何东西。

相关代码:
从 JFrame 构造函数中提取:
initWindow();
if(fullScreen){
initFullscreen();
}
//Setting graphics buffer strategy
createBufferStrategy(2);//double-buffered
bufferStrategy = getBufferStrategy();

screenUpdate() 的全部内容(在更新绘制循环中):
try{
graphics = bufferStrategy.getDrawGraphics();
gameRender(graphics);
graphics.dispose();
if(!bufferStrategy.contentsLost()){
bufferStrategy.show();
}else{
System.out.println("Contents Lost");
}

//Sync the display on some systems. (I'm told that on Linux, this fixes event queue problems)
Toolkit.getDefaultToolkit().sync();
}catch (Exception e){
e.printStackTrace();
dontExit = false;
}

gameRender() 只是绘制一个随机椭圆。

还:
private void initFullscreen(){
if (!gDevice.isFullScreenSupported()){
System.out.println("Full-screen exclusive mode not supported");
}else{
gDevice.setFullScreenWindow(this);

validate();

setDisplayMode(resolutionX, resolutionY, 32);//TODO: set to current resolution instead

fullScreen = true;
}
}

private void disableFullscreen(){
gDevice.setFullScreenWindow(null);

fullScreen = false;
}

编辑:所以,我想我的问题归结为;为什么 BufferStrategy 改变状态,它改变成什么,以及如何防止它?如果它真的只在启动后第一次运行时出现,并且在切换到全屏后几帧时才会出现,那么这个错误是最奇特的。

Edit2:这是可编译和可运行的源代码:[Zip 文件] http://www.albeyamakiir.hostzi.com/web_documents/LighSpeedFrame.zip

最佳答案

验证您正在 event dispatch thread 上构建 GUI .

关于java - BufferStrategy.getDrawGraphics() 在切换到全屏独占模式后有时会失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6234471/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com