Стратегия буфера 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)

Другие вопросы по тегам