Помогите с алгоритмом динамического обновления текстового отображения.

StackOverflow https://stackoverflow.com/questions/932441

Вопрос

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

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

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

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

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


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

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

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

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

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top