Меню

Сергей Драган

Разработка игр и разные мысли

Учим 32битное приложение грамотно использовать память в 64битной Windows

В работе с Flash CS5.5 я столкнулся с проблемой, связанной с обработкой больших (>130 Мб) fla с обилием векторной анимации. Периодически при попытке сохранения или при операциях вроде копирования/вставки Flash выдавал мне окно с сообщением о недостаточном объёме памяти. «Алоэ! Ты в своём уме?», — удивлённо бормотал я, глядя на 4 Гб оперативной памяти и столько же — файла подкачки. Да и диспетчер задач как бы показывал, что Flash.exe откушал всего около 1,5 Гб.

low_memory_error

Небольшой гуглёж подсказал, что, оказывается, 32битная Windows не видит не только свыше 4 Гб ОЗУ, но и их-то не все может использовать, а только около 3,5 Гб. Не совсем поняв, как это относится к моей ситуации (флэш-то, вон, только полтора берёт, остальная память, за вычетом скушанного самой Windows да всяким фоновым софтом навроде антивируса, остаётся неиспользованной), решил, что 32битная Windows просто жалеет отдавать всю доступную память флэшу.

О дальнейших экспериментах — под катом.

Погуглив ещё, узнал, что да, действительно, 32битная Windows имеет ограничение на максимальную выделяемую каждому процессу память, на которое и наткнулся флэш (справедливости ради должен отметить, что немного поднять этот предел можно вроде как добавив параметр в boot.ini).

«Ладно, может, тебе так больше понравится», — почесал репу ваш покорный слуга и переустановил ОС на Windows 7 x64. А для надежности ещё и 8 Гб ОЗУ в материнскую плату запихнул. ОС установилась, все 8 Гб увидела, все драйверы приняла, оборудование и софт отлично работают.

«Отлично», — думаю, и уже руки потираю, — «сейчас поставлю себе 64битный флэш, и буду с какими хошь файлами работать». За этим обнаружилась следующая проблема: в природе не существует 64битной версии Flash CS Pro. Photoshop — есть; Premiere Pro и After Effects, вон, вообще только 64битные; а вот флэша 64битного — нет. Т.е. флэш как бы при всём желании не сумеет использовать больше, чем те самые полтора-или-около-того-гигабайт, выделяемых 32битной ОС (а 32битные приложения на 64битной ОС работают, как известно, в режиме совместимости, не имея возможности использовать преимущества 64 бит).

Со слабой надеждой всё же попробовал выполнить во Flash CS5.5 вызывавшее ошибку действие (мало ли, мол, а вдруг произойдёт чудо!) — выделил все символы в library, сделал Copy, создал ещё один файл и, не закрывая первый, нажал Paste. Память, потребляемая Flash.exe медленно выросла примерно до 1,5 Гб, затем остановилась. Ещё через минуту вывалилось знакомое сообщение о нехватке памяти.

Бросился донимать Гугл расспросами, как же мне, мол, быть. На форуме flashgamedev.ru увидел одну тему, посвящённую вопросу использования 64битных ОС, но о моей проблеме в ней не было ни слова. Просто упоминалось, что Flash работает одинаково на 32 и на 64 системе. «Ага, я уже заметил», — с лёгкой досадой пробурчал себе под нос.

А потом наткнулся на решение своей проблемы! Нашлась утилита с незамысловатым названием «4Gb patch», которая каким-то образом патчит 32битный exe’шник, заставляя его работать с памятью вплоть до 4 Гб. В описании утилиты значится: «In order to achieve this, a flag has to be set in the file’s internal format. This is, of course, very easy for insiders who do it every day with the CFF Explorer. This tool was written because not everybody is an insider, and most probably a lot of people don’t even know that this can be achieved.». С некоторым сомнением, предварительно тщательно обнюхав утилиту со всех сторон антивирусом и спросив гугл, доверяет ли он автору, запустил её, и, сделав бэкап, указал на C:\Program Files (x86)\Adobe\Adobe Flash CS5.5\Flash.exe. Бодро сделав своё дело менее, чем за секунду, софтина отчиталась, что всё замечательно, можно проверять.

Результат действительно порадовал. Теперь при копипасте всего содержимого библиотеки в новый проект Flash.exe скушал около 2,1 Гб памяти, и успешно завершил действие. Затем, как в старом анекдоте про сибирских мужиков и немецкую бензопилу, я попробовал повторить операцию, создав ещё один файл. Flash взял 3,5 Гб памяти и тоже справился с задачей. Правда, когда я, вконец обнаглев, попытался сделать это в третий раз, приложение вывалилось с ошибкой. Ну да и ладно, я Crysis на флэше делать не собираюсь, мне 3,5 Гб хватит с головой.

Прилагаю скриншоты диспетчера задач на пике потребления памяти во время копирования-вставки. Flash.exe — это пропатченный экзешник, Flash_32.exe — это его бекапная копия до применения патча.

До:

Task Manager до

После:

Task Manager после

Спасибо за внимание!

UPD: Нашёл в каком-то FAQ по памяти.
Помните, что максимальное количество оперативной памяти, которое 32-битная версия Windows может выделить приложению составляет 2Гб по умолчанию и 2,7Гб, если ОС запущена с ключами /PAE и /3GB в boot.ini, а приложение откомпилировано с поддержкой такой возможности. Поэтому использование более 3Гб оперативной памяти совместно с 32-битными «десктопными» (не серверными!) ОС в подавляющем большинстве случаев совершенно не оправдано.