В этом году мы ездили в Москву на КРИ 2009 показывать свой проект.
В прошлом году я уже был на этом мероприятии вместе с командой Syndicate Online и остался весьма доволен, потому расчитывал как минимум на радушный прием и благоприятную почву для сеяния семян RunServer.
Видимо, наши оценки влияния кризиса на игровую индустрию вцелом оказались не верны. Если говорить кратко, то некоторая польза от поездки была - проект показали, некоторое количество контактов наладили, раздали визитки, пообщались с коллегами. Ждали мы немного другого, но уж что есть, то есть.
Первый казус оказался с погодой - конец мая месяца выдался не просто холодным, а Очень холодным. Мы мёрзли в поеде, мёрзли в Москве, мёрзли в транспорте. При этом, на самой конференции вокруг "Ярмарки Проектов" были установлены довольно яркие лампы, от которых было откровенно жарко.
В первый день мы немного опоздали из-за заселения и пришли к обеду. Остальные проекты "Ярмарки" уже активно крутили видео и показывали демки, в то время как наш компьютер еще стоял в виде коробок под стендом в самом углу помещения. Особенно удивило расположение "Ярмарки" - небольшое помещение 5х15 метров, где приютилось 20 стендов по 2-3 участника от каждого. Было откровенно тесно. Долго удивляться времени не было, потому за пару минут техника была собрана и мы обнаружили, что там стоит Windows XP SP3 без последнего DirectX, без .Net Framework, кодеков видео и с проблемами обнаружения устройств (не определялась мышь, флешка и пр.).
Проблемы решились через некоторое время, но хорошего настроения вся эта ситуация не добавила.
Следующим ударом стала работа с интернетом. Для показа онлайн проекта он довольно полезен, но организаторы конференции этим вопросом озаботились очень условно, потому первый день мы подключались к Beeline EDGE/GPRS, который был просто удручающего качества.
На следующий день была приобретена карта Comstar WiFi, но у указанного провайдера в эти дни были проблемы с сервером авторизации, потому интернет работал лишь в третий день, когда был и не особо нужен. Кстати, качество и стабильность указанного Comstar также далеки от идеала.
Конечно же, эти небольшие неприятности не должны были составить особой проблемы, ведь у нас был с собой и локальный сервер, и несколько видеороликов, чего было бы достаточно для показа не привередливой публике. Проблема же заключалась в отсутствии этой публики: неизвестно, сколько было посетителей, но 95% ее составляли программисты с других стендов. Особого интереса "очередная фентези-онлайн РПГ" у них не вызывала и полноценное общение получалось лишь с теми, кому мы успевали рассказать, что показываем демо серверного движка. Как справедливо заметил один из собеседников, надо было повесить плакаты, графики, большими буквами написать "Мы - не просто игра", показывать в клиенте "бегающие пакеты", загрузку сервера и пр. Воспользуемся его советом в следующий раз, если соберемся снова посетить Москву.
Глобально конференция вышла очень бедной по сравнению с 2008м годом - в два раза меньше площадь, отсутствие толпы и зрителей, невзрачные Booth Babies. Большая часть проектов "Ярмарки" была онлайновыми, но интернет бывал редко и далеко не у всех. Инвесторов, да и просто желающих купить что-либо не было видно вообще. Что было на высоте, так это питание в ресторане "Калинка", но это наврядли заслуга организаторов :)
Напоследок - подборка из трех фотографий "эволюции" стенда 1C, выложенных тов grayraw:
Дальше..
20 Май 2009 г.
КРИ 2009
27 Апрель 2009 г.
Открытие сайта и анонс проекта MMT Online
Думаю, многим будет интересна причина малой активности в этом блоге за последние полгода. Как ни странно, заключается она не в потере интереса, а в активной работе над собственным игровым проектом.
Наш сайт был введен в действие несколько дней назад (http://runserver.net) и сегодня команда RunServer оффициально анонсирует проект MMT Online. Детальне читайте в новостях на сайте: http://runserver.net/ru/mmt/19-mmt-anounce
В двух словах расскажу, почему проект называется "демонстрационным".
Основная цель проекта - показать возможности нашей серверной платформы, да и нашей команды в целом. Это означает, что все усилия направлены на разработку одной-двух локаций и показ как можно большего количества серверных возможностей. Мы пока не планируем сотни континентов, различные расы, десятки подземелий и пр.
С другой стороны, наш гейм-дизайнер Ипполит придумал достаточно необычный мир (точнее два мира) и было бы интересно реализовать его идеи в будующем. Возможно, ситуация изменится, если будет найден инвестор.
Немного истории.
В гейм-деве мы достаточно давно (с 2004го года как минимум), но основным направлением была серверная часть, хотя и были эксперименты над клиентской (замороженный ныне проект Heroes Offline, различные аддоны к WoW, наработки на Ogre 3D и пр.). Не смотря на это, первый наш блин в 3D игростроении вышел, как водится, комом - проект на движке Unigine (http://unigine.com) стартовал в начале 2007го года, но через полгода был заморожен и закрыт. Сказался недостаток опыта и контента.
В конце 2007го года фирма МСМ Онлайн (дочерняя компания провайдера WNet) начала разработку проекта Syndicate Online (http://syndicate-online.com) c использованием платформы RunServer и понемногу начала снабжать нас 3д контентом. Это позволило осенью 2008го года начать разработку собственной игры. Движок взяли тот же - Unigine, но программную часть написали заново. Так и родился MMT Online. К предоставленному высококачественному контенту мы начали дорисовывать своими силами собственные поделия. Местами это смотрится хорошо, местами - убого :)
Надеюсь, участие в КРИ 2009 покажет, насколько мы продвинулись в нашей цели, и получилось ли привлечь внимание к RunServer и нашей команде.
Дальше..
11 Декабрь 2008 г.
Поддержка Mono
Сегодня мы начали работать над возобновлением поддержки Mono (http://www.mono-project.com/) платформой RunServer. Причин для этого несколько, но самая первая из них - кросс-платформенность. Три года назад такая мысль меня уже посещала и результат был неутешителен: на Mono 1.14 мы получали примерно десятикратное падение производительности по сравнению с Microsoft .Net Framework 2.0 в RunWoW. Сейчас же различные источники (например этот) сообщают, что скорость Mono вплотную приблизилась к показателям .Net.
После некоторых упражнений с напильником и бубном, RunWoW запустился, но самый первый процесс - загрузка данных из БД - занял около 10 минут против 2х минут в .Net. Вывод напрашивался сам собой, но все-же стало интеерсно, откуда такая существенная разница в скорости.
Первые же тесты показали, что при загрузке небольших таблиц скорость практически идентична, но чем больше возвращается данных, тем больше разрыв. К примеру, 2 и 5 секунд при загрузке 4000 записей против 5 и 20 секунд при загрузке 40000.
Дополнительные проверки показали следующее:
- реализация System.Data.SqlClient в Mono приблизительно на 40% медленнее, чем в . Net;
- время создания обьекта отличается в Mono и .Net на доли процента;
- различные коллекции (связные списки, словари, группы массивов, да и просто обычные списки) на время загрузки данных из БД не влияют, т.к. время выборки, приведения типов, да и вцелом обработки загруженных данных, на порядок больше времени, которое тратится на перебор коллекций;
- в случае, если грузится больше N элементов, выполняется не обычный select * from <..> where <..>, а просто select * from <..> и затем результат фильтруется;
Последняя особенность привлекла мое внимание. С одной стороны, все корректно - я сам писал этот код и отлаживал на различных БД, сравнивая производительность такого решения. С другой стороны оказалось, что если убрать проверку и никогда не загружать все элементы, то разрыв в скорости на Mono и .Net уменьшается до 30-40%.
Копнув чуть глубже я нашел, что сама фильтрация результатов делается не очень оптимально: есть некий массив с ID, которые должны быть в результируещем списке и для каждого элемента таблицы выполняется проверка Array.IndexOf(id) != -1.
Этот метод имеет право на жизнь, если сам IndexOf базируется на каком-нибудь оптимизированном алгоритме (хотя бы на двоичном поиске), но совершенно неприемлим в случае последовательного перебора.
Докопаться до истины стало делом принципа. Я нашел реализацию IndexOf в Mono:
public static int IndexOf (Array array, object value, int startIndex, int count)
{
if (array == null)
throw new ArgumentNullException ("array");
if (array.Rank > 1)
throw new RankException (Locale.GetText ("Only single dimension arrays are supported."));
// re-ordered to avoid possible integer overflow
if (count < 0 || startIndex < array.GetLowerBound (0) || startIndex - 1 > array.GetUpperBound (0) - count)
throw new ArgumentOutOfRangeException ();
int max = startIndex + count;
for (int i = startIndex; i < max; i++) {
if (Object.Equals (value, array.GetValueImpl (i)))
return i;
}
return array.GetLowerBound (0) - 1;
}
Как мы видим, тут имеет место последовательный перебор. Я не стал искать реализацию этого метода в .Net, но подозреваю, что он вызывает Array.BinarySearch, что делает его в разы быстрее. Как бы там ни было, если необходимо проверить наличие записи в коллекции, самым быстрым вариантом является использование Dictionary<>, на котором я и остановился. Результат достаточно приемлим: сервер на Mono потребляет немного больше памяти и загружается на ~40% медленее. К тому же, после отказа от Array.IndexOf и .Net версия стала грузиться быстрее на пару десятков секунд.
Вывод у меня лишь один: Premature optimization is the root of all evil.
Дальше..