Skip to content

Commit a4ce020

Browse files
committed
perf: 优化渲染
1 parent 908820f commit a4ce020

File tree

2 files changed

+30
-28
lines changed

2 files changed

+30
-28
lines changed

file_observer.py

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -97,16 +97,6 @@ def _entity_folders(self, folder: EntityFolder) -> list[EntityFolder]:
9797
res.extend(self._entity_folders(file))
9898
return res
9999

100-
def get_entity_folders(self) -> list[EntityFolder]:
101-
if self.root_folder is None:
102-
return []
103-
return self._entity_folders(self.root_folder)
104-
105-
def get_entity_files(self) -> list[EntityFile]:
106-
if self.root_folder is None:
107-
return []
108-
return self._entity_files(self.root_folder)
109-
110100
def get_entity_by_location(
111101
self, location_world: NumberVector
112102
) -> EntityFile | EntityFolder | None:

main.py

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -307,24 +307,8 @@ def paintEvent(self, a0: QPaintEvent | None):
307307
# 画场景物体
308308

309309
# 先画文件夹
310-
for folder_entity in self.file_observer.get_entity_folders():
311-
if folder_entity.body_shape.is_collision(self.camera.cover_world_rectangle):
312-
# 获得一个世界坐标系的视野矩形,用于排除视野之外的绘制,防止放大了之后会卡
313-
paint_folder_rect(
314-
painter,
315-
self.camera,
316-
folder_entity,
317-
folder_entity.deep_level / self.file_observer.folder_max_deep_index,
318-
)
319-
# 后画文件
320-
for file_entity in self.file_observer.get_entity_files():
321-
if file_entity.body_shape.is_collision(self.camera.cover_world_rectangle):
322-
paint_file_rect(
323-
painter,
324-
self.camera,
325-
file_entity,
326-
file_entity.deep_level / self.file_observer.folder_max_deep_index,
327-
)
310+
if self.file_observer.root_folder:
311+
self.paint_folder_dfs(painter, self.file_observer.root_folder)
328312
# 绘制选中的区域
329313
if self.file_observer.dragging_entity:
330314
paint_selected_rect(
@@ -342,6 +326,34 @@ def paintEvent(self, a0: QPaintEvent | None):
342326
f"drag locked: {self.file_observer.is_drag_locked}",
343327
],
344328
)
329+
330+
def paint_folder_dfs(self, painter: QPainter, folder_entity: EntityFolder):
331+
"""
332+
递归绘制文件夹,遇到视野之外的直接排除
333+
"""
334+
# 先绘制本体
335+
if folder_entity.body_shape.is_collision(self.camera.cover_world_rectangle):
336+
paint_folder_rect(
337+
painter,
338+
self.camera,
339+
folder_entity,
340+
folder_entity.deep_level / self.file_observer.folder_max_deep_index,
341+
)
342+
else:
343+
return
344+
# 递归绘制子文件夹
345+
for child in folder_entity.children:
346+
if isinstance(child, EntityFolder):
347+
self.paint_folder_dfs(painter, child)
348+
elif isinstance(child, EntityFile):
349+
if child.body_shape.is_collision(self.camera.cover_world_rectangle):
350+
paint_file_rect(
351+
painter,
352+
self.camera,
353+
child,
354+
child.deep_level / self.file_observer.folder_max_deep_index,
355+
)
356+
pass
345357

346358
def mousePressEvent(self, a0: QMouseEvent | None):
347359
assert a0 is not None

0 commit comments

Comments
 (0)