Зеркальные кадры персонажей — готовыми файлами, а не разворотом в рантайме
Замеры в 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:
@@ -105,6 +105,31 @@ int pop_guard_load(void) __banked
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Зеркальный набор соперника — пара к pop_guard_load: те же страницы, но
|
||||
* файлы *_v.atl (см. pop_vflip.h). Здесь, а не в загрузчике набора,
|
||||
* потому что gp[] и выбор GUARD/SKEL живут именно тут. */
|
||||
int pop_guard_vflip_load(void) __banked
|
||||
{
|
||||
static const char *const guard_v[GUARD_PAGES] = {
|
||||
"GUARD\\g0_v.atl", "GUARD\\g1_v.atl", "GUARD\\g2_v.atl",
|
||||
"GUARD\\g3_v.atl", "GUARD\\g4_v.atl"
|
||||
};
|
||||
static const char *const skel_v[GUARD_PAGES] = {
|
||||
"SKEL\\g0_v.atl", "SKEL\\g1_v.atl", "SKEL\\g2_v.atl",
|
||||
"SKEL\\g3_v.atl", 0
|
||||
};
|
||||
const char *const *names;
|
||||
int8_t type = pop_level_guard_type(pop_current_level);
|
||||
uint8_t i;
|
||||
if (type < 0 || !g_ok) return 0; /* соперников на уровне нет */
|
||||
names = (type == 2) ? skel_v : guard_v;
|
||||
for (i = 0; i < GUARD_PAGES; i++) {
|
||||
if (names[i] == 0) break;
|
||||
if (pop_vflip_add(&gp[i], names[i]) != 0) return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void pop_guard_free(void) __banked
|
||||
{
|
||||
uint8_t i;
|
||||
|
||||
Reference in New Issue
Block a user