Сделал ещё одну очевидную оптимизацию - кэширование матриц препятствий, результат превзошёл всё ожидания. 300 объектов - плавные 60 фпс, 500 объектов - 60 фпс с микрофризами. Для масштабов игры этого уже более чем достаточно. Теперь следует добиться такого же для более слабых машин, надо выбрать минимальные системные требования.

This commit is contained in:
shiva404
2026-03-06 04:00:43 +03:00
parent fa189a4c3b
commit b1548ea182
6 changed files with 529 additions and 50 deletions

View File

@@ -59,6 +59,8 @@ class Creature(Object):
replan_counter: int = 0
REPLAN_INTERVAL: int = 30000
waypoints: list = field(default_factory = list)
walkable_matrix: list = field(default_factory = list)
rocks_matrix: list = field(default_factory = list)
inventory: dict = field(default_factory = dict)
quick_actions: list = field(default_factory = list)
@@ -76,7 +78,7 @@ class Creature(Object):
def replan(self, cells, pos):
from common import find_way
path = find_way(cells, pos, self.final_goal)
path = find_way(cells, pos, self.final_goal, self.walkable_matrix, self.rocks_matrix)
if path and len(path) > 1:
self.waypoints = path[1:]
self.current_target = self.waypoints[0]
@@ -97,25 +99,37 @@ class Creature(Object):
if self.current_target is None: return
target_row, target_col = self.current_target
if (target_row in map_obj.cells and
target_col < len(map_obj.cells[target_row])):
target_cell = map_obj.cells[target_row][target_col]
if target_cell.creature_obj is not None:
self.current_target = None
self.waypoints.clear()
self.render_offset = (0.0, 0.0)
self.replan(map_obj.cells, self.start_pos)
return
#target_row, target_col = self.current_target
#if (target_row in map_obj.cells and
# target_col < len(map_obj.cells[target_row])):
# target_cell = map_obj.cells[target_row][target_col]
#if target_cell.creature_obj is not None:
# self.current_target = None
# self.waypoints.clear()
# self.render_offset = (0.0, 0.0)
# self.replan(map_obj.cells, self.start_pos)
# return
self.move_progress += self.move_speed * time_delta * 60
self.move_progress = min(self.move_progress, 1.0)
if self.move_progress >= 1.0:
map_obj.move_obj('creature_obj', self.start_pos, self.current_target)
self.grid_pos = self.current_target
if (map_obj.move_obj('creature_obj', self.start_pos, self.current_target)):
self.grid_pos = self.current_target
else:
self.current_target = None
self.waypoints.clear()
self.render_offset = (0.0, 0.0)
#если в матрице не считаем объекты, то:
#добавляем клетку в матрицу, матрицу периодически чистим
#посчитать как дорого обходится просчёт матрицы
self.replan(map_obj.cells, self.start_pos)
#тут сделать красивый переход в одну из соседних клеток
return
if self.waypoints: self.waypoints.pop(0)
if self.waypoints:
self.start_pos = self.current_target
self.current_target = self.waypoints[0]
@@ -141,7 +155,7 @@ class Creature(Object):
def move(self, cells, goal):
from common import find_way
self.final_goal = goal
path = find_way(cells, self.grid_pos, goal)
path = find_way(cells, self.grid_pos, self.final_goal, self.walkable_matrix, self.rocks_matrix)
if path and len(path) > 1:
self.waypoints = path[1:]
self.current_target = self.waypoints[0]
@@ -171,6 +185,9 @@ class Creature(Object):
#clear goal/wp
def update(self, time_delta, cell_size, map_obj):
self.walkable_matrix = map_obj.walkable_matrix
self.rocks_matrix = map_obj.rocks_matrix
#quick_actions? here?
#print(self.waypoints, self.final_goal, self.action_counter, self.task_counter)
if self.final_goal is not None: