ПрограммированиеФорумОбщее

Долгие операции в играх

Страницы: 1 2 Следующая »
#0
14:40, 23 ноя 2010

Итак, есть игра. Можем ходить - уже хорошо. Но вот как сделать некоторые продолжительные действия, как минимум стрельба. Это только в доисторических играх нажатие мышки соответствует выстрелу. А ведь иногда игрок поднимает руку в сторону выстрела, на проигрывание анимации уходит время. Или, например, посадка в машину и выход из нее. Вполне возможно игрок захочет на середине отменить данное действие.

Вопрос: как организовать долгие операции красиво? Без запутанного кода в обновлении на каждом кадре:

void Player::update()
{
    if(state == STATE_ENTER_CAR)
    {
        if(stateTimer == 0)
        {
            playAnimation("sit_in_car");
        }
        else if(stateTimer >= 1000)
        {
            joinToCar(...);
        }
    }
    else if(state == STATE_LEAVE_CAR)
    {
    }
}

и так столько раз, сколько есть возможных долгих операций...

#1
14:57, 23 ноя 2010

AntonV
> Без запутанного кода в обновлении на каждом кадре:
этот код и есть КА - без КА сложно жить :)  - нужно обернуть получше

p.s. КА  - конечный автомат, это для тех кто любит придираться к моим словам

#2
15:14, 23 ноя 2010

Понятно, что можно эти состояния обернуть в какие-то классы. Не делать int state, а сделать State state, у класса которого будет onUpdate. Но! Все равно идет обновление на каждом кадре. Если найдутся люди, которые скажут "ну и что", хочу заметить, что движок уже и так перебирает все объекты для их отрисовки, опять их перебирает для обработки физики, еще только не хватает обработки логики на каждом шаге. Кажется более очевидной логика таймеров, где движку передается запрос "вызвать функцию объекта через n миллисекунд". Это поможет в случае, если имеем сотни игроков, каждый из которых бежит к какой-то конкретной точке, кто-то перезаряжается. Все эти операции просто не требуют проверки на каждом кадре.

#3
15:16, 23 ноя 2010

AntonV
оптимизируй

#4
15:21, 23 ноя 2010

Именно поэтому я сюда и обратился с вопросом.

#5
15:24, 23 ноя 2010

AntonV
> Но! Все равно идет обновление на каждом кадре. Если найдутся люди, которые
> скажут "ну и что", хочу заметить, что движок уже и так перебирает все объекты
> для их отрисовки, опять их перебирает для обработки физики, еще только не
> хватает обработки логики на каждом шаге.
что у нас показывает профайлер ?

#6
15:35, 23 ноя 2010

Z
> Долгие операции удобно делать нитями, чтобъ код действия лежал линейно перед
> глазами. Иногда заставлять нить спать.

извини, ты сегодня действительно в ударе :) 
напалм, такой конкретный

#7
15:39, 23 ноя 2010

AntonV

делать Object::Update( deltaTime ) по-любому, а вот то что внутри - уже пооптимизировать

#8
15:44, 23 ноя 2010

Хорошо. Это я в принципе и хотел узнать.

#9
16:27, 23 ноя 2010

а нужно ли всем объектам этот Object::Update? а ведь пробегаться по всем объектам разбросанным  в памяти дороговато. некоторых желательно трогать каждый кадр, некоторых раз в минуту и тд...
блин опять... получается нужно очередь задач с учетом событий( когда задачу выполнять).

#10
16:31, 23 ноя 2010

susageP
> а ведь пробегаться по всем объектам разбросанным в памяти дороговато.
> некоторых желательно трогать каждый кадр, некоторых раз в минуту и тд...

кстати, какое число объектов у топикастера ?

#11
16:35, 23 ноя 2010

Порядка 5 тысяч.

#12
16:38, 23 ноя 2010

AntonV
> Порядка 5 тысяч.
что за проект если не секрет ?

можно сделать флажок - OBJECT_NEED_UPDATE - ии загнать всех таких индивидуумов в отдельный список - им и вызывать Update()

так у  тебя 5000 вообще объектов или это актеры ?

#13
16:53, 23 ноя 2010

5 тыщ проверок в цикле, каждый игротакт. Игротактов в секунду порядка 50. Того 250 тыщ проверок в секунду. Сравнение с нулём - это 3 такта где-то, приращение индекса - 1 такт. Получаем, что миллион тактов за секунду тратится на тупо проверки. Мой комп делает 600 миллионов тактов, так что можешь не париться.

#14
17:34, 23 ноя 2010

AntonV
> if(stateTimer == 0)
> {
> playAnimation("sit_in_car");
> }
> else if(stateTimer >= 1000)
> {
> joinToCar(...);
> }

> Кажется более очевидной логика таймеров, где движку передается запрос "вызвать
> функцию объекта через n миллисекунд". Это поможет в случае, если имеем сотни
> игроков, каждый из которых бежит к какой-то конкретной точке, кто-то
> перезаряжается. Все эти операции просто не требуют проверки на каждом кадре.

так заведи таймер, в котором priority_queue колбэков по времени срабатывания, сравнивать с текущим временем только вершину.

Страницы: 1 2 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.