def draw(self, surface, camera):
zoom = camera.zoom
offset_x = camera.x
offset_y = camera.y
size = int(self.cell_size * zoom)
cell_render_size = size + 1 # Чтобы не было щелей
screen_rect = surface.get_rect()
start_x = max(0, int(-offset_x // size))
end_x = min(self.width, int((screen_rect.width - offset_x) // size) + 1)
start_y = max(0, int(-offset_y // size))
end_y = min(self.height, int((screen_rect.height - offset_y) // size) + 1)
# Оптимизация: выносим создание Rect или используем fill напрямую
# Чтобы не пересоздавать объект Rect 11000 раз, создаем его один раз
draw_rect = pygame.Rect(0, 0, cell_render_size, cell_render_size)
for y in range(start_y, end_y):
# Предварительно считаем экранную координату Y
draw_rect.y = int(y * size + offset_y)
for x in range(start_x, end_x):
draw_rect.x = int(x * size + offset_x)
color = self.cell_color[y, x]
# fill работает быстрее draw.rect
surface.fill(color, draw_rect)
# Отрисовка выделения (только если нужно)
if self.selected[y, x]:
pygame.draw.rect(surface, (255, 255, 0), draw_rect, max(2, int(1 * zoom)))