Рендеринг отформатированного текста в Python (в настоящее время с Pyglet)

Я использую Pyglet, чтобы сделать игру. В какой-то момент эта игра будет иметь внутриигровую справку / ссылку на некоторые "основные" правила RPG, а также описания и тому подобное (в игре используется Pathfinder SRD). Так что есть длинные отформатированные тексты (разных размеров, цветов и т. Д.). Пример стиля, который я намереваюсь предоставить (будет сделано дальнейшее форматирование): внутриигровая SRD

В настоящее время я использую отформатированную модель документа Pyglet (простой текст с несколькими полями, сгенерированными Python для стиля / форматирования):

"""
{font_name 'Fontin'}{.align "center"}{bold True}{font_size 28}{italic True}{indent 0}{color (128,144,160, 223)}
The Title
{.align "left"}{bold False}{font_size 12}
Huge amount of text with further reformatting goes here...
And ends with a copyright notice (section 15 of OGL).
"""
  • Если я сохраню тексты в json (под определенными ключами для класса, расы и т. Д.), Эта одноразовая обработка может занять несколько секунд; Хранение текста в теле.py ( такого как этот, с 5k строками) в словаре того стоит, есть ли причина этого не делать?
  • Декодирование во время выполнения с использованием pyglet.text.decode_attributed занимает некоторое время Но, учитывая, что по окончании ссылки на игру, возможно, будет сто "страниц", декодирование перед выполнением (декодирование всего словаря или json) займет большое количество времени, затраченного до начала игры. Таким образом, предварительное декодирование или декодирование на лету (что означает, что некоторые тексты, если я не сделаю эффективный код, могут быть избыточно перекодированы)? Темы не надежны на пиглет...
  • Рендеринг и последующее переключение содержимого pyglet.text.layout.ScrollableTextLayout документ занимает 1-2 секунды на больших кусках текста, больше, если текст не был ранее декодирован;
  • Или, может быть, есть какие-то другие библиотеки, которые можно использовать для визуализации текста в контексте pyglet (с некоторыми корректировками)... Однако учтите, что в текущем формате я могу одновременно показать весь материал в представлении "Reference" или извлечь небольшое количество текста из него для всплывающей подсказки, например...
  • Несколько заключительных соображений: здесь важна производительность, так как я нацеливаюсь на машины с низким уровнем спецификации Игра будет графической roguelike / 2d rpg, требующей больше, чем libtcod/curses, но без трехмерной графики, поэтому сейчас я использую pyglet. Но аспект форматированного текста, в частности, беспокоит меня.

1 ответ

Решение

Место хранения

Если бы я был на вашем месте, я бы сохранил текст в необработанном формате, прочитав его один раз в ваш соответствующий dictionary структурировать, а затем выбросить его в бинарный файл. Это безумно быстро, как для чтения, так и для работы, и занимает меньше места.

расшифровка

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

Обычно вы не можете сериализовать библиотеку GL (некоторые части вы можете, но иногда это сложно).
Поэтому лучше всего было бы разделить то, что вам нужно загрузить для запуска, а затем упаковать остальные последовательные декодирования.

Pyglet

Теперь у каждого своя религия. Мои это Питон и Пиглет.
С учетом сказанного, вы уверены, что вам действительно нужен Пиглет? Я имею в виду, если вы собираетесь работать только с текстом, возможно, Pygame или даже набор пользовательского интерфейса, такие как TkInter или Kiwy, являются лучшими вариантами?

Pyglet действительно разнообразен и может с легкостью справляться со сложными вещами, но это также очень тяжелая и утомительная работа, выполняемая вручную. Обычно это полезно, если вы собираетесь делать сумасшедшие вещи, которые раньше не делались. Например, ваш собственный движок gfx или пользовательские кнопки, которые нельзя сделать иначе.

2d

Вы упомянули, что это требование, я не уверен почему, потому что вы тот, у кого есть видение.
Но взгляните на другой вопрос, на который я вчера ответил о том, как улучшить производительность.

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

Я уже делал 2d / side-scroller / rpg игру и использовал Pyglet, но только потому, что я чувствую себя более комфортно при утомительной ручной работе, чем при использовании других предопределенных библиотек, опять же...
Если вы знаете, почему не пожалеете о предстоящей тяжелой работе, сделайте это! Но это вся помощь, которую мы можем вам оказать, поскольку вы на самом деле не обращались за помощью по коду.

Удачи тебе!

Другие вопросы по тегам