PlayCanvas — это мощная платформа для создания 3D-приложений, игр и визуализаций, использующая WebGL. Один из аспектов, с которым разработчики сталкиваются при разработке графики для разных устройств, — это адаптация к различным типам дисплеев, особенно к retina-экранам. На таких устройствах необходимо учитывать плотность пикселей (pixel ratio), чтобы обеспечить корректное отображение графики и избежать размытости изображений.
Pixel ratio (или “плотность пикселей”) — это отношение физического количества пикселей на экране устройства к логическим пикселям. Например, на экране с высоким pixel ratio, таком как retina-дисплей, каждый логический пиксель отображается несколькими физическими пикселями. Это приводит к тому, что изображения и текст на таких экранах выглядят более чёткими и деталированными.
Для обычных дисплеев, где pixel ratio равен 1, каждый логический пиксель отображается одним физическим пикселем. Для retina-экранов с pixel ratio 2, один логический пиксель будет отображаться как два пикселя по горизонтали и два пикселя по вертикали (итого 4 физического пикселя для одного логического).
Когда создаются приложения для мобильных устройств, веб-браузеров или любых других платформ, важно учитывать различие в плотности пикселей между экранами. В случае с PlayCanvas это влияет на несколько ключевых аспектов:
В PlayCanvas можно легко получить значение pixel ratio через объект
window.devicePixelRatio. Этот параметр всегда возвращает
число, которое и является текущим значением плотности пикселей.
Пример:
var pixelRatio = window.devicePixelRatio;
console.log('Текущий pixel ratio: ' + pixelRatio);
Для обычных экранов это значение будет равно 1, а для retina-экранов — 2 или выше.
Для корректной работы графики на различных устройствах необходимо учесть pixel ratio при рендеринге сцены. Один из способов решения этой задачи — это использование масштабирования текстур и шрифтов.
Масштабирование текстур
Чтобы текстуры выглядели чёткими на экранах с высоким pixel ratio, их нужно создавать с большим разрешением. В PlayCanvas можно программно изменить размер текстуры в зависимости от pixel ratio.
Пример:
var texture = new pc.Texture(graphicsDevice, {
width: 1024 * window.devicePixelRatio,
height: 1024 * window.devicePixelRatio,
format: pc.PIXELFORMAT_R8_G8_B8_A8
});
В этом примере текстура будет автоматически увеличена в два раза для экранов с pixel ratio 2. Это позволит избежать размытия и обеспечит её чёткость на таких устройствах.
Масштабирование UI-элементов
При работе с UI также важно масштабировать элементы в зависимости от pixel ratio, чтобы обеспечить хорошее отображение на всех устройствах. PlayCanvas предоставляет API для работы с размерами и позициями UI-элементов, что позволяет автоматически изменять их в зависимости от плотности пикселей.
Пример:
var element = this.entity.element;
element.width = 100 * window.devicePixelRatio;
element.height = 50 * window.devicePixelRatio;
В данном примере элемент будет масштабироваться в зависимости от pixel ratio, что сделает его более чётким на дисплеях с высокой плотностью пикселей.
Рендеринг с учётом pixel ratio
В случае с рендерингом 3D-сцен, когда pixel ratio высокий, можно повысить разрешение рендеринга, чтобы картинка оставалась чёткой. Это делается путём изменения размера холста (canvas), на котором происходит рендеринг.
Пример:
var canvas = app.graphicsDevice.canvas;
canvas.width = window.innerWidth * window.devicePixelRatio;
canvas.height = window.innerHeight * window.devicePixelRatio;
С помощью этого кода можно изменить размеры холста, чтобы рендеринг сцены происходил с учётом высоких плотностей пикселей.
Для текстовых элементов на retina-экранах важно увеличивать разрешение шрифта и его рендеринг. Использование встроенных шрифтов в PlayCanvas также можно адаптировать для различных типов экранов.
Пример улучшения качества шрифтов:
var text = new pc.ElementComponent(this.entity);
text.fontSize = 20 * window.devicePixelRatio;
Это позволит тексту отображаться чётко даже на экранах с высокой плотностью пикселей.
Работа с pixel ratio в PlayCanvas — это неотъемлемая часть разработки приложений и игр, ориентированных на широкий спектр устройств с различной плотностью пикселей. Учитывая особенности retina-экранов, необходимо адаптировать графику, текстуры, шрифты и рендеринг сцены для обеспечения высокой чёткости и производительности на всех устройствах.