Pixel & Trent
Trent Trent
Привет, Пиксель. Я тут понаблюдал за всплеском ретро-игр от инди-разработчиков, и мне интересно, как ты подходишь к оптимизации пиксельной графики для работы на современном железе – какие-нибудь секреты или инструменты, которыми пользуешься?
Pixel Pixel
Да, этим занимаюсь уже много лет. Сначала следи за ограниченной палитрой – обычно хватает 16-32 цветов, и размер файла будет меньше. Потом используй подход с картой тайлов для фонов вместо отрисовки каждого спрайта по отдельности; это позволит GPU переиспользовать небольшой набор тайлов многократно. Для самой графики я до сих пор использую Aseprite, он дарит ту самую классическую атмосферу, а варианты смешивания слоёв очень полезны, но потом экспортирую в PNG с альфа-каналом и даю Unity или Godot сами разобраться с текстурными атласами. Ещё люблю собирать мелкие спрайты в один большой спрайт-лист – это значительно уменьшает количество вызовов отрисовки. Ну и напоследок, если планируешь анимации, используй частоту кадров 15 или 30 fps – это не перегрузит процессор и всё равно будет плавно. Если нужно корректировать яркость или контрастность на ходу, использую простой шейдер, который просто изменяет таблицу поиска; это реальный прирост производительности на современных видеокартах. Надеюсь, пригодится!
Trent Trent
Отлично, солидно. Палитра, тайловые карты, спрайт-листы и кадровая частота 15–30 fps – это самое простое, что можно сделать. Я бы посоветовал сразу начать профилирование: сделай короткий тест производительности на целевом устройстве и посмотри, где процессор или видеокарта тратят больше всего времени. Если ты уже работаешь с текстурами в Unity, проверь настройки импорта – снижение уровней мип-карт для 2D спрайтов поможет сэкономить память и ускорит кэш. И еще, подумай об использовании Sprite Atlas в Unity с новым Sprite Packer’ом; он автоматически объединяет спрайты и позволяет использовать несколько атласов для разного уровня детализации. Как у тебя сейчас организован процесс создания новых уровней? Какие узкие места встречаешь перед релизом?
Pixel Pixel
Обычно начинаю с быстрого наброска в Aseprite, экспортирую тайлы и спрайты в PNG, а потом закидываю их в систему тайлмапов в Unity. Пакую спрайты в атласы через Sprite Packer, сразу же настраиваю параметры импорта и после каждого нескольких изменений запускаю профайлер на целевом устройстве. Самая большая задержка перед релизом – это обычно размер атласов в памяти. Один большой лист может просто выстрелить потребление оперативной памяти, поэтому я стараюсь держать листы небольшими и разбиваю их, когда уровень разрастается. Еще, добиться стабильной частоты кадров ниже 30fps на телефоне может быть проблемой, если тайлмап слишком плотный или шейдер перегружен. Как только появляется заминка – профилирую, подкручиваю атлас или плотность тайлов, и снова тестирую. Так и получается более-менее гладкий релиз.
Trent Trent
Звучит как неплохой рабочий процесс. Быстрый выигрыш – используй новые настройки сжатия Unity для 2D текстур: RGBA 4444 или ETC1/ETC2 на Android, ASTC на iOS – чтобы атласы оставались небольшими, но при этом четкими. Еще, следи за порядком сортировки спрайтов; пакетная отрисовка работает лучше всего, когда спрайты используют один и тот же материал, поэтому динамические элементы выдели в отдельный атлас, чтобы не вызывать лишних смен состояний. Если тайлмап все еще перегружен, попробуй предварительно триангулировать статичные тайлы одним стационарным батчем или используй кастомный шейдер, который полностью исключает вычисления освещения. Ну и, кстати, рассмотри ленивую загрузку атласов для второстепенных уровней: загружай только те тайлы, которые нужны для текущего видимого участка экрана, а остальное подгружай по мере необходимости. Так и потребление памяти под контроле, и производительность не пострадает. Не забывай про профилирование, и ты успеешь до дедлайна.
Pixel Pixel
Круто, точно попробую эти оптимизации и идею с ленивой загрузкой. Сам ковыряю свой шейдер, который просто перебрасывает текстуру без всяких вычислений освещения — так стабильные FPS, когда карта забита. Спасибо за советы!