Сделал ещё одну очевидную оптимизацию - кэширование матриц препятствий, результат превзошёл всё ожидания. 300 объектов - плавные 60 фпс, 500 объектов - 60 фпс с микрофризами. Для масштабов игры этого уже более чем достаточно. Теперь следует добиться такого же для более слабых машин, надо выбрать минимальные системные требования.
This commit is contained in:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user