我在Windows 10上使用Java SE8将ViewSonic VX2453显示器设置为全屏模式时的30Hz刷新率。但是,当我查询设备时,它会报告它设置为29Hz。 30Hz和29Hz都列在可用于监视器的显示模式中。这是我的代码,它会报告计算机上三台显示器中每台显示器的所有可用显示模式。 VX2453是三者中的第一个:
import java.awt.DisplayMode;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import javax.swing.JFrame;
public class Refresh
{
JFrame frame;
public static void main(String... args)
{
Refresh main = new Refresh();
java.awt.EventQueue.invokeLater(main::init);
}
void init()
{
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gd[] = ge.getScreenDevices();
for (int device = 0; device < gd.length; device++)
{
DisplayMode dm[] = gd[device].getDisplayModes();
System.out.printf("Device %d:\n", device);
for (int mode = 0; mode < dm.length; mode++)
{
System.out.printf("dm[%2d]: %4d x %4d : %2d - %3d\n",
mode,
dm[mode].getWidth(),
dm[mode].getHeight(),
dm[mode].getBitDepth(),
dm[mode].getRefreshRate());
}
}
GraphicsDevice myDevice = gd[0];
frame = new JFrame();
frame.setUndecorated(true);
frame.setResizable(false);
frame.setIgnoreRepaint(true);
try
{
myDevice.setFullScreenWindow(frame);
myDevice.setDisplayMode(new DisplayMode(1920, 1080, 32, 30));
DisplayMode m = myDevice.getDisplayMode();
System.out.printf("%d x %d %d - %d\n", m.getWidth(), m.getHeight(), m.getBitDepth(), m.getRefreshRate());
}
finally
{
myDevice.setFullScreenWindow(null);
}
System.exit(0);
}
}
这是我的输出(删除了无关的行):
run:
Device 0:
dm[ 0]: 640 x 480 : 32 - 56
...
dm[40]: 1920 x 1080 : 32 - 29
...
dm[43]: 1920 x 1080 : 32 - 30
...
dm[45]: 1400 x 1050 : 32 - 60
Device 1:
dm[ 0]: 768 x 1024 : 32 - 75
...
dm[18]: 600 x 800 : 32 - 56
Device 2:
dm[ 0]: 768 x 1024 : 32 - 75
...
dm[22]: 720 x 1280 : 32 - 60
1920 x 1080 32 - 29
在程序运行之前,显示器最初为60Hz。
如果GraphicsDevice不支持任何参数,则setDisplayMode会抛出IllegalArgumentException。我的呼叫,要求30Hz,不会抛出异常(但是,作为测试,要求31Hz的呼叫会引发异常)。
为什么成功调用指定刷新率为30Hz的setDisplayMode会在后续调用getDisplayMode时返回29Hz?
更新
正如Durandl建议的那样,我在每次请求更改后检查了实际的刷新率。这就是我得到的东西
Asked for Reported Actual
59 60 60.1
60 60 60.1
25 25 49.9
50 50 50.0
29 29 59.9
30 29 60.0
现在,在&#34; PC&#34;模式,显示器的菜单将我的屏幕分辨率报告为&#34; 1920x1080,&#34;对于所有上述费率(这是我要求的)。但是,在&#34; AV&#34;模式(它略微超出了物理屏幕),显示器的菜单将其报告为&#34; 1080p&#34;或&#34; 1080i。&#34;对于 50 50以下的所有刷新率,它是1080i。对于50或以上的所有人来说,它是1080p。因此,由于看起来较低的速率都使监视器进入隔行扫描模式,这就解释了为什么垂直频率(大致)是所请求的刷新速率的两倍。这一部分是有道理的,监测报告从所要求的积分值略微偏离也是有意义的。但它仍然无法解释为什么要求&#34; 30&#34;返回&#34; 29。&#34;
有趣的是,&#34;更改&#34;没有屏幕闪烁。从59Hz到60Hz,两者都从getDisplayMode报告60,并且&#34;更改&#34;中没有任何屏幕闪烁。从29Hz到30Hz,两者都从getDisplayMode报告29。我猜这些模式对实际上是相同的,在运作中。
仍然对奇怪的回报值感到困惑。