Я сейчас портирую свой 2D-движок на Java.Я посмотрел на некоторые из библиотек игр, указанных здесь, на stackoverflow.Однако те, на которые я смотрел, были довольно упрощенными и даже не указывали, поддерживают ли они такие вещи, как альфа-прозрачность, поэтому я решил портировать свой рендерер C ++, для которого я уже выписал логику.
Этот рендерерэто чистый программный рендер, который использует тайлинг, чтобы избежать ненужного повторного рендеринга.Я оптимизировал его производительность прокрутки, создав «внеэкранный буфер», немного больший, чем моя панель вывода, и поместил этот внеэкранный буфер на мой вывод в каждом кадре.Таким образом, я мог бы избежать ненужной перерисовки плиток просто потому, что прокручивал пиксель на карте.
Я использовал AWT Java для его реализации, используя большой BufferedImage для внеэкранного буфера.Использование ЦП в порядке (примерно вдвое больше, чем у меня в C ++), но есть странная проблема с непрерывной прокруткой, когда каждую секунду или около того рендерер задерживается примерно на 0,2 секунды.
Поскольку ничего нетв моем собственном коде, который происходил бы в эти периоды, и поскольку пики исчезают, если я не рисую свой внеэкранный буфер в главном представлении, я могу только заключить, что Java выполняет некоторую внутреннюю оптимизацию самостоятельно.Однако я не уверен, что он делает, и не знаю, какую из моих собственных оптимизаций мне пришлось бы удалить, чтобы избавиться от пиков.Кроме того, может случиться так, что java AWT не был создан с непрерывной прокруткой с высоким FPS, и это совершенно непригодно для этой цели.
Есть ли какой-то способ избавиться от этих пиков?