ASCII Игры DOS - Рендеринг методов

Я пишу старой школе игру Командной строки 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

9
задан Damien 9 January 2014 в 21:47
поделиться

4 ответа

clock()-renderTimer > RenderInterval * CLOCKS_PER_SEC

будет вычисляться немного быстрее, возможно, даже быстрее, если вы предварительно вычислите часть RenderInterval * CLOCKS_PER_SEC.

1
ответ дан 3 November 2019 в 07:46
поделиться

Я понял, почему он не рендерится сразу, таймер, который я создал, в порядке, проблема в том, что фактическое значение clock_t имеет точность только до 0,054547XXX или около того, и поэтому я можно было рендерить только со скоростью 18 кадров в секунду. Я бы исправил это, используя более точные часы ... это совсем другая история

1
ответ дан 3 November 2019 в 07:46
поделиться

Как насчет этого: вы вычитаете из 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 и таким образом избавиться от него, упростив операцию.

Добавление скобок придает ей большую наглядность. И, возможно, упростив эту формулу, вам будет легче понять, что происходит не так.

0
ответ дан 3 November 2019 в 07:46
поделиться

Как вы заметили в своем последнем вопросе, вы ограничены параметром CLOCKS_PER_SEC, который составляет всего около 18. Вы получаете один кадр на дискретное значение часов, поэтому вы ограничены до 18 кадров в секунду.

Вы можете использовать интервал вертикального гашения экрана для измерения времени, он является традиционным для игр, поскольку позволяет избежать «разрывов» (где половина экрана показывает один кадр, а половина - другой)

0
ответ дан 3 November 2019 в 07:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: