Полезное для программистов:

Фриланс
Новости
Статьи
   
Рубрики:


Что такое Full-Screen Mode

Поиск:
Огромное спасибо Domestic Cat за предоставленную информацию

Что такое Full-Screen Mode.

Это свойство было добавлено в Java 1.4. Оно позволяет:
а. Приостановить оконный режим и получить полный контроль над экраном: изменить разрешение (display mode), напрямую работать с видео памятью.
б. Использовать ускоренную графику

Как работать с Full-Screen Mode.

1. Получить объект GraphicsDevice
Код

GraphicsEnvironment environment =
GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice device = environment.getDefaultScreenDevice();


GraphicsDevice позволяет определить текущую моду дисплея:
Код

DisplayMode dm = device.getDisplayMode();


а также все совместимые моды:

Код

DisplayMode[] dms = device.getDisplayModes();


Соответственно, для DisplayMode можно узнать все параметры:
Код

int getBitDepth()
int getHeight()
int getWidth()
int getRefreshRate()

Можно также узнать, поддерживается ли полноэкранный режим.
Код

if (device.isDisplayChangeSupported()) ...

2. Установить полноэкранный режим:
Код

JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setUndecorated(true);
frame.setIgnoreRepaint(true);
frame.setResizable(false);

device.setFullScreenWindow(frame);

Поскольку JFrame все равно нам "не нужен", для оптимизации устанавливается
Код

frame.setUndecorated(true);
...
frame.setResizable(false);


С setIgnoreRepaint чуть сложнее - в оконной моде все события проходят чезер AWT диспетчер. В полноэкранном режиме используется active rendering, поэтому требования диспетчера о перерисовке экрана желательно отключить:
Код
frame.setIgnoreRepaint(true);

Тем не менее, методом repaint() пользоваться можно.
Код

DisplayMode displayMode = ....;
...
if (displayMode != null &&
device.isDisplayChangeSupported())
{
    try
    {
         device.setDisplayMode(displayMode);
     }
     catch (IllegalArgumentException ex) { }

     frame.setSize(displayMode.getWidth(),
     displayMode.getHeight());
}

try
{
     EventQueue.invokeAndWait(new Runnable()
     {
           public void run()
           {
                   frame.createBufferStrategy(2);
            }
       });
}
catch (InterruptedException ex)
{
     // ignore
}
catch (InvocationTargetException  ex)
{
     // ignore
}

Здесь
Код

device.setDisplayMode(displayMode);

устанавливает DisplayMode.
Код
Код
frame.setSize(displayMode.getWidth(),
     displayMode.getHeight());

может показаться странным, но на самом деле это позволяет работать с фул скрин на Маке
(причину узнавать у программистов Sun).
Далее, try-catch блок устраняет возможный дедлок в Java 1.4.1_02.
Код

frame.createBufferStrategy(2);

устанавливает BufferStrategy. BufferStrategy позволяет организовать работу с памятью. В частности, 2 означает количество буферов для рендеринга; изначально JVM пробует использовать page flipping (прорисовывается 1 буфер, выводится на экран, в это время рисуется второй буфер).

3. Рисуем.

Graphics объект можно получить так:
Код

Window window = device.getFullScreenWindow();
BufferStrategy strategy = window.getBufferStrategy();
Graphics2D g2d = (Graphics2D)strategy.getDrawGraphics();

Заметьте, здесь мы будем рисовать не на экран, а в буфер. Чтобы его отобразить, нужно вызвать:
Код

if (!strategy.contentsLost())
{
     strategy.show();
}
Toolkit.getDefaultToolkit().sync();

Поскольку работает с видеопамятью, содержимое буфера может быть потеряно.
Код
if (!strategy.contentsLost())


Строка
Код

Toolkit.getDefaultToolkit().sync();

(по идее) должна устранять некоторые проблемы с event queue.


4. DisplayMode.
Чтобы установить DisplayMode, нужно знать, поддерживается ли она.
Список поддерживаемых мод можно получить (для данной машины),
а вот если запускать программу на другом компе?
Рецепт такой:
0. Создать список "нужных" мод.
Код

