Какой компонент подкласса для рисования в Java2D (для 2D-игры)

Я создал свой собственный холст, который был расширен из JPanel, однако я заметил, что с контентом и т. д. внезапно мой FPS получил удар. Я следую правилам свинга из Filthy Rich Clients, используя paintComponent, создавая область отсечения, перерисовывая только то, что было изменено, и так далее. Я установил FPS на постоянные 50 FPS, и я замечаю, что иногда мой FPS падает до 31/32 FPS и возвращается к 50 и так далее. Во время работы моей программы она использует всего около 25 МБ ОЗУ и 0 ресурсов ЦП, даже при рендеринге. У меня также установлен OpenGL.

Примечание. У меня НЕТ изображений, это строго с использованием фигур в графике.

Сильно ли снижается производительность при рисовании всего на JPanel? Должен ли я расширять другой компонент (я продолжаю видеть компонент Canvas)? Насколько «умно» создавать такие игры, как тетрис (или любые другие ретро-игры) в JPanel?

Возможно, это проблема с таймером, так как я только что добавил 100 дополнительных вызовов рисования, а FPS все еще делает 50 32/31.


person abc123    schedule 19.04.2011    source источник
comment
После долгих исследований я обнаружил, что проблема вовсе не в JPanel. На самом деле проблема связана с таймером в java. Это не на 100% точно, что привело к тому, что FPS сильно упал. Я решил исправить это, прочитав это: koonsolo.com/news/dewitters-gameloop   -  person abc123    schedule 19.04.2011


Ответы (2)


После долгих исследований я обнаружил, что проблема вовсе не в JPanel. На самом деле проблема связана с таймером в java. Это не на 100% точно, что привело к тому, что FPS сильно упал. Я решил исправить это, прочитав это: koonsolo.com/news/dewitters-gameloop

person abc123    schedule 19.04.2011
comment
Точность таймера зависит от детализации реализации прерывания часов ОС. WinXP, например, имеет точность около 15 мс. Интересная уловка, однако, состоит в том, чтобы запустить фоновый Thread.sleep(Long.MAX_VALUE); По какой-то причине это заставляет WinXP работать с точностью до 1 мс! java-gaming.org/index.php/topic, 24311.msg206914.html#msg206914 - person Phil Freihofner; 24.08.2011

Я понимаю, что вы обнаружили проблему с классом Timer, однако у меня есть для вас еще один комментарий, который может оказаться полезным:

Вы не упомянули, используете ли вы метод двойного буфера. Если нет, то вы можете заметить улучшение FPS.

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

person Crollster    schedule 31.05.2011