Загрузка данных


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)))