private static final DisplayMode POSSIBLE_MODES[] = {
       new DisplayMode(800, 600, 32, 0),
       new DisplayMode(800, 600, 24, 0),
       new DisplayMode(800, 600, 16, 0),
       new DisplayMode(640, 480, 32, 0),
       new DisplayMode(640, 480, 24, 0),
       new DisplayMode(640, 480, 16, 0)
   };

1. получить список поддерживаемых мод
2. перебрать все моды, найти совместимые:
Код

public boolean displayModesMatch(DisplayMode mode1,
       DisplayMode mode2)

   {
       if (mode1.getWidth() != mode2.getWidth() ||
           mode1.getHeight() != mode2.getHeight())
       {
           return false;
       }

       if (mode1.getBitDepth() != DisplayMode.BIT_DEPTH_MULTI &&
           mode2.getBitDepth() != DisplayMode.BIT_DEPTH_MULTI &&
           mode1.getBitDepth() != mode2.getBitDepth())
       {
           return false;
       }

       if (mode1.getRefreshRate() !=
           DisplayMode.REFRESH_RATE_UNKNOWN &&
           mode2.getRefreshRate() !=
           DisplayMode.REFRESH_RATE_UNKNOWN &&
           mode1.getRefreshRate() != mode2.getRefreshRate())
        {
            return false;
        }

        return true;
   }


5.Выйти из полноэкранного режима:
Код

Window window = device.getFullScreenWindow();
if (window != null)
{
    window.dispose();
}
device.setFullScreenWindow(null);


6. Tips.
Full Screen Mode использует ускоренную графику. Однако:

1. Транслуцентный (translucent, полупрозрачный) image ускорен не будет. Используйте непрозрачные (opaque) или transparent рисунки.

2. Применение AffineTransform автоматически выключает ускорение данного рисунка.

7. VolatileImage.

В полноэкранном режиме изображения можно хранить непосредственно в ускоренной
видео памяти (класс VolatileImage) . Делается это так:
Код

VolatileImage img = device.getDefaultConfiguration().
                                       createCompatibleVolatileImage(width, height);
img.validate(frame.getGraphicsConfiguration());
Graphics2D g2d = img.createGraphics();
g2d.draw(somePicture);
strategy.getDrawGraphics().drawImage(img, 0, 0, width, height, frame);


В Invasion я этим не пользовался.
Автор: AntonSaburov
Сайт: http://






Просмотров: 9046

 

 

Новые статьи:


Популярные:
  1. Как сделать цикличным проигрывание MIDI-файла?
  2. Создание AVI файла из рисунков
  3. Как устройство "отключить в данной конфигурации"?
  4. Kто в данный момент присоединен через Сеть?
  5. Как узнать количество доступной памяти?
  6. Как реализовать в RichEdit разноцветный текст?
  7. Как скрыть свое приложение от ProcessViewer
  8. Как программно нажать/скрыть/показ кнопку "Start"?
  9. Модуль работы с ресурсами в PE файлах
10. Функции вызова диалоговых окон выбора
11. Проверка граматики средствами Word'а из Delphi.
12. Модуль для упрощенного вызова сообщений
13. Функции для записи и чтение своих данных в, ЕХЕ- файле
14. Рекурсивный просмотр директорий
15. Network Traffic Monitor
16. Разные модули
17. Универсальная функция для обращения к любым экспортируем функциям DLL
18. Библиотека от VladS
19. Протектор для UPX'а
20. Еще об ICQ, сообщения по контакт листу?
21. Использование открытых интерфейсов
22. Теория и практика использования RTTI
23. Работа с TApplication
24. Примеры использования Drag and Drop для различных визуальных компонентов
25. Что такое порт? Правила для работы с портами
26. Симфония на клавиатуре
27. Загрузка DLL
28. Исправление автоинкремента
29. Взаимодействие с чужими окнами
30. Проверить дубляжи в столбце


 

 

 
 
На главную