AWT быстрая графика и безопасность потоков - PullRequest
7 голосов
/ 28 мая 2011

Я портирую действительно старую игру AWT на действительно нахальное новое устройство.

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

Мне удалось взломать его на работу, заставив поток движка рисовать в буфере за пределами экрана и затем периодически вызывать поток пользовательского интерфейса repaint () длякомпонент отображения и компонент отображения сбрасывают буфер на экран, но производительность отстой - неудивительно, учитывая все переключатели контекста и двойную буферизацию.

На самом деле я не особенно хорошо осведомленный программист AWT;это достаточно ненавистно, что я избегал этого до сих пор.Но эта проблема - желание нарисовать поток двигателя на экране - должна быть распространенной.Кто-нибудь знает какие-нибудь приличные стратегии (и, желательно, пример кода!), Как сделать это безопасным образом, чтобы выжать из системы максимально возможную производительность?

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

Это все на PBP 1.1.2 - да, это не полная Java и не честный MidP ...

1 Ответ

1 голос
/ 28 мая 2011

Использование игрового холста может помочь. Это позволяет рисовать в игровом цикле, поэтому вам не понадобится двойная буферизация. Еще один более грубый подход - использовать paintImmediately () . Это заставит графический интерфейс перерисовываться.

//Gui
public void update(/*may want to pass the shapes to paint*/)
{
    paintImmediately(this.getGrphics());    // assuming 'this' is a jpanel
}


//Game loop
public void gameLoop()
{
    // collision detection etc
    gui.update();
}
...