Приложение .NET CF и исключение нехватки памяти - PullRequest
1 голос
/ 11 ноября 2008

Я занимаюсь разработкой сетевой игры .NET CF 3.5. Моя проблема в том, что приложение загружает все ресурсы в первую очередь. Однако при последующих запусках приложение освобождает память при загрузке ресурсов, особенно звуков или больших изображений.

Пожалуйста, ведите меня

Ответы [ 5 ]

2 голосов
/ 14 ноября 2008

Полагаю, вы не пытаетесь одновременно запускать несколько экземпляров игры. Это звучит так, как будто память не возвращается в ОС после завершения игры. Один простой способ определить, есть ли у вас утечка:

  1. Перезагрузите устройство
  2. Проверьте использование памяти
  3. Запустите игру, играйте несколько минут
  4. Закрыть игру
  5. Подождите несколько минут, затем снова проверьте использование памяти

Если вы можете запустить несколько запусков, прежде чем закончится память, у вас небольшая утечка. Если вы можете запустить только один раз до перезагрузки устройства, у вас есть большой. Сборка мусора пойдет так далеко. Если вы делаете какие-либо вызовы неуправляемого кода (вызовы Win32 или PInvoke, которые создают экземпляры неуправляемых объектов), то вам нужно обязательно освободить эти ресурсы, когда ваша игра закрывается.

0 голосов
/ 14 декабря 2010

Основываясь на опыте программирования на .NET CF, вы подвержены ограничениям памяти, и сборка мусора не соответствует ожиданиям в обычной среде настольных ПК.

В моем приложении всегда вызывая методы Close () и Dispose () до того, как объекты вышли из области видимости, решались проблемы, с которыми я сталкивался при исключениях нехватки памяти.

Если у вас все еще есть проблемы, другой способ попробовать это - подключить обработчик событий закрытия приложения и вызвать GC.Collect (). Это заставит сборщик мусора немедленно собрать все неиспользуемые или утилизированные объекты.

0 голосов
/ 26 января 2009

Возможно, проблема в том, что .NET CF не очень хорошо справляется с моделью памяти Windows CE. (Выделение большого объема памяти завершается неудачей с исключением OutOfMemory, даже если доступно такое большое количество; я не знаю магического числа, при котором вещи начинают ломаться ...)

Вот некоторые детали: .Net Compact Framework Расширенное управление памятью

Самый простой способ обойти это - скопировать данные на оперативный диск (например, \ temp); План Б состоит в том, чтобы использовать что-то по ссылке Marshal.AllocHGlobal или P / Invoke VirtualAlloc (страшно!) вместе с GCHandle.Pin

0 голосов
/ 14 ноября 2008

Microsoft предоставляет нам CLR Profiler, инструмент для анализа поведения вашего управляемого приложения, который вы можете загрузить здесь . Это CLR Profiler для .NET 2.0, но он будет работать с .NET 3.5, поскольку CLR не был изменен.

0 голосов
/ 11 ноября 2008

Сколько памяти занимает ваше приложение после загрузки всех ресурсов? При настройках по умолчанию я получаю эту ошибку, превышающую 1,3 ГБ личных байтов (проверка диспетчера задач и распределения памяти процессов).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...