пятница, 11 сентября 2026 г.

Как я заставил игру на LibGDX тормозить: 5 ошибок из реального проекта

Найдите курс под свою цельНайдите курс под свою цель Войти barbazan 5 сен в 17:50 Как я заставил игру на LibGDX тормозить: 5 ошибок из реального проекта Средний 9 мин 9.7K Java * Разработка игр * Разработка мобильных приложений * Мнение В предыдущей статье я рассказывал, почему в 2026 году выбрал LibGDX для разработки игр на Java и какие преимущества вижу у этого фреймворка. Но выбор инструмента — это только половина дела. Даже на LibGDX вполне можно сделать игру, которая будет отлично работать на компьютере и заметно тормозить на смартфоне. В этой статье разберём пять технических ошибок, которые чаще всего приводят к проблемам с производительностью. Эта статья не про геймдизайн, монетизацию, продвижение или причины, почему ваша игра никому не нужна. Речь исключительно о технических ошибках при разработке игр на LibGDX, которые могут привести к низкому FPS, микрофризам, большому потреблению памяти, повышенному расходу батареи или проблемам при сборке под WebGL. В первую очередь речь о мобильных играх и WebGL‑версиях, которые запускаются непосредственно в браузере. На мощном десктопном компьютере многие из этих проблем могут быть практически незаметны. Я сам разрабатываю игры на LibGDX и периодически наступаю на разные грабли. Поэтому ниже не академический список оптимизаций, а вещи, на которые я бы обратил внимание уже в начале разработки. 1. Не делайте гигантские Texture Atlas Texture Atlas — одна из самых полезных вещей в LibGDX. Мы собираем множество небольших картинок в одну большую текстуру, а затем используем отдельные TextureRegion. Это позволяет SpriteBatch дольше работать с одной текстурой и уменьшает количество переключений текстур и render calls. Но тут легко переборщить. Для мобильной игры я стараюсь держать максимальный размер страницы атласа примерно в пределах 4096 × 4096. Это не означает, что LibGDX или конкретный телефон обязательно не смогут работать с 8192×8192. Всё зависит от GPU и используемого backend. Проблема в другом: большая текстура — это большая текстура. Даже если вы используете из неё всего несколько маленьких картинок, сама текстура имеет соответствующий размер и требует памяти GPU. Например, RGBA8888-текстура 4096×4096 — это примерно:

Экономика владения мобильной фермой. Сколько стоит собрать собственный парк устройств

Чтобы приложение работало одинаково хорошо у пользователей с разными моделями смартфонов, его желательно протестировать на таких же устройствах. Но что делать, если аудитория насчитывает десятки тысяч человек и у каждого разные смартфоны: у кого-то Samsung последней модели, флагманский Huawei, REALME, INFINIX или старенький Xiaomi, а кто-то из ностальгии купил iPhone 4? Разные модели, разные операционные системы… Как вариант, в таком случае можно использовать мобильную ферму — собрать свою или использовать готовое облачное решение. Привет, Хабр! Я Саша, руководитель направления поддержки в Selectel. Мне стало интересно посчитать, сколько стоит собрать мобильную ферму своими руками и насколько это целесообразно для среднего и крупного бизнеса. Что получилось — рассказываю под катом. Мобильная ферма — сервис, который позволяет удаленно запускать и тестировать приложения на реальных мобильных устройствах. С ее помощью можно проверить совместимость, функциональность и производительность приложений на разных мобильных устройствах с операционными системами Android и iOS. Так ли нужен широкий парк устройств Для начала вернемся немного назад и разберем, можно ли обойтись 2–3 популярными девайсами при тестировании. Например, бывают случаи, когда в компаниях принято тестировать приложения только на паре устройств, но с разными ОС: Android и iOS. Такая практика вполне работает, когда пользователей не так много или экономически (и репутационно) можно пожертвовать частью юзеров. Например, не критично, если у небольшой части людей поплывет верстка или не сработает кнопка. Но для FinTech, e-commerce, SaaS и других приложений, где клиентов много, а цена ошибки высока, нужен парк пошире. Любой тестировщик знает, что баги, которые не появляются на одном смартфоне или одной операционной системе, могут критически влиять на работу приложения на другом. Даже если приложение работает некорректно на устройстве, которым пользуется всего 5% аудитории, бизнес может столкнуться с последствиями. Представьте, что случится, если при обновлении банковского приложения оно перестанет открываться у части пользователей. Широкое покрытие устройств позволяет создавать качественный продукт. Тестировщик может находить баги, которые проявляются только на конкретных моделях (например, только на Honor или на старых Samsung). Соответственно, снижается количество критических ошибок в продакшене, поддерживается высокий уровень SLA, а пользователи не идут писать негативные отзывы в магазинах приложений.

Почему HTML-таймер из чата не будит телефон, и что с этим делать

Войти fedorovbtc 8 сен в 10:20 Почему HTML-таймер из чата не будит телефон, и что с этим делать Простой 3 мин 4.4K Разработка мобильных приложений * JavaScript * Веб-разработка * Кейс Знакомый попросил ChatGPT написать ему интервальную тренировку: 40 секунд работа, 20 отдых, восемь кругов, одним HTML-файлом. Чат выдал нормальный код, в браузере всё бегает и пикает. Положил телефон на пол, начал отжиматься — тишина. Экран погас, и вместе с ним погас таймер. Он спросил у чата «почему», и получил длинный список: PWA с Wake Lock, PWA с заранее склеенной аудиодорожкой (тишина → гонг → тишина → гонг), Capacitor, «соберите APK». Четыре совета, и три из них — обходные манёвры вокруг одного простого факта, который в туториалах обычно не пишут. Веб-страница не умеет будильник Не «пока не умеет», а по решению платформ. Пройдусь по механизмам, в которые все упираются: setTimeout / setInterval живут, пока жива страница. Вкладка ушла в фон — таймеры троттлятся до раза в минуту, потом страница замораживается целиком. Safari на iOS делает это особенно охотно. Notifications API умеет показать уведомление, но только пока страница или её service worker бодрствуют. Запланировать «покажи в 10:33» нельзя. Notification Triggers — была ровно такая спецификация (showTrigger: new TimestampTrigger(t)). Chrome прогнал origin trial в 2020–2021 и закрыл проект. Нигде не вышло и не выйдет. Service worker просыпается от push с сервера и засыпает через десятки секунд. Своего расписания у него нет. Web Push работает, в том числе на iOS 16.4+ для PWA на главном экране. Но это сервер: HTTPS, VAPID, подписки, бэкенд, который в нужную секунду шлёт сообщение. Для продукта — нормально. Для таймера на сорок строк из чата — ну такое: чтобы телефон пикнул через 45 минут, нужно поднять и вечно крутить сервер. Так что классический «будильник на HTML» — , цикл с new Date(), тег