После запуска мобильной игры через месяц активность падает — отсутствие здоровой конкуренции убивает retention. Простой глобальный рейтинг не мотивирует: игроки не видят друзей и не чувствуют прогресса. Мы сталкивались с этим не раз: в 20+ проектах внедрение сегментированных лидербордов подняло возвращаемость на 30–40%. Для mid-core и competitive игр это обязательный элемент: игроки хотят соревноваться с друзьями, отслеживать прогресс по неделям и получать награды за топ-10. Ниже — как спроектировать систему, которая будет работать под нагрузкой до 10 000 RPS и блокировать читеров.
Почему серверная валидация очков критична?
Клиентский score без валидации — прямой путь к читерству через Memory Editor или Cheat Engine. Блокируем до 99% таких попыток. Лучший метод — серверный расчёт: клиент отправляет события, а Cloud Script вычисляет финальные очки.
| Метод | Описание | Надёжность |
|---|---|---|
| Серверный расчёт | Клиент отправляет события, сервер считает score | Высокая |
| Плауз-чек | Проверка на аномалии (max возможный score) | Средняя |
| Реплей-чек | Повторное исполнение действий на сервере | Очень высокая |
Комбинируем серверный расчёт с плауз-чеком: Cloud Script получает события уровня и вычисляет финальный score. Если результат аномален (например, 50 000 при максимуме 10 000), отклоняем. Экономия на инфраструктуре античита — существенная.
В PlayFab создаётся Cloud Script с функцией validateScore, которая принимает массив событий и возвращает итоговый score. Важно настроить таймаут выполнения (по умолчанию 10 секунд) и ограничения по памяти. Для высоконагруженных игр используем очередь для асинхронной обработки.
Какой бэкенд выбрать для лидербордов?
| Решение | Когда подходит | Ограничения |
|---|---|---|
| Google Play Games Leaderboards | Простой глобальный рейтинг, Android | Только Android, ограниченные типы |
| Game Center Leaderboards | iOS, simple global/friends | Только iOS |
| PlayFab Leaderboards | Кросс-платформа, гибко | Платный при высокой нагрузке |
| Firebase Realtime DB / Firestore | Гибко, real-time | Нужна кастомная индексация |
| Custom backend | Полный контроль | Разработка и поддержка |
Для большинства мобильных игр PlayFab — оптимальный выбор: не нужно писать серверную логику, есть встроенный anti-cheat. PlayFab Leaderboards API (документация) разворачивается в 10 раз быстрее кастомного сервера. Поддерживает сегментированные рейтинги, автоматический сброс статистики по расписанию и интеграцию с платформенными аккаунтами. Используем его в 80% проектов — снижает затраты на серверную инфраструктуру на 50%.
Пример записи и получения очков
public void SubmitScore(int score, string leaderboardName = "global_score") { PlayFabClientAPI.UpdatePlayerStatistics( new UpdatePlayerStatisticsRequest { Statistics = new List<StatisticUpdate> { new StatisticUpdate { StatisticName = leaderboardName, Value = score } } }, result => Debug.Log("Score submitted"), error => Debug.LogError(error.GenerateErrorReport()) ); } public void GetLeaderboard(string leaderboardName, Action<List<LeaderboardEntry>> callback) { PlayFabClientAPI.GetLeaderboard( new GetLeaderboardRequest { StatisticName = leaderboardName, StartPosition = 0, MaxResultsCount = 100, ProfileConstraints = new PlayerProfileViewConstraints { ShowDisplayName = true, ShowAvatarUrl = true } }, result => { var entries = result.Leaderboard.Select(entry => new LeaderboardEntry { PlayFabId = entry.PlayFabId, DisplayName = entry.DisplayName, Score = entry.StatValue, Rank = entry.Position + 1, AvatarUrl = entry.Profile?.AvatarUrl }).ToList(); callback?.Invoke(entries); }, error => Debug.LogError(error.GenerateErrorReport()) ); } public void GetPlayerRank(string leaderboardName, Action<int> callback) { PlayFabClientAPI.GetLeaderboardAroundPlayer( new GetLeaderboardAroundPlayerRequest { StatisticName = leaderboardName, MaxResultsCount = 1 }, result => { var playerEntry = result.Leaderboard.FirstOrDefault(e => e.PlayFabId == PlayFabSettings.staticPlayer.PlayFabId); callback?.Invoke(playerEntry?.Position + 1 ?? 0); }, error => { } ); } Как защитить лидерборд от читеров?
Помимо серверного расчёта, используем мониторинг аномальных паттернов: если игрок отправляет score в нереальное время (менее 1 секунды на уровень) или с нехарактерной частотой — блокируем аккаунт. Дополнительно анализируем историю действий через Big Data. Это снижает количество читеров до единичных случаев.
Как мы реализуем лидерборды поэтапно?
- Аналитика и проектирование — определяем типы рейтингов, правила сброса, целевую нагрузку (до 10 000 RPS).
- Настройка PlayFab — создаём статистику, конфигурируем античит и резервное копирование.
- Реализация серверной логики — Cloud Script для валидации очков (серверный расчёт или плауз-чек).
- Интеграция с платформами — Google Play Games / Game Center для cross-platform видимости.
- UI-компоненты — список с аватарами, закреплённая позиция игрока, фильтры (global/friends).
- Тестирование и нагрузка — проверка при 10 000+ одновременных запросов.
- Деплой и мониторинг — автообновление и алерты при аномалиях.
Для сегментированных лидербордов используем версионирование статистики или отдельные имена для каждого уровня. Еженедельный сброс настраивается в PlayFab Game Manager → Statistics → Reset interval. С push-уведомлениями (APNs/FCM) игроки узнают о сбросе и новых наградах — retention дополнительно растёт.
Google Play Games и Game Center
Для платформенных лидербордов, которые видны в интерфейсе магазина:
PlayGamesPlatform.Instance.ReportScore( score, GPGSIds.leaderboard_global_score, success => Debug.Log($"Score reported: {success}") ); PlayGamesPlatform.Instance.LoadScores( GPGSIds.leaderboard_global_score, LeaderboardStart.TopScores, 100, LeaderboardCollection.Public, LeaderboardTimeSpan.AllTime, data => { /* data.Scores */ } ); Платформенные лидерборды хороши для discovery — игрок видит рейтинг прямо в Google Play без запуска игры. Но ограниченный контроль над дизайном и нет cross-platform. Deep linking (Universal Links / App Links) позволяет отправлять прямой пригласительный клик на конкретную позицию.
UI-паттерны
Хороший лидерборд отображает:
- Позицию и очки текущего игрока всегда видимы (закреплены вверху или внизу)
- Игроки вокруг текущего (±5 позиций) — GetLeaderboardAroundPlayer
- Топ-3 выделены визуально
- Аватары (из PlayFab Profile или платформенного аккаунта)
Пагинация или бесконечный скролл с GetLeaderboard(startPosition: offset) — для доступа к нижним строкам.
Что входит в работу
- Настройка PlayFab Statistics с нужными именами и правилами сброса
- Реализация submit, get top, get around player
- Лидерборд среди друзей
- Серверная валидация очков (Cloud Script)
- Платформенная интеграция (Google Play Games / Game Center)
- UI: список, позиция игрока, аватары, фильтры (global/friends/weekly)
Сроки и стоимость
Глобальный лидерборд на PlayFab занимает 2–4 дня. Полная система с сегментацией, серверной валидацией и UI — от 1 до 2 недель. Стоимость рассчитывается индивидуально, экономия времени достигает 10 раз по сравнению с кастомным сервером. При нагрузке до 50 000 одновременных игроков время отклика остаётся менее 50 мс. Закажите консультацию инженера, и мы подберём оптимальную архитектуру под вашу нагрузку. Свяжитесь с нами для расчёта стоимости вашего проекта — мы гарантируем стабильную работу под высокой нагрузкой и даём 30 дней бесплатной поддержки после запуска.







