【发布时间】:2012-08-16 00:45:35
【问题描述】:
最近我遇到了 Java 的全屏独占模式。当我自己尝试时,我遇到了一些问题:在全屏模式下在 JFrame 或 Frame 中渲染完全相同的内容需要更长的时间(40 fps),而不是在未装饰和最大化的窗口(150-200 fps)中。 我的屏幕设置为 50 fps,即每帧 20 毫秒,我看不到这段时间在哪里丢失。我唯一的想法是,由于某种原因,Jave 决定在全屏模式下使用我的板载显卡。
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);
}
基本上就是这样,而且仍然:所谓的高效全屏模式太慢了。
【问题讨论】:
-
Eww。不要停顿。跳过和插值。
-
您介意给我一个关键字来搜索吗?从来没有听说过 - 猜猜这会发生,当你在学校学习 java..
-
一般来说delta不是用来判断暂停的,而是用来判断模型更新多少。当然,这并不总是有效(例如,DVD/电影播放需要非常精确的绘制时间,否则人们会对不均匀的帧感到恼火),但对于游戏,尤其是“非谨慎”运动,一种降低 FPS 的方法,其中FPS“相对较高”(例如> 60),只是在需要时“跳过”绘制到下一个重绘周期(但不要阻塞线程)。
标签: java performance fullscreen draw