Freigeben über


Twisted Pixels #2 – Doing Graphics!

Оригинал: https://blogs.msdn.com/windowsmobile/archive/2009/04/07/twisted-pixels-a-mobile-game-development-diary-day-2.aspx

Twisted Pixels #2 - Делаем графику!

Как лучше всего разрабатывать двумерную графику в Windows Mobile? До некоторой степени это зависит от вашей стратегии разработки. Silverlight и Flash отлично прижились в приложениях, работающих в веб-браузерах, однако, до мобильных браузеров они пока не добрались. .NET достаточно хорош для отрисовки текста и простых геометрических фигур, но удивительно слаб в поддержке растровых изображений. Учитывая, что я хочу работать именно с растровой графикой, причём на достаточно низком уровне, похоже мне придётся работать с C++ и WinAPI, по крайней мере это справедливо для текущего поколения Windows Mobile (6.1 и 6.5). Я обожаю простоту и удобство использования .NET, однако он на сегодняшний день не приспособлен к такому роду программирования. (прим. пер. – не совсем согласен). Использование системных библиотек напрямую позволяет добиться максимальной производительности, а это всегда было неплохо.

 

Я сверился с MSDN и мне показалось, что DirectDraw является самым правильным подходом для работы с двумерной графикой. Direct3D тоже звучит соблазнительно даже для 2D игры, но слишком уже редка аппаратная поддержка (а программная поддержка, это, извините, программная).

 

Примечание: Несмотря на то, что в десктоп версии Windows уже давно появились новые API, в Windows Mobile графические API по-прежнему старые, в основном из-за малого количества лошадиных сил под капотом устройств на Windows Mobile.

 

clip_image002 Лежачий полицейский: В SDK присутствует некоторое количество примеров, которые на первый взгляд должны бы служить неплохим подспорьем для начала, но, к сожалению, есть проблемы. Все, за исключением одного, примеры используют кадровый буфер (прим. пер. - https://ru.wikipedia.org/wiki/Кадровый_буфер) для ускорения и улучшенного качества отрисовки. Это замечательно, но ни WM6 Pro, ни WM6 Classic эмуляторы не поддерживают эту функцию, т.е. в эмуляторах примеры работать не будут. Аппаратная поддержка тоже не сильно лучше, 3 из 5 приложений требуют аппаратной поддержки flipping chain, которую тоже мало кто обеспечивает. Остаётся всего два примера, из которых один требует аппаратного оверлея. Неудивительно, что эту опцию тоже практически никто не поддерживает. 

 

К счастью единственный оставшийся пример работает и в эмуляторе, и на устройстве. Порт классического directX примера "Бублики", космической стрелялки с цветными анимированными спрайтами. Попробуйте загрузить пример в любом из эмуляторов. Путь до примера: C:\Program Files (x86)\Windows Mobile 6 SDK\Samples\PocketPC\CPP\win32\directx\DDraw\Donuts2. Эмуляторы никого не хвастались своей скоростью, FPS в игре низкий, играть практически невозможно. Тем не менее, он работает, а нам пока этого достаточно.

Donuts2

Однако, проверять производительность на эмуляторе совершенно нереально, поэтому далее я настрою Visual Studio для отладки приложений на реальном устройстве.

 

Тестирование и отладка на устройстве

Я провел небольшое исследование и нашел несколько коммуникаторов, которые меня устроили по характеристикам. Из этого списка в руки мне попал HTC Diamond. Отличный коммуникатор с GPS и акселерометром, на первый взгляд, замечательно подходит для моих экспериментов.

Начнём с хороших новостей. В Visuial Studio всё изначально настроено для отладки приложений на устройстве. Достаточно выбрать в выпадающем списке пункт “Windows Mobile 6 Professional Device” и нажать "Start Debugging". Через несколько мгновений на устройство устанавливается порция библиотек, необходимых для работы. Подключение каждой из них влечет за собой появление сообщения службы безопасности, к счастью, только один раз. В конце концов и Donuts2.exe установился, но вот тут-то и начались проблемы.

 

clip_image002[4] Лежачий полицейский: Очевидно, на моём телефоне были слишком жесткие ограничения безопасности, которые не разрешали запуск неподписанных приложений. Вот такое сообщение об ошибке показала мне Visual Studio:

В сообщении дается совет использовать некий Device Security Manager для изменения параметров безопасности. Не припомнив такого приложения, я начал копаться в сети и скоро обнаружил Power Toys для WM5. Мда, явно должно быть что-то посвежее. Продолжив поиски, я выяснил, что это приложение теперь является частью VS2008. Ага, как всё просто! Оказывается, достаточно было изучить пункт меню Tools в Visual Studio.

 

Подключившись к устройству я поменял параметры безопасности с “Prompt One Tier” на “Security Off”. После этого приложение Donuts2.exe наконец запустилось. Но только для того, чтобы моментально выдать следующую ошибку:

DONUTS: CleanupAndExit err = CreateSurface FrontBuffer Failed!

 

Совершенно несложно было обнаружить место ошибки, просто поискав текст сообщения в исходных текстах примера. Похоже, что всё сломалось во время вызова метода CreateSurface. В справке по этому методу не удалось обнаружить ничего конкретного. Установив точку останова на месте вызова, я повторно запустил приложение. Наведя курсор мыши на переменную ddrval, я получил отличное значение “E_OUTOFMEMORY”. Очень странно, я совершенно точно знаю, что памяти у меня много.

 

clip_image002[6] Лежачий полицейский: В эмуляторе-то все работало, почему же на устройстве такая ерунда с памятью? Обращаю внимание, что, возможно, на вашем устройстве такой проблемы не возникнет, но так как это дневник разработчика, я буду рассказывать то, что приключилось конкретно со мной.

 

В процессе поиска я обнаружил несколько отличных топиков с обсуждением похожих проблем с памятью:

 

Slaying the Virtual Memory Monster(https://blogs.msdn.com/hegenderfer/archive/2007/08/31/slaying-the-virtual-memory-monster.aspx)

Slaying the Virtual Memory Monster - Part II(https://blogs.msdn.com/hegenderfer/archive/2007/10/01/slaying-the-virtual-memory-monster-part-ii.aspx)

Visualizing the Windows Mobile Virtual Memory Monster(https://www.codeproject.com/KB/mobile/VirtualMemory.aspx)

 

Так-так, сплошные монстры, ничего себе. Не нравится мне это. Настоятельно рекомендую изучить эти замечательные посты и посмотреть, сможете ли вы понять, где была скрыта проблема. В следующей части дневника - "Тайны работы с памятью".

 

Автор перевода: Андрей Коновалов

Comments