Помогите с алгоритмом динамического обновления отображения текста - PullRequest
4 голосов
/ 31 мая 2009

Сначала немного предыстории:

Я делаю то, что может быть " roguelike ", так что я могу использовать некоторые интересные идеи, которые всплывают у меня в голове. Геймплей не будет проходить в подземелье, но в любом случае показ будет происходить в том же стиле, с простыми символами ascii.

Поскольку это самообучение, Я стараюсь сам кодировать большинство из них .

В конце концов, мне бы хотелось, чтобы игра работала в сколь угодно больших игровых мирах. (до такой степени, что я предполагаю, что игра будет подключена к сети и охватит множество мониторов в компьютерной лаборатории).

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


А теперь вопрос:

Я провел несколько тестов, и самое большое узкое место - перерисовка текстовых консолей.

Наличие такого большого игрового мира потребует интеллектуального обновления дисплея. Я не хочу повторять каждый мой буфер игры каждый кадр ... Мне нужно несколько указателей о том, как его настроить, чтобы он обновлял только те части игры, которые были обновлены. (а не только отдельные персонажи, как у меня сейчас)

Я манипулировал консолью Windows с помощью windows.h, но мне также было бы интересно, чтобы она работала на машинах Linux через клиента puTTY, подключенного к серверу.

Я пытался адаптировать некоторые подпрограммы обработки видео, так как между пикселем и символом почти соотношение 1: 1, но мне не повезло.

Действительно, я хочу простое объяснение некоторых принципов, стоящих за ним. Но некоторый пример (псевдо) кода тоже подойдет.

Ответы [ 3 ]

6 голосов
/ 31 мая 2009

Используйте Curses или, если вам нужно сделать это самостоятельно, прочитайте о контрольных кодах VTnnn. Оба они должны работать на Windows и на * nix терминах и консолях (и Windows). Вы также можете обратиться к исходному коду nethack за подсказками. Это позволит вам изменять символы на экране, где бы они ни происходили.

4 голосов
/ 31 мая 2009

Я не собираюсь утверждать, что понимаю это, но я думаю, что это близко к проблеме, стоящей за легендарным кодом перерисовки Гослинг Emacs Джеймса Гослинга. См. Его статью под названием «Алгоритм повторного воспроизведения», а также общую проблему исправления строки в строку .

1 голос
/ 01 июня 2009

Большой игровой мир требуют интеллектуального обновления дисплей. Я не хочу иметь повторно толкать весь мой игровой буфер каждый кадр ... мне нужно несколько указателей о том, как установить его так, чтобы он только рисовал разделы игры были обновлено. (а не только индивидуальный символы, которые у меня есть сейчас)

Размер игрового мира на самом деле не имеет значения, так как все, что вам нужно сделать, это обработать видимую область для каждого клиента и отправить эти данные. Если у вас обычный консольный дисплей 80x25, то вы будете отправлять только 2 или 3 килобайта данных каждый раз, даже если вы добавите цветовые коды и тому подобное. Это типично для большинства онлайн-игр такого рода: обновляйте то, что видит человек, а не все в мире.

Если вы хотите поэкспериментировать с попыткой найти способ сократить то, что вы отправляете, то не стесняйтесь делать это в учебных целях, но мы прошли 10 лет после того, как неэффективно обновлять дисплей консоли в чем-то приближающемся к реальному времени, и было бы стыдно тратить время на решение проблемы, которая не требует решения. Обратите внимание, что PDF-файл, указанный выше, дает решение O (ND), тогда как простая отправка всей консоли равна половине O (N), где N определяется как сумма длин A, B и D.

...