Размышляя о том как организовать рендер с двойной буферизацией родил вот такой псевдокод ниже. Сильно смущают большие накладные расчеты. Можно конечно попробовать заменить tileGfxBuffer на связный список чтобы при отрисовке пропускать незадействованные тайлы, но не уверен что это сильно поможет.
Возможно есть элегантный и быстрый способ оргинизовать тайловый рендер, поделитесь знанием.

Код:
; =====================================================================
; data

; a pointer to tileGfx in the tileGfxBuffer
currentTileGfxPtr:
			.word TEMP_ADDR

; a table of tileGfx pointers
tileGfxPtrTable:
			.storage ROOM_TILES_W * ROOM_TILES_H * ADDR_LEN, 0

; an array of tileGfx
tileGfxBuffer:
			.storage TILE_GFX_MAX * TILE_GFX_LEN, 0

;	struct tileGfx:
;		tilePtr - a pointer to a tile in tileGfxPtrTable. if it's 0, that means tileGfx is vacant
;		tileGfxData - graphics data. if it's empty, that means this tile needs to be erased from the screen.

; =====================================================================
; tile rendering routine
currentTileGfxPtr = an address of the first tileGfx in tileGfxBuffer that has tilePtr = 0

for every visible sprite
	for an every sprite tile
		calculate a tile index N in tileGfxPtrTable
		
		if tileGfxPtrTable[N] == 0:
			tileGfxPtrTable[N] = currentTileGfxPtr
			currentTileGfxPtr->tilePtr = &tileGfxPtrTable[N]
			draw a tile w/o a mask into currentTileGfxPtr->tileGfxData
			currentTileGfxPtr = an address of the next tileGfx in tileGfxBuffer that has tilePtr = 0
		else:
			draw a tile with a mask into currentTileGfxPtr->tileGfxData

for every tileGfx in tileGfxBuffer
    if tileGfx.tilePtr == 0:
		continue
	if tileGfx.tileGfxData is not empty:
		draw tileGfxData on the screen.
	    tileGfx.tileGfxData = empty
	else:
		erase tile on the screen.
	    tileGfx->tilePtr = 0 ; set 0 a tileGfx pointer in tileGfxPtrTable
		tileGfx.tilePtr = 0
- - - Добавлено - - -

Уточню что tileGfx.tileGfxData = empty не означает стирание данных, а только маркировка их как стертых.
Структуру tileGfxData не привожу так как до конца ещё не определился, но там как минимум есть флаг говорящий что данные есть или данных нет.

- - - Добавлено - - -

Поясню как это работает если код выше не очень понятен.
У нас есть таблица адресов на структуры tileGfx.
Эта таблица имеет столько элементов сколько нужно тайлов на экране.
У нас есть массив tileGfxBuffer из элементов tileGfx.
Отрисовка состоит из двух этапов.
Первый это заполнить массив tileGfxBuffer данными спрайтов которые хотим отрисовать.
На втором этапе мы копируем данные из tileGfxBuffer на экран, или стираем с экрана старые спрайты.
Таблица tileGfxPtrTable нужна что быстрее найти элемент tileGfx в массиве tileGfxBuffer в который нужно скопировать данные спрайта.