Потоковая загрузка рельефа вне памяти: как DEM на гигабайты открывается на ноутбуке

DEM 5 см для объекта 2 км × 2 км содержит 1,6 млрд отметок — 6,4 ГБ в 32-битном формате с плавающей точкой, больше, чем у большинства видеокарт. Потоковая загрузка вне памяти (out-of-core) — инженерный ответ: хранить всю поверхность на диске в виде, который читается по частям, а в памяти держать только то, что может показать экран. В статье — как это устроено в STREAM, с числами на каждом шаге.

Шаг 1: тайловая многоуровневая копия

Исходный GeoTIFF или BigTIFF читается один раз и превращается в собственную копию: фиксированная сетка тайлов 512 × 512 с уровнями обзоров, отметки в Float32, ортофотопланы в RGBA8, хранение в тайловом BigTIFF со сжатием ZSTD. Таблица тайлов фиксирует, какие построены; копия считается готовой, только когда построены все.

Для DEM 40 000 × 40 000 это 79 × 79 = 6241 тайл в полном разрешении, ровно по 1 МиБ в Float32. Деление пополам до одного тайла добавляет семь уровней обзоров — всего 8380 тайлов. У каждого тайла фиксированный идентификатор (уровень, x, y), и именно это делает адресуемым всё остальное.

Пирамида тайлов DEM 40 000 × 40 000 при тайлах 512 × 512
ВеличинаЗначениеОткуда
Тайлов в полном разрешении79 × 79 = 624140 000 ÷ 512 = 78,1, с округлением вверх
Размер тайла Float321 МиБ512 × 512 × 4 байта
Уровней с обзорами8делением пополам от 79 тайлов до 1
Тайлов во всей пирамиде8380сумма по всем уровням
Экран 1920 × 1080≈ 7,9 тайла по пикселям2,07 млн ÷ 262 144

Шаг 2: запрашивать только то, что видит камера

В каждом кадре состояние камеры порождает набор запросов: закреплённый грубый набор на весь вид и набор детализации там, куда вы смотрите. Тайлы вне набора не декодируются, не загружаются в GPU и не хранятся.

Именно это ограничивает память. В виде 1920 × 1080 примерно столько пикселей, сколько в восьми полных тайлах; с запасом и смешением уровней рабочий набор держится в пределах десятков тайлов — десятков мегабайт, будь файл 200 МБ или 20 ГБ.

Шаг 3: декодирование вне потока отрисовки, свежее — первым

Декодирование выполняется в рабочих потоках задачами с пятью уровнями приоритета — от фонового предсказания до критического — с ограничением числа одновременных задач. Каждый запрос несёт номер поколения; когда камера ушла, старые поколения отменяются, а не дорабатываются, поэтому быстрое панорамирование не оставляет очереди тайлов, которые никто не увидит.

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

Шаг 4: вытеснение без дыр

Когда атлас GPU заполнен, вытеснение предпочитает тайлы того же или более грубого уровня, чем входящий, учитывает расстояние до фокуса камеры и защищает страницы, дающие грубую подмену. Место для деталей никогда не освобождается за счёт основы под ними.

Отметки и ортофотоплан учитываются как отдельные разреженные наборы страниц со своей резидентностью, поэтому тяжёлый ортофотоплан не может оставить рельеф без тайлов высот.

Что потоковая загрузка меняет для инженера

Затраты переносятся на первое открытие: преобразование выполняется один раз с отменяемой карточкой прогресса, после чего та же съёмка открывается за секунды. Несколько DEM одного объекта объединяются в одну виртуальную мозаику — побеждает верхний действительный пиксель, NoData пропускает нижний слой, — и анализы читают ту же мозаику, которую рисует рендер.

Сервер для этого не нужен: преобразование, потоковая загрузка и отрисовка выполняются на локальной машине с Vulkan на GPU — именно поэтому съёмку на гигабайты можно смотреть на полевом ноутбуке, никуда её не выгружая.

Частые вопросы

Что значит «вне памяти» для данных рельефа?

Набор данных хранится на диске в тайловом многоуровневом виде, а в память загружаются только части, нужные текущему виду. Память ограничивает экран, а не размер файла.

Сколько тайлов в DEM 40 000 × 40 000?

При тайлах 512 × 512 — 79 × 79 = 6241 в полном разрешении, по 1 МиБ в Float32, и 8380 вместе с семью уровнями обзоров.

Почему первое открытие дольше?

Потому что исход один раз преобразуется в собственную тайловую копию с уровнями обзоров. Дальше рендер читает тайлы прямо из копии, и повторное открытие занимает секунды.

Посмотрите потоковую загрузку рельефа в STREAM

Нативное Windows-приложение · полностью офлайн · бесплатная бета

Потоковая загрузка рельефа