VolatileImage JFrame на нескольких экранах - PullRequest
4 голосов
/ 28 августа 2011

У меня есть JFrame, в котором я использую Graphics2D для рисования VolatileImage, используя этот учебник. Я в основном скопировал код, чтобы увидеть, как он работает, но немного отредактировал его для своей игры. Я использую компьютер с двумя экранами.

Проблема возникает, когда я перетаскиваю окно игры на другой экран, на котором окно изначально не появлялось. Окно становится серым, и на экране не отображается графика, даже простые прямоугольники, которые я нарисовал с помощью Graphics2D. Это происходит только тогда, когда я вызываю метод draw для volatileimage, как показано в руководстве.

Полагаю, это как-то связано с этим ...

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsConfiguration gc = ge.getDefaultScreenDevice().getDefaultConfiguration();

... но я не уверен.

Любая помощь будет принята с благодарностью. Также было бы интересно узнать, является ли VolatileImage подходящим для моей игры способом, или BufferedImage или что-то еще - лучший метод для производительности и частоты кадров.

1 Ответ

4 голосов
/ 28 августа 2011

Да, вы правы.VolatileImage зависит от устройства.Из «Руководства пользователя VolatileImage API» вы можете прочитать:

VolatileImage зависит от устройства: если вы создали VolatileImage с одним GraphicsDevice, вы не сможете скопироватьэто VolatileImage к другому GraphicsDevice.По этой причине вам необходимо вызвать validate перед попыткой скопировать VolatileImage.

и

Если код IMAGE_INCOMPATIBLE, то VolatileImage несовместимс текущим GraphicsConfiguration.Эта несовместимость может возникнуть, если изображение было создано с одним GraphicsConfiguration, а затем нарисовано в другом. Например, в ситуации с несколькими мониторами VolatileImage существует связано с конкретным GraphicsConfiguration.Копирование этого изображения на другой GraphicsConfiguration может привести к непредсказуемым результатам. Чтобы исправить эту проблему, необходимо создать новый VolatileImage, совместимый с текущими GraphicsConfiguration

Когдаперетаскивая рамку на другое экранное устройство, вам нужно проверить результат с помощью метода VolatileImage.validate(gc) и заново создать изображение на новом устройстве.Обратите внимание, что есть случаи, когда вы не можете создать VolatileImage, в этих случаях вам нужно использовать другую реализацию Image, такую ​​как BufferedImage.

...