raiden2.cpp: Improve tilemap performance by not marking tiles dirty unless data changes

This commit is contained in:
AJR 2021-03-30 16:30:02 -04:00
parent 9cfe9342a7
commit c73aa3aa0d
2 changed files with 32 additions and 20 deletions

View File

@ -94,10 +94,10 @@ protected:
void tilemap_enable_w(offs_t offset, u16 data, u16 mem_mask = ~0); void tilemap_enable_w(offs_t offset, u16 data, u16 mem_mask = ~0);
void tile_scroll_w(offs_t offset, u16 data, u16 mem_mask = ~0); void tile_scroll_w(offs_t offset, u16 data, u16 mem_mask = ~0);
void background_w(offs_t offset, u16 data, u16 mem_mask = ~0); void background_w(offs_t offset, u16 data);
void foreground_w(offs_t offset, u16 data, u16 mem_mask = ~0); void foreground_w(offs_t offset, u16 data);
void midground_w(offs_t offset, u16 data, u16 mem_mask = ~0); void midground_w(offs_t offset, u16 data);
void text_w(offs_t offset, u16 data, u16 mem_mask = ~0); void text_w(offs_t offset, u16 data);
void m_videoram_private_w(offs_t offset, uint16_t data); void m_videoram_private_w(offs_t offset, uint16_t data);
void bank_reset(int bgbank, int fgbank, int midbank, int txbank); void bank_reset(int bgbank, int fgbank, int midbank, int txbank);

View File

@ -18,22 +18,22 @@ void raiden2_state::m_videoram_private_w(offs_t offset, uint16_t data)
if (offset < 0x800 / 2) if (offset < 0x800 / 2)
{ {
background_w(offset, data, 0xffff); background_w(offset, data);
} }
else if (offset < 0x1000 /2) else if (offset < 0x1000 /2)
{ {
offset -= 0x800 / 2; offset -= 0x800 / 2;
foreground_w(offset, data, 0xffff); foreground_w(offset, data);
} }
else if (offset < 0x1800/2) else if (offset < 0x1800/2)
{ {
offset -= 0x1000 / 2; offset -= 0x1000 / 2;
midground_w(offset, data, 0xffff); midground_w(offset, data);
} }
else if (offset < 0x2800/2) else if (offset < 0x2800/2)
{ {
offset -= 0x1800 / 2; offset -= 0x1800 / 2;
text_w(offset, data, 0xffff); text_w(offset, data);
} }
} }
@ -148,28 +148,40 @@ void raiden2_state::draw_sprites(const rectangle &cliprect)
} }
void raiden2_state::background_w(offs_t offset, u16 data, u16 mem_mask) void raiden2_state::background_w(offs_t offset, u16 data)
{ {
COMBINE_DATA(&m_back_data[offset]); if (m_back_data[offset] != data)
m_background_layer->mark_tile_dirty(offset); {
m_back_data[offset] = data;
m_background_layer->mark_tile_dirty(offset);
}
} }
void raiden2_state::midground_w(offs_t offset, u16 data, u16 mem_mask) void raiden2_state::midground_w(offs_t offset, u16 data)
{ {
COMBINE_DATA(&m_mid_data[offset]); if (m_mid_data[offset] != data)
m_midground_layer->mark_tile_dirty(offset); {
m_mid_data[offset] = data;
m_midground_layer->mark_tile_dirty(offset);
}
} }
void raiden2_state::foreground_w(offs_t offset, u16 data, u16 mem_mask) void raiden2_state::foreground_w(offs_t offset, u16 data)
{ {
COMBINE_DATA(&m_fore_data[offset]); if (m_fore_data[offset] != data)
m_foreground_layer->mark_tile_dirty(offset); {
m_fore_data[offset] = data;
m_foreground_layer->mark_tile_dirty(offset);
}
} }
void raiden2_state::text_w(offs_t offset, u16 data, u16 mem_mask) void raiden2_state::text_w(offs_t offset, u16 data)
{ {
COMBINE_DATA(&m_text_data[offset]); if (m_text_data[offset] != data)
m_text_layer->mark_tile_dirty(offset); {
m_text_data[offset] = data;
m_text_layer->mark_tile_dirty(offset);
}
} }
void raiden2_state::tilemap_enable_w(offs_t offset, u16 data, u16 mem_mask) void raiden2_state::tilemap_enable_w(offs_t offset, u16 data, u16 mem_mask)