Я пишу старой школе игру Командной строки DOS ASCII. Честно я пытаюсь эмулировать ZZT для получения дополнительной информации об этом виде игрового дизайна (Даже если он вытеснен),
Я преуспеваю, заставил мой полноэкранный текстовый режим работать, и я могу создать миры и переместиться без проблем, НО я не могу найти достойный метод синхронизации для своего рендеринга.
Я знаю свой рендеринг, и предварительный рендеринг кода быстр, потому что, если я не добавляю задержки () s или (часы ()-renderBegin)/CLK_TCK проверки от time.h, рендеринг ослепительно быстр.
Я не хочу использовать задержку (), потому что это на мою конкретную платформу знаний, и к тому же я не могу выполнить код, в то время как это задерживается (Как ввод данных пользователем и обрабатывающий). Таким образом, я решил сделать что-то вроде этого:
do {
if(kbhit()) {
input = getch();
processInput(input);
}
if(clock()/CLOCKS_PER_SEC-renderTimer/CLOCKS_PER_SEC > RenderInterval) {
renderTimer = clock();
render();
ballLogic();
}
}while(input != 'p');
Который должен в "теории" работать просто великолепно. Проблема состоит в том, что, когда я выполняю этот код (устанавливающий RenderInterval на 0,0333 или 30 кадров в секунду) я не добираюсь НИГДЕ близко к 30 кадров в секунду, я добираюсь больше как 18 в максимум.
Я думал, возможно, что я попытаюсь установить RenderInterval на 0,0, чтобы видеть, подняла ли производительность..., это не сделало. Я был (с RenderInterval 0,0) достиганием макс. ~18-20fps.
Я, хотя, возможно, так как я непрерывно называю все, которые они синхронизируют () и, "делят это на тот" методы, я замедлял ЦП вниз что-то страшное, но когда я взял рендеринг и вызовы ballLogic из, если скобки оператора и установили RenderInterval на 0,0, я получаю, снова, ослепительно быстрый рендеринг.
Это не делает с тех пор мне с тех пор, если я уехал, если регистрация, разве это не должно работать столь же медленный? Я подразумеваю, что это все еще должно сделать все вычисления
BTW я компилирую с Turbo C++ Borland V1.01
clock()-renderTimer > RenderInterval * CLOCKS_PER_SEC
будет вычисляться немного быстрее, возможно, даже быстрее, если вы предварительно вычислите часть RenderInterval * CLOCKS_PER_SEC
.
Я понял, почему он не рендерится сразу, таймер, который я создал, в порядке, проблема в том, что фактическое значение clock_t имеет точность только до 0,054547XXX или около того, и поэтому я можно было рендерить только со скоростью 18 кадров в секунду. Я бы исправил это, используя более точные часы ... это совсем другая история
Как насчет этого: вы вычитаете из x (=clock()) y (=renderTimer). И x, и y делятся на CLOCKS_PER_SEC:
clock()/CLOCKS_PER_SEC-renderTimer/CLOCKS_PER_SEC > RenderInterval
Не будет ли более эффективным написать:
( clock() - renderTimer ) > RenderInterval
Первая проблема, которую я увидел с делением, заключается в том, что вы не получите действительное число, поскольку оно происходит между двумя длинными интами. Вторая проблема в том, что эффективнее умножить RenderInterval * CLOCKS_PER_SEC и таким образом избавиться от него, упростив операцию.
Добавление скобок придает ей большую наглядность. И, возможно, упростив эту формулу, вам будет легче понять, что происходит не так.
Как вы заметили в своем последнем вопросе, вы ограничены параметром CLOCKS_PER_SEC, который составляет всего около 18. Вы получаете один кадр на дискретное значение часов, поэтому вы ограничены до 18 кадров в секунду.
Вы можете использовать интервал вертикального гашения экрана для измерения времени, он является традиционным для игр, поскольку позволяет избежать «разрывов» (где половина экрана показывает один кадр, а половина - другой)