Windows 10 禁用JDK9中BuffereImage的自动重缩放

Windows 10 禁用JDK9中BuffereImage的自动重缩放,windows-10,java-9,hidpi,Windows 10,Java 9,Hidpi,我使用一个定制的渲染器来重新缩放我的8位计算机模拟器的屏幕,该模拟器在Java 9之前的环境中运行良好。在Java9中,当JVM自动调整屏幕大小以适应不同的分辨率时,它会在主屏幕上创建三角形失真。在模拟器中启用扫描线时,这一点最为明显。我怀疑这与用Java9交付的==>有关 例如,在Windows10上使用Java9在4K监视器上执行以下程序时可以看到这种效果 public static void main(String[] args){ JFrame frame=new JFrame(

我使用一个定制的渲染器来重新缩放我的8位计算机模拟器的屏幕,该模拟器在Java 9之前的环境中运行良好。在Java9中,当JVM自动调整屏幕大小以适应不同的分辨率时,它会在主屏幕上创建三角形失真。在模拟器中启用扫描线时,这一点最为明显。我怀疑这与用Java9交付的==>有关

例如,在Windows10上使用Java9在4K监视器上执行以下程序时可以看到这种效果

public static void main(String[] args){
    JFrame frame=new JFrame("Java version 9");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    BufferedImage image =new BufferedImage(800,600,BufferedImage.TYPE_INT_RGB);
    Graphics2D g=image.createGraphics();
    g.setColor(Color.WHITE);
    for(int y=0;y<image.getHeight();y+=2){
        g.drawLine(0,y,image.getWidth(),y);
    }
    g.dispose();
    ImageIcon imageIcon=new ImageIcon(image);
    JLabel label=new JLabel(imageIcon);
    frame.add(label);
    frame.pack();
    frame.setVisible(true);
}
publicstaticvoidmain(字符串[]args){
JFrame=newjframe(“Java版本9”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
BuffereImage=新的BuffereImage(800600,BuffereImage.TYPE_INT_RGB);
Graphics2D g=image.createGraphics();
g、 setColor(Color.WHITE);
对于(int y=0;y参见
这似乎是JDK中Direct3D代码中的一个错误


解决方法是“-Dsun.java2d.d3d=false”在命令行上。

使用选项-Dsun.java2d.uiScale=1.0修复了我提供的模拟器和测试程序的上述问题。我从中得到了答案。我更喜欢编程解决方案,似乎与我的问题完全相同,并且提供的答案看起来很有希望。

您是否手动尝试缩放图像使用?不,我没有。你有没有任何使用RescaleOp的示例代码可以应用到我提供的代码中,使屏幕显示完全相同的大小,而不管它是在Java 8还是Java 9中执行的?RescaleOp是否有很大的开销,它是否会覆盖JVM而不添加它自己的缩放?我的模拟器需要生成scre实时增强,因此我避免添加额外的处理层来生成屏幕。仅供参考,如果您想查看应用程序,我的模拟器就在这里。==>正在开发的版本是这个==>我确认这修复了当Windows比例因子大于100%时模拟器中的三角形失真。设置Windows比例因子r到100%也解决了这个问题。当用户将其比例因子设置为大于100%时,我仍然需要通过编程方式为BuffereImage渲染像素的选项,因为来自JEP 263的JDK9自动缩放会出血一些颜色,并且不能平滑混合。这与需要使用比例因子I的模拟器渲染代码冲突n模拟计算机的像素比很少是1:1。例如,C64 PAL像素比是.9365。在以下链接中调整jar中可用模拟器的大小时,使用JDK 9将缩放设置为100%与更高的缩放因子相比,您可以真正注意到质量上的差异。启用CRT模拟时,VIC20和C128最为显著。
System.setProperty(“sun.java2d.uiScale”,“1.0”);
在Java10中为我工作,谢谢!