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, загруженная ниже всех.
Рис . 1. Картапамятинаэмуляторе (Windows Mobile 6.1)
Рис . 2. Картапамятина HTC Diamond (Windows Mobile 6.1)
Очевидно, что на HTC заранее выделено гораздо больше библиотек. И именно это, похоже, конфликтует с моим приложением. Это цена, которую пользователь платит за обладание супер-интерфейсом типа TouchFLO.
Итак, сегодняшние выводы таковы - количество доступной памяти может существенно отличаться от телефону к телефону, соответственно, важно всегда проверять, удалось ли выделить память. При разработке игр это особенно актуально, т.к. приходится загружать много графических ресурсов.
В следующей серии -обрабатываем нажатия клавиш!
Автор перевода: Андрей Коновалов