Fade: пересчёт палитры в пять раз дешевле, шестнадцать ступеней
Затемнение длилось около восьми секунд вместо заказанных двух. Причин две, и обе измерены в MAME. Первая: пересчёт палитры звался на КАЖДОМ кадре — сто с лишним раз за fade, хотя ступеней всего восемь. Теперь пересчёт идёт только при смене ступени, остальное время цикл просто ждёт луча. Вторая: сам пересчёт стоил 2,44 млн тактов — почти шесть кадров. Разложение показало, что заливка палитры через BIOS тут ни при чём (136 тысяч на восемь вызовов). Съедали два цикла на C: 768 умножений uint16 на канал и побайтовое копирование снимка из страницы шрифта. Умножения заменены таблицей яркости на стеке (256 сложений, без единого умножения), копирование — memcpy, то есть LDIR. Итог: 487 тысяч тактов, в пять раз меньше. Освободившийся запас потрачен на плавность: ступеней теперь шестнадцать вместо восьми. Длительность fade считает POP_FADE_FRAMES — из 106 кадров (2,13 с оригинала) вычитается то, что съедает сам пересчёт. Host-тесты: 15 наборов. Проверено в MAME: заставка проходит цепочку кадров штатно. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -31,9 +31,9 @@
|
||||
* 128 тиков, то есть 2,13 с (fade_in_1/fade_out_1 -> fade_*_frame ->
|
||||
* do_simple_wait(1) при wait_time = 2). Наши четыре кадра укладывались в
|
||||
* восемь сотых секунды, и вся сцена выходила втрое короче оригинальной.
|
||||
* Число здесь — кадры луча, ступени яркости внутри распределяет
|
||||
* pop_ui_fade_*. */
|
||||
#define INTRO_FADE POP_T60(128)
|
||||
* Точное число кадров считает POP_FADE_FRAMES (pop_ui.h): из
|
||||
* заказанных 2,13 с вычитается то, что съедает сам пересчёт палитры. */
|
||||
#define INTRO_FADE POP_FADE_FRAMES
|
||||
|
||||
/* Оцифрованные эффекты pv_scene() (SDLPoP seg001:422): створка ворот
|
||||
* закрывается, затем открывается дверь покоев, из которой входит Джафар. */
|
||||
|
||||
Reference in New Issue
Block a user