Всем привет!
Я думаю, что стоит начать с того, что представиться. Меня зовут Кирилл Орлов. Сейчас мне 20 лет. Я работаю в некой замечательной компании WPF-разработчиком. А несколько месяцев назад защитил диплом специалиста в МГУПИ. И примерно полгода назад я перестал быть Microsoft Student Partner (это такие активные студенты которые интересуются IT-технологиями и рассказывают о них другим студентам). Именно из-за деятельности и тусовки MSP я заинтересовался Windows Phone, после чего на новый год одним из первых купил себе «серый» HTC 7 Mozart за 18000, который со мной до сих пор. До сих пор помню ту симпатичную девочку-курьера которая меня разбудила и принесла мне этот клевый девайс :-D
Что же до разработки — я уже несколько лет профессионально зарабатываю на хлеб разработкой на WPF. Так как двумя основными технологиями разработки под WP7 являются XNA для игр и Silverlight (появившийся изначально как подмножество WPF) для приложений, я не мог устоять перед тем, чтобы не попробовать написать что-то, просто ради интереса. Будучи студентом, я зарегистрировался бесплатно в AppHub по программе DreamSpark. Так появились приложения 200 Situps, 200 Squats и 150 Dips.
Именно тогда я вспомнил про то, как мне одногруппник (Михаил, привет!) как-то рассказал про замечательную программу pMetro, доступную для PC. Именно тогда у меня возникла идея сделать карты метро для WP7. Где-то с неделю я пытался сам написать рендер для карт из pMetro, а потом я связался с Борисом Мурадовым, автором pMetro и договорился о помощи и лицензировании карт. Тогда это должна была быть серия приложений, разбитых по странам, с идентичной функциональностью и разными картами. Так появился безуспешный проект с названием USA Subways. Спустя месяц практического отсутствия интереса к нему, он был убран из маркета, и я начал думать что делать дальше. Ненадолго отложив картографию, я сделал HamsterVoice и начал писать geekGym — логическое продолжение относительно успешных 200 Situps & co. В последнее время в России начал расти интерес к платформе, поэтому я решил попробовать свои силы на российском маркете с картами метро, пока не пришли гиганты вроде Яндекса. Первая версия была сделана крайне быстро — спасибо наработкам из USA Subways.
Вообще, карты метро — очень сложный проект. Было очень много технических ограничений, проблем с производительностью. Например, так я узнал что WP7 почему-то очень медленно открывает PNG и не умеет грузить картинки более чем 2048х2048. К чести Microsoft, многие проблемы производительности исправились в Манго.
Надо отметить, что формат карт изначально был векторный. Но на устройстве они хранятся в виде отрендеренной картинки и вспомогательного xml файла, содержащего в себе информацию о станциях. Кроме того, процедура рендеринга весьма тяжелая и сложная, а ее написание заняло бы значительное время. Поэтому я принял решение хранить саму карту в виде картинки, и сделал небольшой скрипт, который из векторных карт делал изображения в png. Тут-то и была первая подстава от платформы — WP7 с PNG очень медленно работает. Для сравнения — работа с jpg была в несколько раз быстрее. Картинки я изначально рендерил с масштабом 200%, чтобы в зуммированном виде картинка продолжала смотреться нормально. Тут я столкнулся с второй неприятной особенностью Windows Phone 7: она начисто отказывается поддерживать картинки более чем 2048 пикселей по одной из сторон. Надо отметить, что информация о станциях (координаты) хранится в виде точки для масштаба в 100%. У меня же теперь масштаб многих рендеров был переменным. Мне надо было либо переделывать все XML, либо сохранять где-то масштаб, в котором рендерил. Немного модифицировав скрипт генерации рендеренных картинок, теперь я хранил дополнительный файл dsc, в который сохранялся масштаб рендера.
Таким образом, у меня получилась папка Maps, где для каждой из 190 карт имелся рендер, xml-ник со станциями и вспомогательный файл с масштабами. В объектной модели у меня был класс MapInfo, у которого конструктор примерно следующего вида:
public MapInfo(string cityName, string resourceName, int width, int height, double scale);
Как видно по коду, этот класс представлял собой одну карту. И тут-то возник вопрос — как сделать перечисление всех карт, так чтобы это было быстро и для пользователя (никаких чтений файлов с диска в это время!), и для программиста (никакого хардкода). Тут мне пришел на помощь инструмент для кодогенерации T4 (Text Transformation Templating Toolkit). Отличный инструмент, который неявно входит в VisualStudio и широко используется самой студией, например, для кодогенерации для resx-файлов. Описав несложный цикл в .tt файле, на выходе я получил частичный класс MapsProvider, в котором было что то вроде такого:
public IEnumerable<MapInfo> Maps { get{ yield return new MapInfo(«Adana», «Adana.jpg», 1200, 800, 2.0); … … yield return new MapInfo(«Yokohama», «Yokohama.jpg», 1400, 1200, 1.9); }}
Ну а дальше нужно было просто отобразить нужную картинку из ресурсов. Для прокладывания маршрута используется классический алгоритм Дейкстры и далее просто рисуется Polyline поверх изображения.
Сейчас у geekSubways много детских болезней: непродуманный UX и проблемы производительности, а также не всегда адекватное прокладывание маршрута. Ближайшие несколько обновлений я планирую бороться именно с ними. Опять же в следующем обновлении будет уже поддержка Mango и, вероятно, русская локализация. Сейчас наиболее приоритетным для geekSubways является российский рынок.
В перспективе, конечно же, хочется максимально повторить функциональность pMetro. Но к несчастью, мы все живем в материальном мире, и это будет возможно только если программа станет популярной и окупаемой. Всё же одному весьма сложно все это делать. У меня есть масса идей, что еще стоит сделать. Я даже знаю как это сделать, но не хватает времени. Очень хочется откликов от людей, предложений, вообще ощущения, что кому-то это нужно. Недавно на форуме прочитал, что кого-то смутило название программы. Стоит отметить что слово geek — означает очень сильно увлеченного чем-то человека и не несет в себе негативного оттенка. Так например я — geek. И сама программа тоже в некотором роде увлечена картами (хотя бы вспомнить количество карт в ней), поэтому она и называется geekSubways.
На этом заканчиваю, могу лишь советовать ждать официальное обновление Mango в России (оно здоровское! ; -), ждать обновленную для Mango geekSubways, и если она вам понравится нажимать на кнопку «купить» в маркете ;-) Всем удачи! ;-)