Мое приложение CF имеет очень настраиваемый пользовательский интерфейс, используя множество изображений в качестве элементов пользовательского интерфейса. Пользовательский интерфейс чувствует себя намного более гладким, когда эти растровые изображения хранятся в памяти. Когда они загружаются по требованию, пользовательский интерфейс работает медленно, и я вижу кнопки, появляющиеся один за другим, что выглядит очень плохо. Долгое время это прошло довольно хорошо, но в последнее время я обнаружил, что приложение почти использует всю память, которую он может получить, это 32 МБ iirc. Затем я начал использовать удаленный монитор производительности, чтобы узнать, могу ли я найти чистых ящиков памяти.Рекомендации по решению OutOfMemoryExceptions для CF
Как оказалось, получение полезного моментального снимка кучи GC с использованием RPM затруднено: закрытие до того, как я получу исключения из памяти, запрос на моментальный снимок вызывает немедленное генерирование собственного исключения. Тем не менее, я могу найти моментальный снимок GC. Я сохранил его здесь: http://files.zzattack.org/misc/ramis.gclog и скриншот здесь: http://files.zzattack.org/images/ramisgcsnapshot.png Для меня это не выглядит все, что хлопотно, но самым большим объектом является массив байтов, содержащий мой файл ресурсов (около 3 МБ, полный изображений PNG). Используется Alltogeher, 3643304b (около 3,5 МБ) памяти. Эти изображения распространяются по элементам пользовательского интерфейса примерно в 20 различных формах. Я не знаю, какое влияние оказывают отдельные потоки на использование памяти, но одновременно работает около 5-6 потоков, из которых по крайней мере 4 находятся в заблокированном состоянии в 95% случаев.
В программе, когда я пытаюсь загрузить файл с размером 2 МБ, я всегда получаю исключение OutOfMemoryException. Когда я вызываю GC.GetTotalMemory (false), я вижу, что я действительно пытаюсь выделить больше, чем доступно в настоящее время. Вызов GC.Collect и повторная попытка не решают/откладывают мою проблему.
Я хотел бы посоветовать, как решить мою проблему. Мне абсолютно нужны растровые изображения в памяти, но, возможно, я мог бы ограничить количество слотов, доступных для растровых изображений, сохраняя только наиболее часто используемые в памяти и загружая другие по требованию. Вероятно, это длинный снимок, но, возможно, я могу попросить ОС зарезервировать для меня больше памяти? Я точно знаю, что приложение будет работать только на устройствах с достаточным объемом оперативной памяти. Любая помощь приветствуется, спасибо заранее.
Спасибо за ваш комментарий. В старой ситуации я много раз вызывал ResourceManager.GetObject() для загрузки моих растровых изображений. Поскольку мне нужны были очень незначительные варианты локализации и масштабирования (т. Е. Иногда разные разрешения WVGA/VGA изображения), все было получено с помощью статической вспомогательной функции. Таким образом было очень легко добавить механизм кэширования, как вы предложили в этой вспомогательной функции, что привело к сохранению нескольких растровых изображений в памяти. Пока этого хватит, так что спасибо! –