Зеркальные кадры персонажей — готовыми файлами, а не разворотом в рантайме
Замеры в 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.
This commit is contained in:
@@ -344,3 +344,15 @@ uint8_t pop_palace;
|
||||
* pop_map зовёт pop_mirror_draw из pop_check_mirror, поэтому символ нужен. */
|
||||
void pop_mirror_draw(int clip_top) __banked { (void)clip_top; }
|
||||
void pop_mirror_heal(void) __banked { }
|
||||
|
||||
/* ---- Зеркальный набор персонажей (зелье инверсии) -------------------- *
|
||||
* В host-тестах графики нет: pop_kboot линкуется ради pop_kid_data_load, а
|
||||
* его хвост (загрузка *_v.atl) заглушен — проверять там нечего, атласов в
|
||||
* тесте не существует вовсе. */
|
||||
uint8_t pop_vflip_ready(void) { return 1; } /* «уже загружено» — грузить не станет */
|
||||
int pop_vflip_add(const void *orig, const char *path)
|
||||
{ (void)orig; (void)path; return 0; }
|
||||
uint8_t pop_vflip_page(uint8_t src) { return src; }
|
||||
void pop_vflip_reset(void) { }
|
||||
int pop_sword_vflip_load(void) __banked { return 0; }
|
||||
int pop_guard_vflip_load(void) __banked { return 0; }
|
||||
|
||||
Reference in New Issue
Block a user