Я уже некоторое время смотрю на функции ускорения аппаратного обеспечения Java, и я все еще немного смущен, так как ни один из сайтов, которые я нашел онлайн напрямую и не ответил на некоторые из моих вопросов. Итак, вот вопросы, которые у меня есть для аппаратного ускорения в Java:Аппаратное ускорение Java
1) В Eclipse версии 3.6.0, с самым последним обновлением Java для Mac OS X (думаю, я думаю, 1.6u10), аппаратное ускорение включено по умолчанию? Я где-то читал, что
someCanvas.getGraphicsConfiguration().getBufferCapabilities().isPageFlipping()
должен дать указание о том, является ли аппаратное ускорение включено, и моя программа сообщает назад правда, когда это выполняется на основном, например Canvas для рисования в. Если мое аппаратное ускорение не включено сейчас или по умолчанию, что мне нужно сделать, чтобы включить его?
2) Я видел пару статей здесь и там о различии между BufferedImage и VolatileImage, в основном говоря, что VolatileImage является аппаратным ускоренным изображением и хранится в VRAM для быстрой операции копирования. Тем не менее, я также обнаружил некоторые случаи, когда BufferedImage, как говорят, также аппаратно ускоряется. Является ли аппаратное обеспечение BufferedImage ускоренным в моей среде? Каково было бы преимущество использования VolatileImage, если оба типа аппаратного ускорения? Мое основное предположение о том, что VolatileImage имеет ускорение, заключается в том, что VolatileImage способен обнаруживать, когда его VRAM был сброшен. Но если BufferedImage также поддерживает ускорение сейчас, не имеет ли он такого же типа обнаружения, встроенного в него, а просто скрытого от пользователя, в случае сбрасывания памяти?
3) Есть ли какие-либо преимущества использования
someGraphicsConfiguration.getCompatibleImage/getCompatibleVolatileImage()
в отличие от
ImageIO.read()
В учебнике я читал некоторые общие понятия о настройке рендеринга окна правильно (tutorial) он использует метод getCompatibleImage, который, как я полагаю, возвращает BufferedImage, чтобы получить «ускоренные аппаратные» изображения для быстрого рисования, что ставит под вопрос 2 о том, если это аппаратное ускорение.
4) Это меньше аппаратного ускорения, но мне это любопытно: нужно ли заказывать графику? Я знаю, что при использовании OpenGL через C/C++ лучше всего сделать так, чтобы одна и та же графика рисовалась во всех местах, которые нужно нарисовать сразу, чтобы уменьшить количество переходов текущей текстуры. Из того, что я прочитал, похоже, что Java позаботится об этом для меня и убедится, что все будет сделано самым оптимальным образом, но опять-таки ничто никогда не говорило ничего подобного ясно.
5) Какие классы AWT/Swing поддерживают аппаратное ускорение и какие из них следует использовать? В настоящее время я использую класс, который расширяет JFrame для создания окна и добавления к нему Canvas, из которого я создаю BufferStrategy. Является ли эта хорошая практика, или есть какой-то другой способ, которым я должен это реализовать?
Большое спасибо за ваше время, и я надеюсь, что предоставил вам четкие вопросы и достаточную информацию, чтобы вы могли ответить на мои несколько вопросов.
Есть ли какая-то особая причина, по которой большинство/все примеры используют JFrame для хранения холста? Из того, что я понял, Свинг ужасен. Почему бы вам не использовать рамку? У меня есть код, который делает именно это, и, кажется, его сложнее создать, чем JFrame. Также как аппаратное ускорение включено, если оно не по умолчанию? – Freezerburn
@FreezerBurn Я не знаю, почему большинство примеров используют JFrame vs Frame. Я предполагаю, что это делается с помощью JFrame, потому что это то, что наиболее широко известно. Это только предположение, но я бы предположил, что рендеринг вручную на Java с использованием только контейнера верхнего уровня (JFrame, Frame и т. Д.) И холста имеет мало различий между тем, который вы выбираете. Чтобы активировать ускорение рендеринга, передайте этот аргумент (-Dsun.java2d.opengl = true) в Java-пуск при запуске программы или установите его перед использованием любых библиотек рендеринга. (System.setProperty ("sun.java2d.opengl", "true");) Это необязательный параметр. – Zixradoom
JFrame Swing, где рамка/холст AWT. Swing - это новая библиотека компонентов, а AWT - устаревшая библиотека. Swing использует легкие компоненты, где AWT - это собственные компоненты. JFrame предпочла более старые компоненты AWT. – chubbsondubs