Принципы работы с игровыми приложениями на Java

курсовая работа

3.3 Frame Per Second при использовании потоков

Самый легкий путь использования потоков при создании Java - игры - это в бесконечном цикле организовать обновление и перерисовку различных событий. Такой способ имеет множество недостатков. Самый существенный - это использование слишком больших объемов памяти. Чтобы разумно использовать память при работе с потоками, в играх используется т.н. кадровая частота (FPS) - количество сменяемых кадров за единицу времени на мониторе. Минимальная кадровая частота для создания ощущения плавности движения составляет 12--18 кадров в секунду. FPS рассчитывается следующим образом:

1. Заводим заранее 2 переменные: базовый FPS и FPS для понимания его потоком. Второй вычисляется, как 1000 / FPS, это делается исключительно из-за того, что основное разряд времени для работы с потоками - 1 миллисекунда

2. Когда поток входит в цикл, фиксируем время его входа (startTime).

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

4. Нужная нам величина - переменная wait, хранит оптимальное время, на которое нужно временно остановить поток (ввести в сон). Оно вычисляется, как разность между поточной FPS и временем, затраченным для выполнения потоком отрисовки. Именно на эту величину можно останавливать поток, не опасаясь, потери памяти и “подвисаний” игры.

Пример:

private int FPS = 100;

private long targetTime = 1000 / FPS;

while (running) {

start = System.nanoTime();

update();

draw();

elapsed = System.nanoTime() - start;

wait = targetTime - elapsed / 1000000;

if (wait < 0)

wait = 5;

try {

Thread.sleep(wait);

} catch (Exception e) {

e.printStackTrace();

}

}

Делись добром ;)