Потоковая загрузка рельефа вне памяти: как 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), и именно это делает адресуемым всё остальное.
| Величина | Значение | Откуда |
|---|---|---|
| Тайлов в полном разрешении | 79 × 79 = 6241 | 40 000 ÷ 512 = 78,1, с округлением вверх |
| Размер тайла Float32 | 1 МиБ | 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-приложение · полностью офлайн · бесплатная бета