Я делаю игру для iOS в Monotouch с C # и MonoDevelop. У меня очень странная авария.
Исходная информация: создание 2D-военной игры. Я реализовал алгоритм Дейкстры для расчета кратчайшего пути от источника к месту назначения с объектами между ними (пример: идти отсюда туда, но обходить машины/деревья/здания/или что-либо на пути автоматически). Мой сбой, похоже, связан с двумерным массивом байтов, который я создал для этой реализации алгоритма Дейкстры. Посмотрите это изображение, если вы никогда не слышали об алгоритме Дейкстры http://en.wikipedia.org/wiki/File:Dijkstras_progress_animation.gif
По сути, чем больше узлов в моем 2D-массиве, тем больше деталей в движении солдата на поле боя. Если я использую 2400 узлов в своем 2D-массиве, все работает/загружается нормально. Однако, если я увеличу количество узлов до 4266 для получения более подробных координат, программа вылетит при вычислении расстояний до узлов. Он завершается примерно на 30%, прежде чем падает.
Подробнее о сбое: сбой происходит только, когда я использую режим отладки/iPhone или режим выпуска/iPhone. Когда я использую симулятор отладки/iPhone, он работает нормально. И еще одно замечание: когда я создаю приложение и переношу его на свой телефон в режиме отладки/iPhone, затем останавливаю отладчик, открываю XCode Instruments, все работает нормально! Я не могу понять, почему это будет работать в симуляторе и с инструментами XCode, но НЕ с режимом Monodevelop Debug/iPhone. Делает ли XCode Instruments что-то, что «исправляет» проблему? Или отладчик MonoDevelop делает что-то, чтобы "сломать" программу?
Позвольте мне объяснить, что вы видите на скриншоте. Мое приложение называется "WarGame". Глядя на временную шкалу, загрузка ЦП составляла ~ 100% от примерно 2 секунд до примерно 35 секунд. Когда загрузка ЦП падает до нуля, загрузка завершается. Таким образом, буквально потребовалось около 33 секунд, чтобы загрузить 2D-массив узлов и заполнить их расстояниями.
Имейте в виду, что в этом случае при сбое есть 4266 узлов, что означает, что 2D-массив представляет собой массив байтов [4266, 4266]. Итак, это 18 198 756 байт в 2D-массиве. И он успешно загружается при запуске XCode Instruments и успешно загружается при запуске в MonoDevelop Debug/iPhone Simulator. Но он вылетает без сообщения об ошибке при запуске в режиме отладки/iPhone на моем iPhone 4s. Использование памяти этим приложением составляет примерно 60,73 МБ, как показано на снимках экрана.
В экземпляре, который НЕ дает сбой, было 2400 узлов, что означает, что 2D-массив представляет собой массив байтов [2400, 2400]. Итак, это 5 760 000 байтов в 2D-массиве. И этот работал нормально везде.
Проблема явно заключается в том, что когда я увеличиваю количество узлов примерно до 4266 или более, программа падает. Но я не получаю сообщение об ошибке, оно просто внезапно останавливается при загрузке... Может ли это быть проблемой сборки мусора? Вы думаете, что я получу сообщение об ошибке, верно? Может ли это быть проблема "недостаточно памяти"? Но когда он загружается с помощью инструментов XCode, он говорит, что я использую только 60 МБ, а раньше я использовал до 150 МБ в этом приложении в качестве теста, поэтому я знаю, что могу по крайней мере увеличить использование памяти до 150 МБ, прежде чем он выйдет из строя с «ошибкой нехватки памяти».
Вот снимок выделения памяти из XCode Instruments
Вот снимок страницы утечки памяти из XCode Instruments