Процедурные подземелья в Roblox: Комнаты BSP, Коридоры Делоне и Чанк-Стриминг

2026-09-29 • DopaBrain Roblox Procedural Architecture Team • DopaBrain Engineering

Featured DopaBrain Interactive Tools

Процедурная генерация — основа рогаликов и RPG в Roblox. Без грамотных алгоритмов бесконечные карты перегружают память сервера и приводят к лагам.

Используя BSP для разбиения комнат, триангуляцию Делоне для постройки коридоров и встроенный `StreamingEnabled`, можно создавать масштабные и плавные подземелья.

1. Разбиение пространства с помощью Binary Space Partitioning (BSP)

Рекурсивное деление области для предотвращения пересечений комнат:

2. Построение коридоров: Триангуляция Делоне и Остовное Дерево (MST)

Органичное соединение всех залов без тупиковых зон:

3. Трассировка коридоров и Сборка модульной геометрии

Превращение абстрактных графов в физические блоки Roblox:

ServerScriptService.Dungeon.BSPGenerator
-- Модуль разбиения пространства BSP
local BSPNode = {}
BSPNode.__index = BSPNode

function BSPNode.new(x, z, width, depth)
    local self = setmetatable({}, BSPNode)
    self.X, self.Z = x, z
    self.Width, self.Depth = width, depth
    self.LeftChild = nil
    self.RightChild = nil
    self.Room = nil
    return self
end

function BSPNode:Split(minSize)
    if self.LeftChild or self.RightChild then return false end
    local splitHorizontal = math.random() > 0.5
    if self.Width > self.Depth and (self.Width / self.Depth) >= 1.25 then
        splitHorizontal = false
    elseif self.Depth > self.Width and (self.Depth / self.Width) >= 1.25 then
        splitHorizontal = true
    end
    local maxDimension = (splitHorizontal and self.Depth or self.Width) - minSize
    if maxDimension <= minSize then return false end
    local splitPos = math.random(minSize, maxDimension)
    if splitHorizontal then
        self.LeftChild = BSPNode.new(self.X, self.Z, self.Width, splitPos)
        self.RightChild = BSPNode.new(self.X, self.Z + splitPos, self.Width, self.Depth - splitPos)
    else
        self.LeftChild = BSPNode.new(self.X, self.Z, splitPos, self.Depth)
        self.RightChild = BSPNode.new(self.X + splitPos, self.Z, self.Width - splitPos, self.Depth)
    end
    return true
end

return BSPNode

4. Управление памятью через StreamingEnabled

Стабильная работа подземелий на 100+ комнат даже на устройствах с 2 ГБ ОЗУ:

5. Синхронизация через Seed и Контроль сущностей на сервере

Честный геймплей без задержек сетевой передачи карты:

Frequently Asked Questions

Почему BSP лучше простого случайного размещения?

Случайное размещение требует тяжелых проверок столкновений и оставляет пустоты. BSP равномерно делит пространство без наложений.

Зачем совмещать триангуляцию Делоне и MST?

Делоне строит естественные связи между соседями, а MST гарантирует связность всех залов без лишней путаницы.

Как StreamingEnabled помогает подземельям?

Он подгружает только ближайшие комнаты, позволяя запускать гигантские карты даже на слабых смартфонах.

Как избежать рассинхрона карты между игроками?

Достаточно передать один и тот же сид (числовой ключ), чтобы клиент и сервер построили абсолютно одинаковый лабиринт.

Explore More Interactive Tests & Guides

Discover personalized cognitive assessments, stress evaluations, and game psychology tools on DopaBrain.

Go to Portal Hub