From b1548ea182f9c5688e74194529beb2df208c84b8 Mon Sep 17 00:00:00 2001 From: shiva404 Date: Fri, 6 Mar 2026 04:00:43 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20=D0=B5?= =?UTF-8?q?=D1=89=D1=91=20=D0=BE=D0=B4=D0=BD=D1=83=20=D0=BE=D1=87=D0=B5?= =?UTF-8?q?=D0=B2=D0=B8=D0=B4=D0=BD=D1=83=D1=8E=20=D0=BE=D0=BF=D1=82=D0=B8?= =?UTF-8?q?=D0=BC=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8E=20-=20=D0=BA=D1=8D?= =?UTF-8?q?=D1=88=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BC?= =?UTF-8?q?=D0=B0=D1=82=D1=80=D0=B8=D1=86=20=D0=BF=D1=80=D0=B5=D0=BF=D1=8F?= =?UTF-8?q?=D1=82=D1=81=D1=82=D0=B2=D0=B8=D0=B9,=20=D1=80=D0=B5=D0=B7?= =?UTF-8?q?=D1=83=D0=BB=D1=8C=D1=82=D0=B0=D1=82=20=D0=BF=D1=80=D0=B5=D0=B2?= =?UTF-8?q?=D0=B7=D0=BE=D1=88=D1=91=D0=BB=20=D0=B2=D1=81=D1=91=20=D0=BE?= =?UTF-8?q?=D0=B6=D0=B8=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F.=20300=20=D0=BE?= =?UTF-8?q?=D0=B1=D1=8A=D0=B5=D0=BA=D1=82=D0=BE=D0=B2=20-=20=D0=BF=D0=BB?= =?UTF-8?q?=D0=B0=D0=B2=D0=BD=D1=8B=D0=B5=2060=20=D1=84=D0=BF=D1=81,=20500?= =?UTF-8?q?=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA=D1=82=D0=BE=D0=B2=20-=2060=20?= =?UTF-8?q?=D1=84=D0=BF=D1=81=20=D1=81=20=D0=BC=D0=B8=D0=BA=D1=80=D0=BE?= =?UTF-8?q?=D1=84=D1=80=D0=B8=D0=B7=D0=B0=D0=BC=D0=B8.=20=D0=94=D0=BB?= =?UTF-8?q?=D1=8F=20=D0=BC=D0=B0=D1=81=D1=88=D1=82=D0=B0=D0=B1=D0=BE=D0=B2?= =?UTF-8?q?=20=D0=B8=D0=B3=D1=80=D1=8B=20=D1=8D=D1=82=D0=BE=D0=B3=D0=BE=20?= =?UTF-8?q?=D1=83=D0=B6=D0=B5=20=D0=B1=D0=BE=D0=BB=D0=B5=D0=B5=20=D1=87?= =?UTF-8?q?=D0=B5=D0=BC=20=D0=B4=D0=BE=D1=81=D1=82=D0=B0=D1=82=D0=BE=D1=87?= =?UTF-8?q?=D0=BD=D0=BE.=20=D0=A2=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20=D1=81?= =?UTF-8?q?=D0=BB=D0=B5=D0=B4=D1=83=D0=B5=D1=82=20=D0=B4=D0=BE=D0=B1=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=D1=81=D1=8F=20=D1=82=D0=B0=D0=BA=D0=BE=D0=B3=D0=BE?= =?UTF-8?q?=20=D0=B6=D0=B5=20=D0=B4=D0=BB=D1=8F=20=D0=B1=D0=BE=D0=BB=D0=B5?= =?UTF-8?q?=D0=B5=20=D1=81=D0=BB=D0=B0=D0=B1=D1=8B=D1=85=20=D0=BC=D0=B0?= =?UTF-8?q?=D1=88=D0=B8=D0=BD,=20=D0=BD=D0=B0=D0=B4=D0=BE=20=D0=B2=D1=8B?= =?UTF-8?q?=D0=B1=D1=80=D0=B0=D1=82=D1=8C=20=D0=BC=D0=B8=D0=BD=D0=B8=D0=BC?= =?UTF-8?q?=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D0=B5=20=D1=81=D0=B8=D1=81=D1=82?= =?UTF-8?q?=D0=B5=D0=BC=D0=BD=D1=8B=D0=B5=20=D1=82=D1=80=D0=B5=D0=B1=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common.py | 226 ++++++++++++++++++++++++++++++++++++++++++++---- def_map.json | 8 +- eb_engine.py | 63 ++++++++++---- eb_objects.py | 45 +++++++--- f.txt | 231 ++++++++++++++++++++++++++++++++++++++++++++++++++ plan.txt | 6 +- 6 files changed, 529 insertions(+), 50 deletions(-) create mode 100644 f.txt diff --git a/common.py b/common.py index 73f0083..8cd41ab 100644 --- a/common.py +++ b/common.py @@ -26,6 +26,12 @@ def path_exists(data, path): return False return True + +def find_way(cells, start, goal, walkable, rocks_only): + result = bfs_quick(cells, start, goal, walkable, rocks_only) + return result + +''' #def find_way(cells, start, goal): # """Находит путь от start=(row, col) к goal=(row, col). row=y (строка), col=x (столбец)""" # rows = len(cells) @@ -289,8 +295,9 @@ def path_exists(data, path): # # return path +''' -def find_way(cells, start, goal): +def bfs_quick(cells, start, goal, walkable, rocks_only): """★СУПЕРБЫСТРЫЙ BFS: массивы вместо set/deque★""" rows = len(cells) if rows == 0: @@ -303,22 +310,22 @@ def find_way(cells, start, goal): if (s_row >= rows or s_col >= cols or g_row >= rows or g_col >= cols): - print(f"Путь не найден: выход за границы {start} -> {goal}") + #print(f"Путь не найден: выход за границы {start} -> {goal}") return None - # ★ МАТРИЦЫ вместо set (10x быстрее хэширования) ★ - walkable = [[True] * cols for _ in range(rows)] - rocks_only = [[False] * cols for _ in range(rows)] - start_creature = cells[s_row][s_col].creature_obj - - for r in range(rows): - for c in range(cols): - cell = cells[r][c] - if (cell.creature_obj and cell.creature_obj != start_creature) or \ - (cell.terrain_obj and cell.terrain_obj.sprite_name == "rock_small"): - walkable[r][c] = False - if cell.terrain_obj and cell.terrain_obj.sprite_name == "rock_small": - rocks_only[r][c] = True + ## ★ МАТРИЦЫ вместо set (10x быстрее хэширования) ★ + #walkable = [[True] * cols for _ in range(rows)] + #rocks_only = [[False] * cols for _ in range(rows)] + #start_creature = cells[s_row][s_col].creature_obj + # + #for r in range(rows): + # for c in range(cols): + # cell = cells[r][c] + # if (cell.creature_obj and cell.creature_obj != start_creature) or \ + # (cell.terrain_obj and cell.terrain_obj.sprite_name == "rock_small"): + # walkable[r][c] = False + # if cell.terrain_obj and cell.terrain_obj.sprite_name == "rock_small": + # rocks_only[r][c] = True # ★ ВЫЧИСЛЯЕМЫЕ МАССИВЫ ★ visited = [[False] * cols for _ in range(rows)] @@ -380,4 +387,191 @@ def can_move_diagonal(r, c, nr, nc, rocks_only, rows, cols): check1_ok = (0 <= r1 < rows and 0 <= c1 < cols and not rocks_only[r1][c1]) check2_ok = (0 <= r2 < rows and 0 <= c2 < cols and not rocks_only[r2][c2]) - return check1_ok and check2_ok \ No newline at end of file + return check1_ok and check2_ok + +''' +#def bfs_quick_d(obstacle_matrix, start, goal): +# rows = len(obstacle_matrix) +# if rows == 0: +# print("❌ DEBUG: ПУСТАЯ МАТРИЦА") +# return None +# +# cols = len(obstacle_matrix[0]) +# s_row, s_col = start +# g_row, g_col = goal +# +# print(f"🔍 DEBUG: start={start}, goal={goal}, размер={rows}x{cols}") +# +# if (s_row >= rows or s_col >= cols or +# g_row >= rows or g_col >= cols): +# print(f"❌ DEBUG: ВЫХОД ЗА ГРАНИЦЫ: start({s_row},{s_col}) goal({g_row},{g_col})") +# return None +# +# print(f"✅ DEBUG: Границы OK. obstacle[start]={obstacle_matrix[s_row][s_col]}, obstacle[goal]={obstacle_matrix[g_row][g_col]}") +# +# visited = [[False] * cols for _ in range(rows)] +# parent = [[None] * cols for _ in range(rows)] +# +# queue_size = 0 +# queue = [[0, 0] for _ in range(rows * cols)] +# queue[0] = [s_row, s_col] +# queue_size = 1 +# front = 0 +# +# visited[s_row][s_col] = True +# print(f"✅ DEBUG: Старт добавлен в очередь. queue_size={queue_size}") +# +# directions = [(-1,0), (1,0), (0,-1), (0,1), (-1,-1), (-1,1), (1,-1), (1,1)] +# +# DEBUG_COUNTER = 0 +# +# while front < queue_size: +# r, c = queue[front] +# front += 1 +# DEBUG_COUNTER += 1 +# +# print(f"🔄 DEBUG[{DEBUG_COUNTER}]: обрабатываем ({r},{c}), очередь={front}/{queue_size}") +# +# if r == g_row and c == g_col: +# print(f"✅ DEBUG: НАЙДЕН ЦЕЛЬ! Путь: ({r},{c})") +# path = [] +# cr, cc = g_row, g_col +# while True: +# path.append((cr, cc)) +# if parent[cr][cc] is None: +# break +# pr, pc = parent[cr][cc] +# cr, cc = pr, pc +# return path[::-1] +# +# for dr, dc in directions: +# nr, nc = r + dr, c + dc +# +# print(f" 📍 Проверяем соседа ({nr},{nc}): граница={0<=nr 0 else 'ПУСТО'}") +# print(f" Цель ({g_row},{g_col}) помечена как visited? {visited[g_row][g_col]}") +# return None +# +# +#def bfs_quick(obstacle_matrix, start, goal): +# """★СУПЕРБЫСТРЫЙ BFS 8-направлений★ +# obstacle_matrix - ТОЛЬКО камни +# """ +# rows = len(obstacle_matrix) +# if rows == 0: +# return None +# +# cols = len(obstacle_matrix[0]) +# s_row, s_col = start +# g_row, g_col = goal +# +# if (s_row >= rows or s_col >= cols or +# g_row >= rows or g_col >= cols): +# return None +# +# # ★ МАТРИЦЫ состояния ★ +# visited = [[False] * cols for _ in range(rows)] +# parent = [[None] * cols for _ in range(rows)] +# +# # ★ БЫСТРАЯ ОЧЕРЕДЬ ★ +# queue_size = 0 +# queue = [[0, 0] for _ in range(rows * cols)] +# queue[0] = [s_row, s_col] +# queue_size = 1 +# front = 0 +# +# visited[s_row][s_col] = True +# +# # ★ 8 НАПРАВЛЕНИЙ ★ +# directions = [(-1,0), (1,0), (0,-1), (0,1), # Кардинальные (всегда) +# (-1,-1), (-1,1), (1,-1), (1,1)] # Диагональные +# +# while front < queue_size: +# r, c = queue[front] +# front += 1 +# +# if r == g_row and c == g_col: +# # ★ Реконструкция пути ★ +# path = [] +# cr, cc = g_row, g_col +# while True: +# path.append((cr, cc)) +# if parent[cr][cc] is None: +# break +# pr, pc = parent[cr][cc] +# cr, cc = pr, pc +# return path[::-1] +# +# for dr, dc in directions: +# nr, nc = r + dr, c + dc +# +# if not (0 <= nr < rows and 0 <= nc < cols): +# continue +# if visited[nr][nc] or obstacle_matrix[nr][nc]: +# continue +# +# diagonal_ok = True +# if dr * dc != 0: +# diagonal_ok = can_move_diagonal(r, c, nr, nc, obstacle_matrix) +# if diagonal_ok: +# visited[nr][nc] = True +# parent[nr][nc] = (r, c) +# queue[queue_size] = [nr, nc] +# queue_size += 1 +# +# return None +''' +#def can_move_diagonal(r, c, nr, nc, obstacle_matrix): +# """Диагональ БЛОКИРУЕТСЯ только камнями по углам""" +# rows, cols = len(obstacle_matrix), len(obstacle_matrix[0]) +# dr = nr - r +# dc = nc - c +# +# r1, c1 = r + dr, c # Вертикальная соседка +# r2, c2 = r, c + dc # Горизонтальная соседка +# +# check1_ok = (0 <= r1 < rows and 0 <= c1 < cols and not obstacle_matrix[r1][c1]) +# check2_ok = (0 <= r2 < rows and 0 <= c2 < cols and not obstacle_matrix[r2][c2]) +# +# return check1_ok and check2_ok + +#def can_move_diagonal(r, c, nr, nc, obstacle_matrix): +# """Проверка диагонали с границами""" +# rows, cols = len(obstacle_matrix), len(obstacle_matrix[0]) +# dr = nr - r +# dc = nc - c +# +# # ★ ПРОВЕРКА ГРАНИЦ ПОПЕРЕДУ ★ +# r1, c1 = r + dr, c # вертикальная +# r2, c2 = r, c + dc # горизонтальная +# +# # Если УЖЕ за границей - False +# if not (0 <= r1 < rows and 0 <= c1 < cols): +# return False +# if not (0 <= r2 < rows and 0 <= c2 < cols): +# return False +# +# return not obstacle_matrix[r1][c1] and not obstacle_matrix[r2][c2] \ No newline at end of file diff --git a/def_map.json b/def_map.json index 4aadc5c..f0a9517 100644 --- a/def_map.json +++ b/def_map.json @@ -11,7 +11,9 @@ "name": "2", "sprite_name": "sword_default" }, - "creature_obj": {} + "creature_obj": {"id": "1", + "name": "2", + "sprite_name": "elf_watching"} }, { "terrain_obj": { @@ -20,7 +22,9 @@ "sprite_name": "grass_small" }, "item_obj": {}, - "creature_obj": {} + "creature_obj": {"id": "1", + "name": "2", + "sprite_name": "elf_watching"} }, { "terrain_obj": { diff --git a/eb_engine.py b/eb_engine.py index dc08499..d67a861 100644 --- a/eb_engine.py +++ b/eb_engine.py @@ -38,6 +38,8 @@ class Map: sprites: dict sprites_refresh: int = 60 cells: dict = field(default_factory = dict) + walkable_matrix: list = field(default_factory = list) + rocks_matrix: list = field(default_factory = list) color: str = "gray57" target_color: str = "gold" cell_size: int = 150 @@ -66,7 +68,16 @@ class Map: final_cell.creature_obj = cell_classes[cell["creature_obj"]["sprite_name"]](**cell["creature_obj"]) final_cell.creature_obj.grid_pos = (line, col) - self.cells[line].append(final_cell) + self.cells[line].append(final_cell) + + self.compute_walkable_rocks() + for j in range(len(self.cells)): + for cell in self.cells[j]: + if cell.creature_obj: + cell.creature_obj.walkable_matrix = self.walkable_matrix + cell.creature_obj.rocks_matrix = self.rocks_matrix + + def move_obj(self, type, start, goal): """Перемещает объект типа 'terrain_obj', 'item_obj' или 'creature_obj' @@ -114,10 +125,36 @@ class Map: return (row, col) def update_map(self, time_delta): + self.compute_walkable_rocks() for j in range(len(self.cells)): for cell in self.cells[j]: if cell.creature_obj: - cell.creature_obj.update(time_delta, self.cell_size, self) # self! + cell.creature_obj.update(time_delta, self.cell_size, self) + + def compute_walkable_rocks(self): + """Вычисляет матрицы walkable и rocks_only БЕЗ учета стартовой позиции""" + rows = len(self.cells) + if rows == 0: + return None, None + + cols = len(self.cells[0]) + + # ★ ИНИЦИАЛИЗАЦИЯ ★ + self.walkable_matrix = [[True] * cols for _ in range(rows)] + self.rocks_matrix = [[False] * cols for _ in range(rows)] + + # ★ ПОЛНЫЙ ПРОХОД ПО КАРТЕ ★ + for r in range(rows): + for c in range(cols): + cell = self.cells[r][c] + # Запрещаем ВСЕ существа (включая стартовое!) + if cell.creature_obj or \ + (cell.terrain_obj and cell.terrain_obj.sprite_name == "rock_small"): + self.walkable_matrix[r][c] = False + + # Отмечаем маленькие камни + if cell.terrain_obj and cell.terrain_obj.sprite_name == "rock_small": + self.rocks_matrix[r][c] = True # def draw_map(self, screen, current_frame, grid=True): # terrain_list = [] @@ -168,7 +205,6 @@ class Map: # color = self.target_color if cell.is_target else self.color # pygame.draw.rect(screen, color, grid_rect, self.bord) - def draw_map(self, screen, current_frame, grid=True): screen_rect = screen.get_rect() terrain_list = [] @@ -238,9 +274,6 @@ class Map: pygame.draw.rect(screen, color, grid_rect, self.bord) - - - @dataclass class Engine: sprites: dict = field(default_factory = dict) @@ -328,14 +361,6 @@ class Engine: def main_loop(self): easy_map = Map("def_map.json", self.cached_sprites) - #print(easy_map.find_way((1, 1), (5, 5))) - #print(easy_map.find_way((0, 0), (1, 1))) - #print(easy_map.find_way((0, 0), (0, 1))) - #print(easy_map.find_way((0, 0), (0, 0))) - - #sp = eb_objects.Sprite(self.sprites, "elf_watching") - #gr = pygame.image.load(file_path).convert_alpha() - background = pygame.Surface((1600, 800)) background.fill("chartreuse4") @@ -380,7 +405,12 @@ class Engine: col < len(easy_map.cells[row]) and easy_map.cells[row][col].creature_obj is None): - elf = eb_objects.Creature(id=f"elf_{random.randint(1000,9999)}", name="Elf", sprite_name="elf_watching", grid_pos = pos) + elf = eb_objects.Creature(id=f"elf_{random.randint(1000,9999)}", + name="Elf", sprite_name="elf_watching", + grid_pos = pos, + walkable_matrix = easy_map.walkable_matrix, + rocks_matrix = easy_map.rocks_matrix) + r_move_short = eb_objects.Action(sprite_name="elf_watching", func=partial(elf.patrol, easy_map.cells, 3), duration=0.01) r_move_long = eb_objects.Action(sprite_name="elf_watching", func=partial(elf.move_rand, easy_map.cells, 0, 99), duration=0.01) elf.tasks.append([r_move_short]*5 + [r_move_long]) @@ -514,8 +544,7 @@ class Engine: cell_coords = easy_map.get_cell_at_mouse(mouse_pos) if cell_coords: #print(f"Движение: {active_cell} -> {cell_coords}") - easy_map.cells[active_cell[0]][active_cell[1]].creature_obj.move( - easy_map.cells, cell_coords) + easy_map.cells[active_cell[0]][active_cell[1]].creature_obj.move(easy_map.cells, cell_coords) if keys[pygame.K_ESCAPE]: running = False diff --git a/eb_objects.py b/eb_objects.py index 915ae48..d11d52a 100644 --- a/eb_objects.py +++ b/eb_objects.py @@ -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: diff --git a/f.txt b/f.txt new file mode 100644 index 0000000..6015a7f --- /dev/null +++ b/f.txt @@ -0,0 +1,231 @@ +Elves count: 500 - Current FPS: 58.82 +Elves count: 500 - Current FPS: 54.35 +Elves count: 500 - Current FPS: 57.14 +Elves count: 500 - Current FPS: 55.56 +Elves count: 500 - Current FPS: 58.14 +Elves count: 500 - Current FPS: 54.95 +Elves count: 500 - Current FPS: 61.35 +Elves count: 500 - Current FPS: 58.14 +Elves count: 500 - Current FPS: 61.73 +Elves count: 500 - Current FPS: 45.87 +Elves count: 500 - Current FPS: 54.35 +Elves count: 500 - Current FPS: 58.48 +Elves count: 500 - Current FPS: 59.52 +Elves count: 500 - Current FPS: 58.48 +Elves count: 500 - Current FPS: 50.51 +Elves count: 500 - Current FPS: 55.25 +Elves count: 500 - Current FPS: 52.36 +Elves count: 500 - Current FPS: 53.76 +Elves count: 500 - Current FPS: 52.36 +Elves count: 500 - Current FPS: 49.02 +Elves count: 500 - Current FPS: 61.73 +Elves count: 500 - Current FPS: 57.80 +Elves count: 500 - Current FPS: 59.52 +Elves count: 500 - Current FPS: 54.64 +Elves count: 500 - Current FPS: 54.95 +Elves count: 500 - Current FPS: 59.52 +Elves count: 500 - Current FPS: 59.52 +Elves count: 500 - Current FPS: 60.24 +Elves count: 500 - Current FPS: 61.73 +Elves count: 500 - Current FPS: 44.05 +Elves count: 500 - Current FPS: 58.82 +Elves count: 500 - Current FPS: 54.05 +Elves count: 500 - Current FPS: 55.56 +Elves count: 500 - Current FPS: 58.82 +Elves count: 500 - Current FPS: 49.50 +Elves count: 500 - Current FPS: 56.18 +Elves count: 500 - Current FPS: 58.82 +Elves count: 500 - Current FPS: 57.47 +Elves count: 500 - Current FPS: 34.13 +Elves count: 500 - Current FPS: 48.54 +Elves count: 500 - Current FPS: 54.64 +Elves count: 500 - Current FPS: 60.24 +Elves count: 500 - Current FPS: 57.14 +Elves count: 500 - Current FPS: 56.50 +Elves count: 500 - Current FPS: 50.00 +Elves count: 500 - Current FPS: 60.98 +Elves count: 500 - Current FPS: 59.88 +Elves count: 500 - Current FPS: 58.82 +Elves count: 500 - Current FPS: 43.10 +Leak: 2232.0 KB per 1000 frames +Elves count: 500 - Current FPS: 50.25 +Elves count: 500 - Current FPS: 41.67 +Elves count: 500 - Current FPS: 57.80 +Elves count: 500 - Current FPS: 45.25 +Elves count: 500 - Current FPS: 49.50 +Elves count: 500 - Current FPS: 58.48 +Elves count: 500 - Current FPS: 56.18 +Elves count: 500 - Current FPS: 52.63 +Elves count: 500 - Current FPS: 49.02 +Elves count: 500 - Current FPS: 57.47 +Elves count: 500 - Current FPS: 55.56 +Elves count: 500 - Current FPS: 56.18 +Elves count: 500 - Current FPS: 55.56 +Elves count: 500 - Current FPS: 59.52 +Elves count: 500 - Current FPS: 60.24 +Elves count: 500 - Current FPS: 57.47 +Elves count: 500 - Current FPS: 60.61 +Elves count: 500 - Current FPS: 60.61 +Elves count: 500 - Current FPS: 46.30 +Elves count: 500 - Current FPS: 58.82 +Elves count: 500 - Current FPS: 59.52 +Elves count: 500 - Current FPS: 54.35 +Elves count: 500 - Current FPS: 59.17 +Elves count: 500 - Current FPS: 54.95 +Elves count: 500 - Current FPS: 54.64 +Elves count: 500 - Current FPS: 48.08 +Elves count: 500 - Current FPS: 41.49 +Elves count: 500 - Current FPS: 54.35 +Elves count: 500 - Current FPS: 56.50 +Elves count: 500 - Current FPS: 60.24 +Elves count: 500 - Current FPS: 61.35 +Elves count: 500 - Current FPS: 59.17 +Elves count: 500 - Current FPS: 50.25 +Elves count: 500 - Current FPS: 60.98 +Elves count: 500 - Current FPS: 52.63 +Elves count: 500 - Current FPS: 57.80 +Elves count: 500 - Current FPS: 54.05 +Elves count: 500 - Current FPS: 51.28 +Elves count: 500 - Current FPS: 52.08 +Elves count: 500 - Current FPS: 59.52 +Elves count: 500 - Current FPS: 61.73 +Elves count: 500 - Current FPS: 54.05 +Elves count: 500 - Current FPS: 59.17 +Elves count: 500 - Current FPS: 54.64 +Elves count: 500 - Current FPS: 50.51 +Elves count: 500 - Current FPS: 51.28 +Elves count: 500 - Current FPS: 59.52 +Elves count: 500 - Current FPS: 59.52 +Elves count: 500 - Current FPS: 60.61 +Elves count: 500 - Current FPS: 51.28 +Elves count: 500 - Current FPS: 60.98 +Elves count: 500 - Current FPS: 57.47 +Elves count: 500 - Current FPS: 52.63 +Elves count: 500 - Current FPS: 50.00 +Elves count: 500 - Current FPS: 59.88 +Elves count: 500 - Current FPS: 54.95 +Elves count: 500 - Current FPS: 58.14 +Elves count: 500 - Current FPS: 45.45 +Elves count: 500 - Current FPS: 52.91 +Elves count: 500 - Current FPS: 32.57 +Elves count: 500 - Current FPS: 29.07 +Elves count: 500 - Current FPS: 45.25 +Elves count: 500 - Current FPS: 30.03 +Elves count: 500 - Current FPS: 45.66 +Elves count: 500 - Current FPS: 43.86 +Elves count: 500 - Current FPS: 38.91 +Elves count: 500 - Current FPS: 35.97 +Elves count: 500 - Current FPS: 34.01 +Elves count: 500 - Current FPS: 44.84 +Elves count: 500 - Current FPS: 36.63 +Elves count: 500 - Current FPS: 39.84 +Elves count: 500 - Current FPS: 42.55 +Elves count: 500 - Current FPS: 31.65 +Elves count: 500 - Current FPS: 30.96 +Elves count: 500 - Current FPS: 37.59 +Elves count: 500 - Current FPS: 39.53 +Elves count: 500 - Current FPS: 45.87 +Elves count: 500 - Current FPS: 37.31 +Elves count: 500 - Current FPS: 35.34 +Elves count: 500 - Current FPS: 39.22 +Elves count: 500 - Current FPS: 47.17 +Elves count: 500 - Current FPS: 39.37 +Elves count: 500 - Current FPS: 25.25 +Elves count: 500 - Current FPS: 35.97 +Elves count: 500 - Current FPS: 48.54 +Elves count: 500 - Current FPS: 44.64 +Elves count: 500 - Current FPS: 43.67 +Elves count: 500 - Current FPS: 28.17 +Elves count: 500 - Current FPS: 35.97 +Elves count: 500 - Current FPS: 31.06 +Elves count: 500 - Current FPS: 47.62 +Elves count: 500 - Current FPS: 37.59 +Elves count: 500 - Current FPS: 42.19 +Elves count: 500 - Current FPS: 50.25 +Elves count: 500 - Current FPS: 35.59 +Elves count: 500 - Current FPS: 45.45 +Elves count: 500 - Current FPS: 45.45 +Elves count: 500 - Current FPS: 28.65 +Elves count: 500 - Current FPS: 24.15 +Elves count: 500 - Current FPS: 42.55 +Leak: 3284.0 KB per 1000 frames +Elves count: 500 - Current FPS: 42.19 +Elves count: 500 - Current FPS: 35.09 +Elves count: 500 - Current FPS: 42.19 +Elves count: 500 - Current FPS: 51.55 +Elves count: 500 - Current FPS: 32.36 +Elves count: 500 - Current FPS: 39.22 +Elves count: 500 - Current FPS: 35.59 +Elves count: 500 - Current FPS: 28.57 +Elves count: 500 - Current FPS: 22.73 +Elves count: 500 - Current FPS: 31.85 +Elves count: 500 - Current FPS: 26.74 +Elves count: 500 - Current FPS: 24.94 +Elves count: 500 - Current FPS: 22.08 +Elves count: 500 - Current FPS: 24.51 +Elves count: 500 - Current FPS: 34.97 +Elves count: 500 - Current FPS: 30.40 +Elves count: 500 - Current FPS: 47.62 +Elves count: 500 - Current FPS: 40.16 +Elves count: 500 - Current FPS: 55.87 +Elves count: 500 - Current FPS: 33.78 +Elves count: 500 - Current FPS: 50.00 +Elves count: 500 - Current FPS: 50.51 +Elves count: 500 - Current FPS: 33.00 +Elves count: 500 - Current FPS: 54.64 +Elves count: 500 - Current FPS: 61.35 +Elves count: 500 - Current FPS: 51.02 +Elves count: 500 - Current FPS: 54.35 +Elves count: 500 - Current FPS: 50.51 +Elves count: 500 - Current FPS: 53.19 +Elves count: 500 - Current FPS: 53.76 +Elves count: 500 - Current FPS: 39.37 +Elves count: 500 - Current FPS: 49.50 +Elves count: 500 - Current FPS: 60.24 +Elves count: 500 - Current FPS: 47.17 +Elves count: 500 - Current FPS: 54.64 +Elves count: 500 - Current FPS: 60.61 +Elves count: 500 - Current FPS: 56.50 +Elves count: 500 - Current FPS: 58.48 +Elves count: 500 - Current FPS: 58.82 +Elves count: 500 - Current FPS: 52.36 +Elves count: 500 - Current FPS: 57.47 +Elves count: 500 - Current FPS: 61.73 +Elves count: 500 - Current FPS: 60.61 +Elves count: 500 - Current FPS: 39.06 +Elves count: 500 - Current FPS: 51.55 +Elves count: 500 - Current FPS: 56.82 +Elves count: 500 - Current FPS: 59.52 +Elves count: 500 - Current FPS: 54.64 +Elves count: 500 - Current FPS: 54.95 +Elves count: 500 - Current FPS: 56.50 +Elves count: 500 - Current FPS: 52.63 +Elves count: 500 - Current FPS: 59.17 +Elves count: 500 - Current FPS: 55.56 +Elves count: 500 - Current FPS: 58.82 +Elves count: 500 - Current FPS: 55.87 +Elves count: 500 - Current FPS: 48.08 +Elves count: 500 - Current FPS: 60.24 +Elves count: 500 - Current FPS: 51.55 +Elves count: 500 - Current FPS: 58.14 +Elves count: 500 - Current FPS: 57.14 +Elves count: 500 - Current FPS: 47.85 +Elves count: 500 - Current FPS: 50.00 +Elves count: 500 - Current FPS: 47.62 +Elves count: 500 - Current FPS: 56.18 +Elves count: 500 - Current FPS: 55.56 +Elves count: 500 - Current FPS: 53.48 +Elves count: 500 - Current FPS: 52.91 +Elves count: 500 - Current FPS: 60.98 +Elves count: 500 - Current FPS: 57.14 +Elves count: 500 - Current FPS: 34.60 +Elves count: 500 - Current FPS: 41.84 +Elves count: 500 - Current FPS: 59.88 +Elves count: 500 - Current FPS: 49.75 +Elves count: 500 - Current FPS: 47.62 +Elves count: 500 - Current FPS: 50.51 +Elves count: 500 - Current FPS: 35.97 +Elves count: 500 - Current FPS: 57.47 +Elves count: 500 - Current FPS: 55.56 +Elves count: 500 - Current FPS: 45.25 +Elves count: 500 - Current FPS: 35.59 \ No newline at end of file diff --git a/plan.txt b/plan.txt index 0aa803b..2f28281 100644 --- a/plan.txt +++ b/plan.txt @@ -19,4 +19,8 @@ - сделать фундамент для MapManager, пока не развивать, но надо исходить из того что одновременно может рендериться несколько карт; -3. Оптимизация. \ No newline at end of file +3. Оптимизация. + - проверяем, есть ли объект в клетке только перед непосредственным перемещением в ячейку + Cells, а не каждый calc_step; + (исправить визуальный баг, см комменты calc_step) + - перестаём учитывать объекты в алгоритме поиска пути; - (попробовать ещё раз, подумать) + - заранее передаем в алгоритм карту препятствий; + \ No newline at end of file