BufferStrategy
В Java 2 Standard Edition, Вы не должны волноваться о видео указателях или видеопамяти, чтобы в полной мере воспользоваться или двойной буферизацией или зеркальным отражением страницы. Новый class java.awt.image.BufferStrategy был добавлен для удобства контакта с рисованием на поверхности и компоненты общим способом, независимо от числа используемых буферов или метод, используемый, чтобы вывести на экран их.
Буферная стратегия дает Вам два универсальных метода для рисования: getDrawGraphics и show. Когда Вы хотите начать тянуть, получать графику ничьей и использовать ее. Когда Вы заканчиваетесь, таща и хотите представить свою информацию экрану, вызовите show. Эти два метода разрабатываются, чтобы соответствовать скорее корректно циклу рендеринга:
BufferStrategy myStrategy;
while (!done) {
Graphics g = myStrategy.getDrawGraphics();
render(g);
g.dispose();
myStrategy.show();
}
Буферные стратегии были также установлены, чтобы помочь Вам контролировать проблемы VolatileImage. Когда в полноэкранном монопольном режиме, проблемы VolatileImage особенно важны, потому что система управления окнами может иногда возвращать видеопамять, это дало Вам. Один важный пример - то, когда пользователь нажимает сочетание клавиш ALT+TAB в Windows - внезапно, Ваша полноэкранная программа работает в фоновом режиме, и Ваша видеопамять теряется. Можно вызвать метод contentsLost, чтобы узнать, произошло ли это. Точно так же, когда система управления окнами возвращает Вашу память Вам, можно узнать использование метода contentsRestored.
BufferCapabilities
Как упомянуто прежде, различные операционные системы, или даже различные видеокарты на той же самой операционной системе, имеют различные методы в наличии в их распоряжении. Эти возможности представляются для Вас так, чтобы можно было выбрать лучший метод для своего приложения.
class java.awt.BufferCapabilities инкапсулирует эти возможности. Каждой буферной стратегией управляют ее буферные возможности, так выбор правильных для Вашего приложения очень крайне важен. Чтобы узнать, какие возможности доступны, вызовите метод getBufferCapabilities от объектов GraphicsConfiguration, доступных на Вашем графическом устройстве.
Возможности, доступные в Java 2 Standard Edition версия 1.4:
isPageFlipping
Эта возможность возвращается, доступно ли аппаратное зеркальное отражение страницы на этой графической конфигурации.
isFullScreenRequired
Эта возможность возвращается, требуется ли полноэкранный монопольный режим прежде, чем аппаратное зеркальное отражение страницы должно быть предпринято.
isMultiBufferAvailable
Эта возможность возвращается, доступна ли многократная буферизация (два или больше назад буферы плюс основная поверхность) в аппаратных средствах.
getFlipContents
Эта возможность возвращает подсказку метода, используемого, чтобы сделать аппаратное зеркальное отражение страницы. Это важно, потому что содержание заднего буфера после show отличается в зависимости от используемого метода. Возвращенное значение может быть нулем (если isPageFlipping возвращает false), или одно из следующих значений. Любое значение может быть определено для буферной стратегии, пока метод isPageFlipping возвращает true, хотя производительность изменится в зависимости от доступных возможностей.
FlipContents.COPIED
Это значение означает, что содержание заднего буфера копируется в основную поверхность. "Зеркальное отражение", вероятно, выполняется как аппаратные средства blt, что означает, что аппаратная двойная буферизация, вероятно, делается, используя блитирующий вместо истинного зеркального отражения страницы. Это должно (в теории) быть быстрее, или по крайней мере столь же быстро, как блитирующий от VolatileImage до основной поверхности, хотя Ваш мильяж может измениться. Содержание заднего буфера является тем же самым как основной поверхностью после зеркального отражения.
FlipContents.BACKGROUND
Это значение означает, что содержание заднего буфера было очищено с цветом фона. Произошли или истинное зеркальное отражение страницы или blt.
FlipContents.PRIOR
Это значение означает, что содержание заднего буфера является теперь содержанием старой основной поверхности, и наоборот. Обычно это значение указывает, что истинное зеркальное отражение страницы происходит, хотя это не гарантируется и, еще раз, Ваш мильяж на этой работе может измениться.
FlipContents.UNKNOWN
Это значение означает, что содержание заднего буфера неопределено после зеркального отражения. Вам, вероятно, придется экспериментировать, чтобы найти, какой метод работает лучше всего на Вас (или Вы не можете заботиться), и необходимо определенно установить содержание спины, буферизуют себя каждый раз, когда Вы тянете.
Чтобы создать буферную стратегию компонента, вызовите метод createBufferStrategy, предоставляя число требуемых буферов (это число включает основную поверхность). Если какой-либо определенный метод буферизации требуется, предоставьте соответствующий объект BufferCapabilities. Отметьте, что, когда Вы используете эту версию метода, следует поймать AWTException, когда Ваш выбор не доступен. Также отметьте, что эти методы только доступны на Canvas и Window.
Как только определенная буферная стратегия была создана для компонента, можно управлять ею использующий метод getBufferStrategy. Отметьте, что этот метод также только доступен для холстов и окон.
Программирование Подсказок
Некоторые подсказки об использовании буферных возможностей и буферных стратегий:
- Получение, используя, и располагая графический объект более устойчиво в пункте try...finally:
BufferStrategy myStrategy;
while (!done) {
Graphics g;
try {
g = myStrategy.getDrawGraphics();
render(g);
} finally {
g.dispose();
}
myStrategy.show();
}
- Проверьте доступные возможности перед использованием буферной стратегии.
- Для лучших результатов создайте свою буферную стратегию относительно полноэкранного монопольного окна. Удостоверьтесь, что Вы проверяете isFullScreenRequired и возможности isPageFlipping перед использованием зеркального отражения страницы.
- Не делайте предположения о производительности. Настройте свой код по мере необходимости, но помните, что у различных операционных систем и видеокарт есть различные возможности. Профилируйте свое приложение!
- Можно хотеть разделить свой компонент на подклассы, чтобы переопределить метод createBufferStrategy. Используйте алгоритм для того, чтобы выбрать стратегию, которая лучше всего подходит для Вашего приложения. FlipBufferStrategy и BltBufferStrategy внутренние классы защищаются и могут быть разделены на подклассы.
- Не забывайте, что можно потерять свои поверхности рисунка! Убедитесь, что проверили contentsLost и contentsRestored перед рисунком. Все буферы, которые были потеряны, должны быть перерисованы, когда они восстанавливаются.
- Если Вы используете буферную стратегию двойной буферизации в приложении Swing, Вы, вероятно, хотите выключить двойную буферизацию для своих компонентов Swing, так как они уже будут с двойной буферизацией. Видеопамять несколько ценна и должна только использоваться всякий раз, когда абсолютно необходимый.
- Это может быть, заканчивают тем, что были расточительны использовать больше чем один назад буфер. Мультибуферизация только полезна, когда время рисунка превышает время, проведенное, чтобы сделать show. Профилируйте свое приложение!