Классические игры вроде Ultima используют вид сверху: персонаж всегда по центру, а карта двигается под ним. Вопрос от Jay из группы Commodore 64 Ultimate Development & Modifications как раз об этом. Ответ сводится к простой идее — разделить «мир» и «окно в него». Есть огромная карта в памяти, а на экране показывается только её кусок размером 11×11 тайлов, начиная с координат (CX, CY). Позиция игрока (PX, PY) задаёт этот кусок: CX = PX − 5, CY = PY − 5. Камера зажимается по краям карты, чтобы не вылезти за границы.
Первый черновик на CBM BASIC v2 работает ужасно медленно — на каждой перерисовке используются умножения и двумерные массивы. Всё тормозит. Оптимизация идёт в несколько этапов. Сначала — таблица строк экрана (screen row LUT): вместо умножения (OY+J)×40 берётся готовое значение из массива R(Y). Ускорение в 3-5 раз, но старт становится ещё медленнее.
Дальше карту переделывают из двумерного массива в плоский одномерный, а строки карты тоже кешируют в таблице MR(Y) = Y × MW. В цикле рендера остаются только сложения — умножений ноль. Ещё одна победа над скоростью ценой задержки загрузки.
Когда старт стал совсем невыносимым, добавили индикатор — печать точек внутри циклов инициализации. В реальной игре таблицы просто читались бы из DATA или грузились с диска.
Финальный штрих — развёртка внешнего цикла. Вместо FOR J = 0 TO 10 прописаны 11 явных строк: каждая строка экрана отрисовывается отдельно с вызовом подпрограммы. Убрали 10 операторов NEXT за кадр — ощутимо быстрее.
Автор даёт идеи для будущих улучшений: POKE медленный, PRINT быстрее, но лучше писать строки целиком. Можно вставить ассемблерную вставку для копирования памяти. Использовать мета-тайлы (3×3 или 5×5) — карта соберётся быстрее. Также: частичная перерисовка только новых строк/столбцов, аппаратный плавный скролл через регистры $D016/$D011 и смена знакогенератора для кастомной графики.
Главный урок: отделяйте мировые координаты от экранных, смотрите на видимую область как на окно. На ретро-железе таблицы поиска — король оптимизации: жертвуете немного памяти и времени старта ради колоссального выигрыша в рантайме.