P4: каталог атласа читается из W0, а не через мап W3 — минус 408
atlas_image ради двух байт записи каталога переключает W3 туда и обратно, хотя вызывающий сразу после этого мапит ту же страницу в W0 — и каталог там доступен по тому же смещению. Новый atlas_image_w0 (libbgi) читает его из W0; в pop_blit_b порядок стал «сначала gfx_w0_map, потом каталог». ОЖИДАНИЕ НЕ ОПРАВДАЛОСЬ. По раскладке блита atlas_image стоил 672 такта, и я рассчитывал снять их целиком: 8 блитов зелёной фазы это 5 400 за кадр. Фактически цена блита 16 107 -> 16 005 (-102), на кадре -408. Причина: 672 — это почти целиком вызов функции и арифметика idx*8, а не переключение окна. Замер после правки: gfx_w0_map 324, «каталог + шапка + клип» 2 694 — работа просто переехала из одной статьи в другую. Правку оставляю: она не вредит, убирает лишнее переключение W3 и делает контракт честнее (страница мапится один раз). Но как способ снять накладные блита она не работает — фиксированная часть 6 765 -> 6 663. Замеры: лёгкая позиция 438 978 -> 438 570; тяжёлая 602 574 (прошлый замер 617 487 снят до P16, поэтому напрямую не сравним). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -582,8 +582,11 @@ void pop_blit_b(atlas_t *a, uint8_t idx, int x, int ybottom)
|
||||
pb_yb + POP_YOFF + 1 <= pop_t_fclip_ly0 ||
|
||||
pb_yb + POP_YOFF - 64 >= pop_t_fclip_ly1))
|
||||
return;
|
||||
pb_img = (const uint8_t *)atlas_image(pb_a, pb_idx);
|
||||
/* Страницу мапим ПЕРВОЙ, а каталог читаем уже из W0 (atlas_image_w0):
|
||||
* обычный atlas_image ради тех же двух байт переключает W3 туда и
|
||||
* обратно, и это 672 такта на КАЖДЫЙ блит (замер 2026-08-19). */
|
||||
gfx_w0_map(pb_a->page);
|
||||
pb_img = (const uint8_t *)atlas_image_w0(pb_a, pb_idx);
|
||||
/* Габарит читаем БАЙТАМИ. С `uint16_t pb_w = pb_img[0] | (pb_img[1] << 8)` SDCC
|
||||
* разворачивал каждую такую строку в два десятка IX-относительных
|
||||
* пересылок: 16-битные pb_w/pb_h не влезали в регистры, и функция целиком
|
||||
|
||||
Reference in New Issue
Block a user