2012-08-16 107 views
2

最近我遇到了Java的全屏独占模式。当我自己尝试时,我遇到了一些情况:在全屏模式下渲染JFrame或Frame中完全相同的内容比未修剪和最大化窗口(150-200 fps)需要更长的时间(40 fps)。 我的屏幕设置为50 fps,即每帧20毫秒,我看不到,在这个时间丢失。我唯一的想法是,那个Jave--出于某种原因 - 决定在全屏时使用我的板载图形卡。Java效率:全屏独占模式

GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); 
if(gd.isFullScreenSupported()) { 
    try { 
     gd.setFullScreenWindow(window); 
    } finally { 
     gd.setFullScreenWindow(null); 
    } 
} else { 
    this.fullscreen = false; 
} 

我管理与框架,即由改掉暂停计算的时间来坚持一定程度的帧速率重绘。

int delta = (int) (System.currentTimeMillis() - timestamp); //timestamp: start of this round 
if(animated - delta > 0) 
    pause(animated - delta); 

最后我得出使用双缓冲框架上:

public void render(Graphics2D a) { //window graphics are passed 
    Graphics2D g = (Graphics2D) backBuffer.getGraphics(); 
    //Adjusting some rendering hints here... 
    //Then drawing some stuff... 
    g.dispose(); 
    a.drawImage(backBuffer, 0, 0, null); 
} 

这基本上,仍然:所谓高效的全屏模式是该死的慢。

+2

好恶。不要停顿。跳过并插入。 – 2012-08-16 00:52:46

+0

你介意给我一个关键字来搜索吗?从来没有听说过这种情况 - 猜猜发生了什么,当你在学校学习java的时候.. – brickBreaker 2012-08-17 18:03:27

+0

通常delta不是用来确定暂停的,而是用来更新模型的。当然,这并不总是奏效(例如DVD /电影播放需要非常精确的绘画时间,或者人们对不均匀的画面感到恼火),但对于游戏,尤其是“非谨慎”移动的游戏,减慢FPS的一种方式是, FPS是“相对高的”(例如> 60),如果需要(只是不要阻塞线程),就是“跳过”绘制到下一个重绘周期。 – 2012-08-17 18:14:47

回答

0

建议如果以上的答案是不行的,然后把窗户进入全屏以不同的方式。

相反的:

GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); 
if(gd.isFullScreenSupported()) { 
    gd.setFullScreenWindow(window); 
} 

做到这一点(您使用的是JFrame假设):

myFrame.setUndecorated(true); 
myFrame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
+0

与此相关的缺陷是,它不会以全屏独占模式显示'JFrame',而是以窗口模式显示。它只是全屏显示。 – ThePyroEagle 2015-12-22 16:58:30

+0

@ThePyroEagle是的,如果正常的FSEM不工作,它应该是一个窍门 – BitNinja 2015-12-23 20:10:47

+0

即使系统不支持FSEM,将窗口设置为全屏仍将*模拟*全屏,所以你真正想要检查的是如果设备是无头的。 – ThePyroEagle 2015-12-23 21:01:44