2016-07-14 2 views
4

Я сделал игру, но я не знаю, будет ли игра работать одинаково на других устройствах. Например, если процессор компьютера высок, игрок и враги будут двигаться быстрее? Если да, есть ли способ определить использование ЦП в SFML? Способ перемещения игрока и врагов в моей программе: 1-Проверьте, нажата ли клавиша 2-Если это так: move (x, y); Или есть способ заставить CPU выполнять некоторые операции в функции перемещения. Спасибо!Как определить, сколько CPU использовать в игре SFML?

+2

[Независимое движение кадра] (https://www.google.com/search?ie=UTF-8&q=frame+independent+movement&gws_rd=cr&ei=N_6HV4OsF4myUYWgv9AF&fg=1). Я рекомендую прочитать [this] (http://lazyfoo.net/SDL_tutorials/lesson32/index.php), хотя речь идет о SDL, вы поймете, что происходит – PcAF

+0

Спасибо за ссылку! – QApps

ответ

5

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

Согласно Гленн Фидлер в своей Gaffer on Games статьи 'Fix Your Timestep!'

[A игрового цикла, который обрабатывает время неправильно может сделать] поведение вашего физического моделирования [зависит] от времени дельты вы передаете в. Эффекте мог быть тонким, так как ваша игра имеет немного другое «чувство» в зависимости от частоты кадров, или она может быть такой же экстремальной, как ваше симулятор весны, взрывающийся до бесконечности, быстро движущиеся объекты, проходящие через стены, и игрок, падающий через пол!

Логика требует, чтобы вы отключали зависимости вашего обновления с момента, необходимого для рисования кадра. Простое решение заключается в следующем:

  • Выберите количество времени, которое может быть безопасно обработано (ваш Timestep)
  • Добавить время прошел каждый кадр в накопленном пул времени
  • Процесса время прошло в сейфе ломти

В псевдокоде:

time_pool = 0; 
timestep = 0.01; //or whatever is safe for you! 
old_time = get_current_time(); 

while (!closed) { 
    new_time = get_current_time(); 
    time_pool += new_time - old_time; 
    old_time = new_time; 

    handle_input(); 
    while (time_pool > timestep) 
    { 
     consume_time(timestep); //update your gamestate 
     time_pool -= timestep; 
    } 
    //note: leftover time is not lost, and will be left in time_pool 
    render(); 
} 

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

Для более тщательной обработки я рекомендую вам прочитать связанную статью.

Смежные вопросы