Вот смотри:
Вариантов организации игрового цикла много.
Я использовал следующий вариант (в псевдокоде):
пока True делаем
{
Обработка сообщений окна
рассчитываем длина_игрового_такта:
пока длина_игрового_такта >= (1000 div ФА) делаем
{
UpdatePhysic;
Dec(длина_такта, длительность_физ_апдейта);
}
UpdateRender;
}
ФА - число подбираемое таким образом, чтобы 1000 div ФА - получилось примерно длительность одного апдейта физики.
Таким образом получаем, пока длина игрового такта (допустим что у тебя стоит фиксированное кол-во кадров в сек) больше времени на апдейт физики - физика рассчитывается столько раз, сколько "влазит" в продолжительность игрового такта. Потом - один рендер.
При этом длина_игрового_такта рассчитывается с применением функции наподобие:
function GetTime: Integer;
var
F, C: LARGE_INTEGER;
begin
QueryPerformanceFrequency(int64(F));
QueryPerformanceCounter(int64(C));
Result := Trunc(1000 * C.QuadPart / F.QuadPart);
end;
В общем, понимаю что мутно объяснил... Я просто найти ссылку на хороший материал по игровым циклам не могу. Давали мне, а я посеял... Вот надеюсь - кто-то из постояльцев поможет с этим вопросом.
Конечно могу скинуть в личку конкретный кусок своего кода с организацией цикла. Но оно - на Дельфи.
C# рождён С++ом, но воспитан Делфёй))
Я начинал программировать на бэйсике в 6м классе (gwbasic), с девятого изучал Qbasic, в универе 1,5 года Pascal, а потом Делфи 7. Во втором полугодии пятого курса нам читали Borland C++. На работе сначала программировал pascal и asm(микроконтроллеры), потом только на С. В целях саморазвития рассматривал doger на delphi в OpenGL. Потом попалась книжка Миллера про Managed DirectX и с тех пор я поклонник C#.
Итог: любой код на вышеперечисленных языках мне не чужд.
Измерить сколько милисикунд прошло между кадрами и столько же нафигачить обсчетов одним циклом, а потом прописать рендер, разве так нельзя? Как по мне, так лучше вообще на 2 потока разбить - видео и мышь в один, а клава и физика в другой. В физическом фиксированное число обсчетов и кадров, а в графическом сколько угодно. Получается очень недурно и на тебе оптимизация на 2 ядра )))
LifeKILLED
> Измерить сколько милисикунд прошло между кадрами и столько же нафигачить
> обсчетов одним циклом, а потом прописать рендер, разве так нельзя
В общем-то я и привел пример ТАКОГО режима. Только у меня - плавающее число физ. апдейтов, на случай низкого быстродействия железа.
Столько же обсчетов ты не нафигачишь - надо учитывать сколько времени на один обсчет физики потребуется. Ну а оттуда - число физ. апдейтов.
С потоками есть свои подводные камни, поэтому, для проектов такой степени сложности, я вот, пока что не заморачивался разделением.
Повторюсь - вариантов организации игрового цикла - много. У меня - просто плавающий апдейт физики на один рендер, завиясящий от общей производительности системы.
Есть более сложный вариант - учитывающий "сложные" кадры, когда такт игры "вылетает" за пределы некоего временного "фрейма". Тогда в более "легких" кадрах - идет компенсация. Но я, честно говоря, не разобрался в механизме.
В помощь могу дать ссылку. Найти линк на качественное описание ВСЕХ возможных вариантов ОДНОПОТОЧНОЙ организации игрового цикла я так и не смог. :( Как откопаю - сразу выложу.
Homeship, на си шарпе многопточность реализуется достаточно просто, чтобы соответствовать уровню моего проекта. Достаточно каждую парралельную операцию обернуть функцией без параметров и можно запускать её в отдельном потоке. И, для оптимизации, не обращаться из неё к глобальным переменным.
LifeKILLED, я пока не представляю как клавиатуру и мышь раскидать по разным потокам, но для физики поток найдётся.
Да речь то в общем-то не о многопоточности а о рассинхре рендера и физики.
Опять таки - это не есть гарантия что у тебя проблемы с пулями исчезнут. Может там косяк в расчете столкновений с террайном.
Homeship, я понял.
В личку кинул пример кода.
Пасиба.
Мне кажется, фигня все это, сколько раз цикл не повтори, функция-то остается та же.
Согласен что скорее всего - ошибка в вычислении пересечений.
Но исключать ошибку возникающую из-за неточности физики тоже нельзя.
Опять же - думаю от более корректной организации главного игрового цикла - хуже не будет.
> Закончился срок хранения файла. Файл удален с сервиса.
Жаль, поглядел бы.
Voltt
Я снова залью, раз интересно.
Дважды пробовал играть, оба раза никого не встретил, в кого можно было бы стрелять. ЧЯДНТ?)
Доставляют танцующие деревья.
Тема в архиве.