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:
@@ -297,6 +297,9 @@ void atlas_free(atlas_t *a);
|
||||
/* Указатель-лента idx (W0-адрес, см. ВАЖНО выше) — для gfx_blit_part
|
||||
* и ручных вызовов; кадр (i,j) ленты: sx = i*fw, sy = j*fh. */
|
||||
const void *atlas_image(const atlas_t *a, uint8_t idx);
|
||||
/* То же для страницы, УЖЕ подключённой в W0: каталог читается прямо оттуда,
|
||||
* без переключения W3. Контракт и мотивация — в теле (atlas_image_w0.c). */
|
||||
const void *atlas_image_w0(const atlas_t *a, uint8_t idx);
|
||||
|
||||
/* Инициализировать спрайт лентой idx атласа: img/w/h (размер КАДРА из
|
||||
* каталога) /page; невидим, кадр (0,0). Аналог sprite_init для W0. */
|
||||
@@ -316,7 +319,10 @@ typedef struct {
|
||||
/* Скролл региона area из НЕактивной страницы в активную со сдвигом на
|
||||
* dx/dy (0 = чистая копия/heal, >0 = в сторону увеличения координат,
|
||||
* <0 = уменьшения). Открывшуюся полосу |d| НЕ заполняют — возвращают
|
||||
* в *dirty (может быть NULL). Банк 0x50: копия = скролл + heal цели. */
|
||||
* в *dirty (может быть NULL). В safe-библиотеке область клипится по экрану;
|
||||
* при |d| >= размеру области копирования нет, вся область возвращается dirty.
|
||||
* Fast-библиотека ожидает валидные area и |d| < размер соответствующей оси.
|
||||
* Банк 0x50: копия = скролл + heal цели. */
|
||||
void gfx_scroll_h(const gfx_rect_t *area, int16_t dx, gfx_rect_t *dirty);
|
||||
void gfx_scroll_v(const gfx_rect_t *area, int16_t dy, gfx_rect_t *dirty);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user