import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferStrategy;
import java.util.concurrent.TimeUnit;
public class TearingTest {
private static int FREQ = 120;
private static DisplayMode[] BEST_DISPLAY_MODES = new DisplayMode[] {
new DisplayMode(3840, 2160, 32, FREQ),
new DisplayMode(3440, 1440, 32, FREQ),
new DisplayMode(2560, 1440, 32, FREQ),
new DisplayMode(1920, 1080, 32, FREQ)};
private static boolean RUNNING = true;
private static void draw(Graphics2D g2d, int ofs) {
Rectangle bounds = g2d.getDeviceConfiguration().getBounds();
g2d.setBackground(new Color(32, 32, 32));
g2d.clearRect(0, 0, bounds.width, bounds.height);
g2d.setColor(Color.white);
g2d.setFont(new Font("Dialog", Font.BOLD, 30));
g2d.drawString("Click to exit...", 100, 100);
g2d.fillRect(ofs, 0, 20, bounds.height);
}
private static void render(Frame frame) throws Exception {
BufferStrategy bufferStrategy = frame.getBufferStrategy();
Rectangle bounds = frame.getBounds();
long start = System.nanoTime();
System.out.println(bounds);
while (RUNNING) {
Graphics g = bufferStrategy.getDrawGraphics();
Graphics2D g2d = (Graphics2D) g;
AffineTransform t = g2d.getTransform();
t.setToScale(1, 1);
g2d.setTransform(t);
if (!bufferStrategy.contentsLost()) {
int ofs = (int) TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start) * 2 % bounds.width;
draw(g2d, ofs);
bufferStrategy.show();
g2d.dispose();
}
}
System.exit(0);
}
private static DisplayMode getBestDisplayMode(GraphicsDevice device) {
for (int x = 0; x < BEST_DISPLAY_MODES.length; x++) {
DisplayMode[] modes = device.getDisplayModes();
for (int i = 0; i < modes.length; i++) {
if (modes[i].getWidth() == BEST_DISPLAY_MODES[x].getWidth()
&& modes[i].getHeight() == BEST_DISPLAY_MODES[x]
.getHeight()
&& modes[i].getBitDepth() == BEST_DISPLAY_MODES[x]
.getBitDepth()) {
return BEST_DISPLAY_MODES[x];
}
}
}
return null;
}
private static Frame createFrame(int numBuffers, GraphicsDevice device) {
GraphicsConfiguration gc = device.getDefaultConfiguration();
Frame mainFrame = new Frame(gc);
mainFrame.setUndecorated(true);
mainFrame.setIgnoreRepaint(true);
device.setFullScreenWindow(mainFrame);
if (device.isDisplayChangeSupported()) {
DisplayMode mode = getBestDisplayMode(device);
if (mode != null) {
device.setDisplayMode(mode);
mainFrame.createBufferStrategy(numBuffers);
mainFrame.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
super.mouseClicked(e);
RUNNING = false;
}
});
return mainFrame;
}
}
System.out.printf("Unable to set 120 Hz Fullscreen mode");
mainFrame.dispose();
return null;
}
public static void main(String[] args) throws Exception {
GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice device = env.getDefaultScreenDevice();
Frame frame = createFrame(2, device);
if (frame != null) {
render(frame);
}
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
}
}