Java 2D тянущая оптимальная производительность

Это старый вопрос, но я думал, что опубликую свое решение, если оно будет полезно другим в будущем. Мое решение обрабатывает любое количество полей api autocomplete на странице. Вам нужно будет пометить все поля автозаполнения с именем класса, в моем случае я использовал имя класса «адрес».

Теперь возьмите коллекцию полей:

var input = document.getElementsByClassName('address');

for (var x = 0; x < input.length; x++) {
        addListener(input[x]);
    }

, который вызывает функцию «addListener»

function addListener(el) {
  var autocomplete = new google.maps.places.Autocomplete(el);

  google.maps.event.addListener(autocomplete, 'place_changed', function ()    {
 // Do whatever you want in here e.g.
 // var place = autocomplete.getPlace();
  });
}

. Поскольку это коллекция, вы должны иметь возможность добавлять любое количество полей автозаполнения на страницу. Хотя, естественно, вы должны проверить наличие неопределенного в коллекции на случай, если на странице не будет полей автозаполнения.

31
задан Zarkonnen 1 October 2008 в 11:36
поделиться

9 ответов

У меня есть те же проблемы, как Вы, я думаю. Проверьте мое сообщение здесь:

Проблемы Производительности Java2D

Это показывает причину снижения производительности и как зафиксировать его. Это, как гарантируют, не будет работать хорошо над всеми платформами все же. Вы будете видеть почему в сообщении.

15
ответ дан 27 November 2019 в 22:10
поделиться

Синтез ответов на это сообщение, ответов на Consty , и мое собственное исследование:

, Что работы:

  • Использование GraphicsConfiguration.createCompatibleImage для создания изображений, совместимых с тем, что Вы привлекаете. Это абсолютно необходимо!
  • Использование рисунок с двойной буферизацией через Canvas.createBufferStrategy.
  • Использование -Dsun.java2d.opengl=True где это возможно для ускорения рисунка.
  • Избегают использования, преобразовывает для масштабирования. Вместо этого масштабированные версии кэша изображений Вы собираетесь использовать.
  • Избегают полупрозрачных изображений! Изображения Bitmasked прекрасны, но полупрозрачность является очень дорогой в Java2D.

В моих тестах, с помощью этих методов, я получил увеличение скорости 10x - 15x, делая надлежащий Java 2D графикой возможность.

29
ответ дан 27 November 2019 в 22:10
поделиться

Вот некоторые подсказки первое, что пришло на ум. Если Вы были более конкретными и что Вы пытались сделать, я могу помогать больше. Походит на игру, но я не хочу принимать.

Только тянут то, что Вы должны! Вслепую не называйте перекрашивание () всем временем, пробуйте некоторые одноуровневые элементы как перекрашивание (Rect) или перекрашивание (x, y, w, h).

Быть очень осторожным с альфой, смешивающейся, поскольку это может быть дорогая операция к смешиванию изображений / примитивы.

Попытка предварительно представить / кэш как можно больше. Если Вы рисуете круг, тот же путь, много раз, рассматривает подхождение к концу в BufferedImage и затем просто привлекает BufferedImage. Вы жертвуете памятью за скорость (типичный для игр / высокая графика перфекта)

, Рассматривают использование OpenGL, используют JOGL LWJGL. JOGL более подобен Java, тогда как LWJGL обеспечивает больше играющей функциональности сверх доступа OpenGL. OpenGL может потянуть порядки величины (с надлежащими аппаратными средствами и драйверами), чем Swing может.

11
ответ дан 27 November 2019 в 22:10
поделиться

Я сделал некоторые основные приложения рисунка с помощью Java. Я не работал ни над чем слишком графическо-интенсивным, но я рекомендовал бы иметь хороший дескриптор на всех вызовах 'перекрашивания'. Дополнительное перекрашивание обращается к родительскому контейнеру, мог удвоить объем рендеринга Вашего выполнения.

1
ответ дан 27 November 2019 в 22:10
поделиться

Я наблюдал этот вопрос, надеясь, что кто-то предложил бы Вам лучший ответ, чем мой.

Тем временем, я нашел следующий отчет Sun, который был записан после бета-версии jdk 1.4. Существуют некоторые интересные рекомендации здесь на подстройке, включая флаги во время выполнения (у основания статьи):

" Флаг Во время выполнения Для Соляриса и Linux

, Запускающегося с Бета 3 выпуска SDK, версии 1.4, Java, 2D хранилища отображают в пиксельных картах по умолчанию, когда DGA не доступен, работаете ли Вы в локальной или удаленной среде дисплея. Можно переопределить это поведение с флагом pmoffscreen:

-Dsun.java2d.pmoffscreen=true/false

при установке этого флага на истинную, внеэкранную поддержку пиксельной карты, включен, даже если DGA доступен. При установке этого флага на ложь внеэкранная поддержка пиксельной карты отключена. Отключающая внеэкранная поддержка пиксельной карты может решить некоторые проблемы рендеринга. "

1
ответ дан 27 November 2019 в 22:10
поделиться

удостоверьтесь, что Вы используете двойную буферизацию, тянете сначала к одному большому буферу в памяти, которую Вы затем сбрасываете для экранирования, когда весь рисунок сделан.

0
ответ дан 27 November 2019 в 22:10
поделиться

Существует несколько вещей, которые необходимо будет иметь в виду

, 1) обновляется эта ссылка шоу, как использовать swingtimers, который мог бы быть хорошим вариантом для вызова перекрашивания. Получение вычисленного перекрашивания (поскольку в предыдущих плакатах было сказано, важно, таким образом, Вы не делаете слишком большой работы).

2) Удостоверяются, что Вы только делаете рисунок в одном потоке. Обновление UI от потоков mulitple может привести к противным вещам.

3) Двойная буферизация. Это делает рендеринг более гладким. этот сайт имеет некоторую более хорошую информацию для Вас

0
ответ дан 27 November 2019 в 22:10
поделиться

Альтернатива, если Вы не хотите идти чистый 2D Java, должна пользоваться игровой библиотекой, такой как GTGE, или JGame (ищите их на Google), затем предложите легкий доступ к графике и также предложите двойную буферизацию и намного более простые команды рисования.

0
ответ дан 27 November 2019 в 22:10
поделиться

Есть одна важная, которая, я думаю, еще не упоминалась: кэшируйте изображения всего, что можете. Если у вас есть объект, который движется по экрану, и его внешний вид не сильно меняется, нарисуйте его на изображении, а затем визуализируйте изображение на экране в новом положении в каждом кадре. Сделайте это, даже если объект очень простой - вы можете быть удивлены тем, сколько времени вы сэкономите. Рендеринг растрового изображения намного быстрее, чем рендеринг примитивов.

Возможно, вы захотите явно настроить подсказки рендеринга и отключить такие вещи, как сглаживание, если это позволяет качество.

3
ответ дан 27 November 2019 в 22:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: