Files
Sprinter-SDCC/applications/PoP/roomtest/pop_vflip.h
T
snark13 5b6664ffce Зеркальные кадры персонажей — готовыми файлами, а не разворотом в рантайме
Замеры в MAME (такты Z80, кадр = 430 000) решили вопрос однозначно:
  загрузка 28 атласов Кида с HDD  — 27 160 092 такта (1.26 с), 970 003 на страницу;
  разворот ОДНОЙ страницы на месте — 12 645 582 такта (0.59 с), т.е. 771 такт/байт.
Даже идеальный вариант (копия accel'ом ~0.25 кадра + asm-реверс ~2.2 кадра)
дал бы ~1.05 млн на страницу — то есть в лучшем случае сравнялся бы с чтением
готового файла.  На 34 страницы: 1.5 с загрузки против 20 с разворота.

* Упаковщики пишут второй набор: vflip_cols/vflip_page в pop_pack_kid.py ->
  kid0_v.atl…kid27_v.atl, sword_v.atl; pop_pack_guard.py -> g0_v.atl…g4_v.atl
  ТОЛЬКО для обычного стража (на уровне 9 tbl_guard_type = 0; тень рисуется
  атласами Кида, скелет/визирь с переворотом не встречаются).
* pop_vflip.c схлопнулся до таблицы «страница -> зеркальная пара»; весь
  побайтовый разворот и аллокация EMM удалены.
* pop_vflip_load_all (банк 8) грузит набор ОДНИМ вызовом и откуда угодно —
  задел под загрузку ресурсов во время интро.  Зовётся при старте и при
  смене уровня, если это POP_UPSIDE_LEVEL; чит U на других уровнях поднимает
  набор лениво (страховка в главном цикле).
* Стартовый уровень стал параметром сборки: make LEVEL=N (-DFIRST_LEVEL).

Проверено в MAME на уровне 9: переворот мгновенный, pop_flip_screen = 897 263
такта (2.1 кадра) — это сама копия экрана, загрузки в кадре больше нет.
tests-host 6/6.
2026-08-12 23:17:22 +03:00

49 lines
3.1 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* pop_vflip.h — ВЕРТИКАЛЬНО ЗЕРКАЛЬНЫЕ наборы спрайтов персонажей
* (зелье инверсии, уровень 9). Реализация и замеры — в pop_vflip.c.
*
* Кому нужно. Фон и все row-major спрайты переворачиваются даром (порядок
* строк = знак страйда, gfx_blit_*_vflip), а персонажи лежат КОЛОНКАМИ —
* у них даром получается горизонтальное зеркало, а вертикальное требует
* развернуть байты внутри колонки. Такой набор готовит упаковщик
* (kid0_v.atl, sword_v.atl, g0_v.atl…), а здесь он только грузится и
* связывается с оригиналом. Правило вызывающего:
*
* страница = pop_upside ? pop_vflip_page(a->page) : a->page;
* if (!страница) страница = a->page; // набор не загружен
*
* Ни смещения лент, ни размеры кадров, ни горизонтальный флип при этом не
* меняются: зеркальный файл имеет ТУ ЖЕ раскладку, отличаются только пиксели.
*
* КОГДА ГРУЗИТЬ — на усмотрение приложения: pop_vflip_load_all можно звать
* где угодно (старт игры, показ интро, вход на уровень с зельем). До
* загрузки движок просто рисует неперевёрнутыми кадрами — это заметно, но
* не ломает ни кадр, ни физику.
*/
#ifndef POP_VFLIP_H
#define POP_VFLIP_H
#include <stdint.h>
#include <sprite.h>
/* Загрузить зеркальный файл path и связать его с атласом orig.
* 0 — OK, -1 — файла нет / не хватило EMM / таблица полна. */
int pop_vflip_add(const atlas_t *orig, const char *path);
/* Страница-зеркало для страницы src; 0 — пары нет (набор не загружен). */
uint8_t pop_vflip_page(uint8_t src);
/* Загружен ли хоть один зеркальный атлас (чтобы не грузить дважды). */
uint8_t pop_vflip_ready(void);
/* Освободить весь набор (смена набора спрайтов соперника / уровня). */
void pop_vflip_reset(void);
/* Загрузить ВЕСЬ зеркальный набор: страницы Кида, меч и текущий набор
* соперника. Идемпотентна — повторный вызов ничего не делает. 0 — OK,
* -1 — что-то не загрузилось (движок останется на обычных кадрах).
* Живёт в банке 8 (pop_kboot.c): зовётся раз за игру/уровень. */
int pop_vflip_load_all(void) __banked;
#endif /* POP_VFLIP_H */