Twisted Pixels #3 – Тайны работы с памятью

Оригинал: https://blogs.msdn.com/windowsmobile/archive/2009/04/17/twisted-pixels-3-memory-mysteries.aspx

Что происходит?

Напомню, на чём мы остановились. У меня есть приложение, которое работает на эмуляторе, но не работает на реальном оборудовании. Вопрос - почему.

Я тщательно изучил следующие посты про модель памяти в Windows Mobile:

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

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

 

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

 

В моём тестовом приложении Donuts2.exe явные симптомы вышеописанных проблем - падение происходит при попытке выделить память для DirectDraw поверхности. Да, кстати, после того, как я написал предыдущий пост, мне удалось найти устройство, на которой пример запустился.

 

Архитектура модели памяти в Windows Mobie 6.1. досталась в наследство от Windows CE 5.0, а эта модель разрабатывалась, когда было очень важно использовать как можно меньше памяти. Из-за этого приложение может занимать не более 32Мб. И не важно, сколько у вас памяти в устройстве. А есть и другие нюансы, которые ещё больше уменьшают количество доступной памяти. Всё это подробно описано в вышеперечисленных статьях, так что не будем вдаваться в подробности.

 

Примечание: В Windows Embedded 6.0 эти ограничения, наконец, сняли, так что мы можем надеяться на то, что в будущих версиях Windows Mobile таких проблем больше не будет.

 

Невозможно отлаживать неработающее приложение, поэтому придётся воспользоваться парочкой инструментов, которые позволяют исследовать положение с виртуальной памятью в Windows Mobile:

 

DumpMem.exe, можно скачать отсюда: https://support.microsoft.com/kb/326164/. Это достаточно старое приложение, которое позволяет делать детальный дамп содержимого виртуальной памяти вашего устройства. Во второй статье из списка подробно рассказывается о том, как пользоваться этим приложением.

VirtualMemory.exe, приложение с Code Project из статьи “Visualizing the Windows Mobile Virtual Memory Monster“. Достаточно удобная штука с графическим интерфейсом, правда, особенно заковыристые проблемы решить с её помощью вряд ли удастся. 

 

Ещё очень полезный и нужный инструмент разработчика - это приложение для снятия снимков экрана. Лучшее, что я обнаружил, это SPB Screenshot https://www.spbclub.com/forum/viewtopic.php?t=12483

(прим. пер. - а ещё можно попробовать https://www.mymobiler.com/ )

 

Несмотря на то, что существуют такие замечательные приложения, воспользоваться ими мне не удалось - Donuts2.exe работает в полноэкранном режиме и перехватывает все аппаратные клавиши. К этому моменту я уже просто устал тратить время на этот неработающий пример. Если бы это было коммерческое приложение, то, безусловно, было бы неплохо изучить все тонкости и получить ответы на все вопросы.

 

Хотя мне и не удалось победить монстра, мне кажется, что я начал понимать суть проблемы. Безуспешно перепробовав несколько устройств (HTC Hermes, Samsung i780, ещё парочка более старых коммуникаторов) я уже собрался сдаться, но неожиданно в мой офис зашёл знакомый с новеньким ASUS P835. Ради шутки мы запустили на нём Donuts2.exe и, о чудо, он заработал. SPBScreenshot не работает с DirectX приложениями, так что вам придётся поверить мне на слово - FPS был на высоте и большое разрешение не было проблемой. 

 

Ради интереса я запустил VirtualMemory на некоторых телефонах и эмуляторе, чтобы просто получить представление, что можно ждать от памяти в подобных случаях на разных телефонах. Адресное пространство DLL идет сверху вниз. Адресное пространство приложений идет снизу вверх. Как я понял, ограничивающим фактором является DLL, загруженная ниже всех.

 

Emulator memory map

Рис . 1. Картапамятинаэмуляторе (Windows Mobile 6.1)

Diamond memory map

Рис . 2. Картапамятина HTC Diamond (Windows Mobile 6.1)

 

Очевидно, что на HTC заранее выделено гораздо больше библиотек. И именно это, похоже, конфликтует с моим приложением. Это цена, которую пользователь платит за обладание супер-интерфейсом типа TouchFLO.

 

Итак, сегодняшние выводы таковы - количество доступной памяти может существенно отличаться от телефону к телефону, соответственно, важно всегда проверять, удалось ли выделить память. При разработке игр это особенно актуально, т.к. приходится загружать много графических ресурсов. 

 

В следующей серии -обрабатываем нажатия клавиш!

 

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