Skip to content

Commit 65d5c60

Browse files
committed
perf(map): eliminate redundant PNG serialization in Q10 rendering pipeline
1 parent bf7dd50 commit 65d5c60

2 files changed

Lines changed: 14 additions & 7 deletions

File tree

‎roborock/map/b01_q10_map_parser.py‎

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -801,8 +801,8 @@ def parse_packet(self, packet: Q10MapPacket) -> ParsedMapData:
801801
"""
802802
return self.parsed_from_packet(packet)
803803

804-
def parsed_from_packet(self, packet: Q10MapPacket) -> ParsedMapData:
805-
"""Render a (possibly erase-modified) packet into a PNG + ``MapData``."""
804+
def map_data_from_packet(self, packet: Q10MapPacket) -> MapData:
805+
"""Build MapData with a rendered base image, without PNG serialization."""
806806
image = self._render(packet)
807807

808808
map_data = MapData()
@@ -830,8 +830,14 @@ def parsed_from_packet(self, packet: Q10MapPacket) -> ParsedMapData:
830830
if packet.carpet_mask is not None:
831831
map_data.carpet_map = {i for i, value in enumerate(packet.carpet_mask) if value}
832832

833+
return map_data
834+
835+
def parsed_from_packet(self, packet: Q10MapPacket) -> ParsedMapData:
836+
"""Render a (possibly erase-modified) packet into a PNG + ``MapData``."""
837+
map_data = self.map_data_from_packet(packet)
833838
image_bytes = io.BytesIO()
834-
image.save(image_bytes, format=_MAP_FILE_FORMAT)
839+
if map_data.image is not None:
840+
map_data.image.data.save(image_bytes, format=_MAP_FILE_FORMAT)
835841
return ParsedMapData(image_content=image_bytes.getvalue(), map_data=map_data)
836842

837843
def _render(self, packet: Q10MapPacket) -> Image.Image:

‎roborock/map/b01_q10_render.py‎

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,10 +109,9 @@ def render_q10_map(
109109
# areas disappear (as the app shows).
110110
render_packet = erased_packet(packet, cells)
111111

112-
parsed = parser.parsed_from_packet(render_packet)
113-
if parsed.image_content is None or parsed.map_data is None:
112+
map_data = parser.map_data_from_packet(render_packet)
113+
if map_data.image is None:
114114
raise RoborockException("Failed to render Q10 map image")
115-
map_data = parsed.map_data
116115

117116
has_drawables = False
118117
if trace_calibration is not None and trace is not None:
@@ -128,7 +127,9 @@ def render_q10_map(
128127
if has_drawables:
129128
return _draw_map_content(map_data, config=config)
130129

131-
return parsed.image_content
130+
buffer = io.BytesIO()
131+
map_data.image.data.save(buffer, format="PNG")
132+
return buffer.getvalue()
132133

133134

134135
def solve_q10_calibration(

0 commit comments

Comments
 (0)