Фикс мерцания торцов: копия запечки требует ОКНА КЛИПА
Регресс от копии второй страницы (5ef721e), найден пользователем: уровень 1,
комната 6, Кид на кнопке (0,2) — дрожит нижняя грань переднего торца кнопки.
На уровнях 1-3 то же по торцам плит, полов и кнопок.
Причина системная. Полная запечка зовёт draw_tile, а тот рисует тайлы
ЦЕЛИКОМ, то есть пишет ШИРЕ прямоугольника бара. bake_copy переносит на
вторую страницу ровно бар — и всё, что легло вне него, на второй странице
остаётся прежним. Страницы расходятся, это и есть мерцание через кадр.
У полосы потолка (pop_ceil_bake_empty) проблемы не было: там окно клипа
поставлено ещё в G1, и запечка ограничена ровно копируемым прямоугольником.
А у pop_floor_bake окна не было — до этого оно трижды отвергалось как
невыгодное по скорости.
Фикс: окно клипа в pop_floor_bake возвращено, но теперь это условие
КОРРЕКТНОСТИ, а не оптимизация — записано в коде, чтобы его не сняли снова
«как убыточное». Само окно стоит ~8 500 такта (клипованный путь дороже
быстрого на ~1 500 на каждом из 7,6 блитов), но открывает копию второй
страницы, экономящую ~145 000: пара «запечка + копия» вдвое дешевле двух
запечек.
Второй гард того же захода: pop_set_redraw / pop_set_redraw_above гасят слот
копии при ПЕРЕпометке тайла — у кнопки с идущим таймером связи пометка
обновляется каждый кадр, и картинка каждый раз другая, копия старой не
годится. Объявления pop_bake_slot_reset* без __banked: pop_redraw.c и
pop_room.c в одном банке, трамплин не нужен.
Заодно починен скрипт рестарта MAME: он оставлял недоеденный запрос `exit` в
очереди IPC моста, и НОВЫЙ экземпляр его подхватывал и сразу выходил.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -9,7 +9,7 @@
|
||||
#include <stdint.h>
|
||||
#include "pop_redraw.h"
|
||||
#include "pop_bg.h"
|
||||
#include "pop_state.h" /* ВРЕМЕННО: счётчики состава перерисовок */
|
||||
#include "_pop_bg.h" /* pop_bake_slot_reset — тот же банк, без трамплина */
|
||||
|
||||
#define NTILES 30
|
||||
#define NCOLS 10
|
||||
@@ -61,6 +61,7 @@ void pop_set_redraw(uint8_t tilepos, uint8_t kind, uint8_t pages) __banked
|
||||
{
|
||||
if (tilepos >= NTILES) return;
|
||||
if (!rd_cnt[tilepos]) rd_pending++;
|
||||
else pop_bake_slot_reset(tilepos); /* перепометка — копия запечки не годится */
|
||||
rd_kind[tilepos] = kind;
|
||||
if (pages > rd_cnt[tilepos]) rd_cnt[tilepos] = pages;
|
||||
}
|
||||
@@ -69,6 +70,7 @@ void pop_set_redraw_above(uint8_t col, uint8_t kind, uint8_t pages) __banked
|
||||
{
|
||||
if (col >= NCOLS) return;
|
||||
if (!rda_cnt[col]) rd_pending++;
|
||||
else pop_bake_slot_reset_above(col); /* перепометка — копия запечки не годится */
|
||||
rda_kind[col] = kind;
|
||||
if (pages > rda_cnt[col]) rda_cnt[col] = pages;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user