Современные дисплеи используют увеличенную плотность пикселей,
выражаемую через devicePixelRatio. На экранах Retina и
аналогичных им устройств один CSS-пиксель соответствует нескольким
физическим пикселям. Это приводит к визуальному эффекту размытости при
использовании стандартных тайлов 256×256, поскольку один логический
пиксель карты растягивается на несколько физических пикселей экрана.
Основная проблема классических тайлов заключается в том, что изображение рассчитано на стандартную плотность пикселей. При масштабировании интерфейсом браузера оно теряет резкость, особенно на текстурах, подписях и тонких линиях.
Ретина тайлы представляют собой изображения увеличенного разрешения,
чаще всего 512×512 пикселей при логическом размере 256×256. Они
маркируются суффиксом @2x:
/tiles/12/2200/1345@2x.png
или в стиле URL-шаблона:
https://tiles.example.com/{z}/{x}/{y}@2x.png
При этом карта продолжает работать с теми же координатами тайловой сетки, но получает изображение с удвоенной детализацией.
Ключевая особенность:
Библиотека MapLibre GL JS автоматически учитывает плотность пикселей устройства через параметры контекста WebGL и внутренние настройки рендера.
Основной механизм основан на значении devicePixelRatio,
которое применяется к:
В большинстве случаев библиотека самостоятельно определяет оптимальный коэффициент масштабирования, но поведение можно контролировать явно.
При использовании растровых источников (raster) важным
параметром становится tileSize.
Типовые комбинации:
tileSize: 256 — стандартные тайлыtileSize: 512 — ретина-тайлыПри использовании 512×512 тайлов карта воспринимает их как логические 256×256, что позволяет избежать масштабирования и потери качества.
Пример конфигурации источника:
map.addSource('raster-tiles', {
type: 'raster',
tiles: [
'https://tiles.example.com/{z}/{x}/{y}@2x.png'
],
tileSize: 256
});
Несмотря на фактическое разрешение 512×512, параметр
tileSize: 256 сообщает движку, что тайл следует
интерпретировать как стандартный логический размер.
В MapLibre GL JS предусмотрена поддержка автоматического учёта Retina-дисплеев через внутренние механизмы WebGL.
Поведение можно обобщить следующим образом:
devicePixelRatio = 1 → стандартное качествоdevicePixelRatio = 2 → повышенное разрешениеdevicePixelRatio > 2 → дополнительное сглаживание и
масштабированиеПри этом движок может адаптировать:
Векторные тайлы принципиально отличаются от растровых: они описывают геометрию, а не изображение. Это делает их независимыми от плотности пикселей.
При отрисовке:
Ретина-режим влияет только на:
Таким образом, векторные тайлы по своей природе «ретина-готовы» без необходимости дополнительных версий данных.
В некоторых сценариях требуется принудительное управление коэффициентом пикселей:
const map = new maplibregl.Map({
container: 'map',
style: 'https://demotiles.maplibre.org/style.json',
pixelRatio: window.devicePixelRatio
});
Такой подход позволяет:
При уменьшении pixelRatio можно снизить нагрузку на GPU,
но потерять визуальную чёткость.
При использовании DEM-данных (цифровых моделей рельефа) влияние Retina особенно заметно:
Hillshade-слои требуют дополнительного разрешения текстур, поскольку основаны на вычислении нормалей поверхности, чувствительных к пиксельной сетке.
Ретина-тайлы увеличивают объём загружаемых данных примерно в 2–4 раза, в зависимости от схемы покрытия:
Это влияет на:
Оптимизация обычно достигается через:
devicePixelRatioЧасто используется гибридный подход:
Логика выбора может реализовываться через URL-параметры:
const dpr = window.devicePixelRatio > 1 ? '@2x' : '';
map.addSource('tiles', {
type: 'raster',
tiles: [
`https://tiles.example.com/{z}/{x}/{y}${dpr}.png`
],
tileSize: 256
});
Такой подход уменьшает трафик без потери качества на устройствах, где высокая плотность пикселей отсутствует.
Увеличение devicePixelRatio приводит к росту:
Особенно критично это при:
Баланс между качеством и производительностью достигается через ограничение максимального pixelRatio или динамическое снижение качества при слабом GPU.
Типовые сценарии:
Ретина-тайлы становятся частью общей стратегии рендеринга, а не отдельной технологией, поскольку напрямую влияют на архитектуру источников данных и GPU-пайплайна.