Стратегия буфера Java Отображение нескольких драйверов
Я создаю приложение в Java с использованием стратегии буфера. Единственная проблема заключается в том, что, когда я использую стратегию буфера, развернутую на интегрированной графике, она вылетает с этой ошибкой:
Exception in thread "Thread-2" java.lang.IllegalStateException: Buffers have not been created
Я полагаю, что причиной его сбоя является то, что я использую видеокарту AMD и встроенную графику на мульти-мониторе, или, другими словами, два монитора используют графику видеокарты AMD, а один монитор использует интегрированную графику.
В результате я не могу развернуть приложение на мониторе igpu, но могу развернуть окно на мониторах, управляемых видеокартой.
У вас есть объяснение, почему Java дает мне дерьмо? Кроме того, есть ли решение, чтобы я мог максимизировать окно на моем мониторе igpu run тоже?
Вот как создаются и используются буферы:
Примечание: всякий раз, когда используется объект Graphics, я использую g.drawImage(BufferedImage, x, y, null);
private void render() {
BufferStrategy bs = this.getBufferStrategy();
if(bs == null) {
this.createBufferStrategy(3); //creation
//this being a class that implements Runnable
return;
}
Graphics g = bs.getDrawGraphics(); //bufferstrategy is converted to graphics here
g.setColor(Color.black);
g.fillRect(0, 0, mutableWidth, mutableHeight);
handler.render(g); //Graphics is transported to hundreds of objects to get displayed
g.dispose();
bs.show();
}
Я считаю, что вам не нужно читать весь класс, который реализует runnable, но на всякий случай:
package GenRuntime;
import GenRuntime.GameObjects.Block.Block;
import GenRuntime.Handler.Handler;
import UI.UIInput.KeyInput;
import Resources.Initializer;
import java.awt.*;
import java.awt.image.BufferStrategy;
public class Game extends Canvas implements Runnable {
private static final long serialVersionUID = -240840600533728354L;
public static final int WIDTH = 800, HEIGHT = WIDTH /12 * 9;
private int mutableWidth, mutableHeight;
private int windowXLoc, windowYLoc;
private Thread thread;
private boolean running = false;
private Handler handler;
Window window;
public Game() {
handler = new Handler();
this.addKeyListener((new KeyInput(handler)));
window = new Window(WIDTH, HEIGHT, "Survior", this);
mutableHeight = HEIGHT;
mutableWidth = WIDTH;
}
public synchronized void start() {
thread = new Thread(this);
thread.start();
running = true;
}
public synchronized void stop() {
try {
thread.join();
running = false;
} catch(Exception e) {
e.printStackTrace();
}
}
public int Frames;
public void run() {
long lastTime = System.nanoTime();
double amountOfTicks = 60.0;
double ns = 1000000000 / amountOfTicks;
double delta = 0;
long timer = System.currentTimeMillis();
int frames = 0;
while (running) {
long now = System.nanoTime();
delta += (now-lastTime) / ns;
lastTime = now;
while (delta >= 1) {
tick();
delta--;
}
if (running)
render();
frames++;
if(System.currentTimeMillis() - timer > 1000) {
timer += 1000;
Frames = frames;
System.out.println("FPS: " + frames);
frames = 0;
}
}
}
private void tick() {
handler.tick();
}
private void render() {
BufferStrategy bs = this.getBufferStrategy();
if(bs == null) {
this.createBufferStrategy(3);
return;
}
Graphics g = bs.getDrawGraphics();
g.setColor(Color.black);
g.fillRect(0, 0, mutableWidth, mutableHeight);
handler.render(g);
g.dispose();
bs.show();
}
public static void main(String[] args) {
Initializer.init();
Block b = new Block();
new Game();
}
//The rest of the code is getter and setter methods. Don't worry about them
public void setSize(int width, int height) {
mutableHeight = height;
mutableWidth = width;
}
public void setSize(Dimension dim) {
mutableWidth = dim.width;
mutableHeight = dim.height;
}
public void setWindowLoc(int x, int y) {
windowXLoc = x;
windowYLoc = y;
}
public void setWindowLoc(Point p) {
windowXLoc = p.x;
windowYLoc = p.y;
}
public int getMutableWidth() {
return mutableWidth;
}
public int getMutableHeight() {
return mutableHeight;
}
public int getWindowXLoc() {
return windowXLoc;
}
public int getWindowYLoc() {
return windowYLoc;
}
}
1 ответ
Ответ размещен по этой ссылке: java: IllegalStateException - Буферы не были созданы
У меня проблема с несколькими драйверами, которая устраняется путем добавления -Dsun.java2d.d3d=false
к моей командной строке Java (или аргументы VM)