Инструметы разработки социальных игр Куперштох Алексей Alawar
Игра "Городской Магнат"
Игра "Городской магнат" Стандартный ситибилдер Запустился 5 дней назад Команда: o 1.5 серверных разработчика o 2 flash-разработчика o 1 QA o Художники, менеджеры, гейм дизайнеры,... o Команда разделена географически o Разница в часовых поясах - 4 часа Одна из пилотных социальных игр компании Alawar
Клиент-Сервер Типичное клиент-серверное приложение Клиент - Flash Сервер - PHP Протокол взаимодействия - JSON-based HTTP
JSON vs AMF JSON открытый текстовый достаточная поддержка на клиенте и на сервере можно смотреть все вызовы в браузере - полезно для отладки клиентом может выступать не только flash AMF пропритетарный бинарный хорошая поддержка на клиенте, с сервером дела хуже
Поиск ошибок Логи на сервере o tail -f | grep uid Debug-режим, который не видят простые смертные o Дебаговые приложения o Дебаговые юзеры o Логи на клиенте debug panel в самой игре console.log o Показ дополнительной информации прямо в интерфейсе игры (id, состояния, таймеры,...)
Ошибки синхронизации Если что-то реализовано и на сервере, и на клиенте - это БОЛЬШОЙ источник габлей Невозможно писать идентичный код с точностью до всех условий и округлений (у нас не получилось :) Ответ от сервера очень важен. o ошибки не учитываем o ошибки учитываем, логируем o ошибки учитываем, логируем, падаем Дополнительная информация при обмене между клиентом и сервером
Ошибки синхронизации времени Timestamp'ы у нас - это unix timestamp * 1000 Хранятся в bigint Переходные состояния o Жильцы сбежали - деньги с них больше не собрать. o Но если они сбежали менее минуты назад, то для некоторых действий мы еще считаем, что они не сбежали. o Если пользователь пытается собрать прибыль со здания, которое её произведёт только через 5 секунд - позволим - нам не жалко. Накапливание ошибки времени
Серверная часть Принципы, архитектура Инструменты, фреймворки, среды, языки, движки, библиотеки Производительность, трафик Проблемы
Сервер - LNMP-стэк Linux - Ubuntu Server LTS Nginx MySQL + Memcached o Memcached отключён PHP 5.3 o фишки 5.3 не используются
MySQL Почему бы и нет? o Проект и так достаточно экспериментальный o MySQL знают все o Его пока хватает, несмотря на write- ориентированность игры Простые варианты использования MySQL и поддержка memcached - залог того, что при необходимости можно будет перейти на другие базы данных MongoDB удобен в плане гибкости схемы данных в коллекциях Redis хорош своими структурами данных и высокой производительностью
Производительность Простые алгоритмы, в основном сложность O(1) или O(log(n)) Мы не используем фреймворк, НО, очень часто это приводит к тому, что самописные поделки тормозят еще больше - в основном из-за криво реализованных моделей и всяких ACL. Мы - не исключение. Кроме отсутвия фреймворка - нет никаких предварительных оптимизаций. Не экономьте на спичках. В 90% случаев вы всё равно не отгадаете, что будет тормозить.
Мониторинг Техническая o Munin o Zabbix Бизнес o Самописная статистика На что тратят голоса
Framework Админка на YII o С моделью o Шаблоны для генератора админки Игровой бэкенд - самописный. o Парсит json o Проверяет авторизацию o Исполняет серверные события o Запускает команды одну за одной o Пакует и отдаём ответы Игровая модель - самописная o Очень не хватает Propel и Doctrine :)
Генерация и хранение идентификаторов Мы не используем AUTO_INCREMENT Мы храним свои счётчики для каждого пользователя ID новых строений генерируются клиентом Практически все обращения к базе данных используют поле UID. Лучше сразу закладываться на приспособенность к нескольким социальным сетям и хранить uid в виде строк с префиксами
Библиотечные данные Курсы валют Здания Типы жильцов...
Деплоймент Сейчас думаем над тем, как облегчить работу художникам и гейм дизайнерам. Скорее всего это будет раскладывание библиотек и файлов с сервера на сервер по одному нажатию кнопки С кодом и апдейтами базы данных по-прежнему будем работать вручную - дело в том, что сервер имеет состояние.
Командная разработка Разница в 4 часа Незнакомые изначально люди Несоблюдение принципа "Сервер всегда прав" Сложно заслужить авторитет
Инструменты для удалённой разработки Skype Google Docs Google Drawings
Инструменты разработчика IDE o Netbeans o PHPStorm SCM o svn repo o git-svn client Browser o Google Chrome o debug flash player Bugtracker o Jira o QA-инженер должен описывать ошибки в виде "что делаю - что ожидаю - что получилось", иначе это не работает
Вопросы? /gtalk: skype: alexey.kupershtokh