Всем привет! Не так давно лично столкнулся с такой проблемой: после запуска какой-то достаточно тяжелой игры на ультра пресете графики, спустя несколько минут игра просто вылетает в рабочий стол. В некоторых случаях появляется ошибка «память не может быть Read» или «Out of memory».
Возьмем за пример Need for Speed Heat, где эта ошибка проявляется наиболее стабильно и четко и попытаемся докопаться до истины.
При выкручивании графики на максимум до первой гонки игра доехать не даст ни при каких обстоятельствах, при понижении графики до средних значений – все нормально, никаких ошибок нет, гонка проходится, и игра спокойно движется по сюжету. Давайте разберемся, почему так происходит.
Конфигурация компьютера подразумевает GTX 1660 c шестью гигабайтами GDDR6 памяти, думаю, ругаться на недостаток видеопамяти не стоит, идем дальше. Быть может, узким горлышком является 8 гигабайт оперативной памяти? Ведь действительно, в некоторых моментах игра подвисает, подгружая локацию, но это никоим образом не должно выбивать ошибку, ведь есть целых 4 гигабайта файла подкачки. Так я думал раньше, ведь никогда не обладал таким размером видеопамяти и не выкручивал текстуры на максимум.
Если открыть диспетчер задач, видно, что структура памяти отличается от выводимого графика. Есть часть используемой памяти, которая и заполняет график ОЗУ, все нормально. Но от оставшейся памяти огромный кусок в 3 гигабайта резервируется системой под кэш, он никак не используется и служит чем-то вроде буфера для системных процессов. По-настоящему свободной памяти, которая никак не задействована, на деле всего порядка 300 мегабайт.
Вот что происходит во время игры на самом деле:
- Игры под Windows не могут загружать графику с диска напрямую в видеопамять и перед этим файлы размещаются в оперативной памяти.
- При запуске игры первым делом в оперативную память загружается игровой движок, который уже в процессе игры начинает подгружать всю графику.
- Соответственно, при полном заполнении ОЗУ, система загружает данные в файл подкачки. Именно в него отправляется весь кэш, освобождая пространство для тяжелого приложения в оперативной памяти. Маленький размер файла подкачки и вызывает ошибку, которая намекает, что данных для загрузки больше нежели свободной памяти.
Да-да, я столько распинался для того, чтобы сказать о файле подкачки, но ведь всегда полезно понимать из-за чего именно возникает ошибка, а не слепо ее устранять.
Получается такая картина, что игровому движку, чтобы себя прокормить недостаточно 4-5 Гб ОЗУ, часть данных движка уходит в файл подкачки, где встречает уже размещенный кэш операционной системы размером 3 Гб. В оставшиеся крохи, движок распихивает модели и текстуры перед отправкой в видеопамять, но в процессе игры графики неожиданно становится слишком много для трансфера через ОЗУ к видеокарте. Заполняется оперативная память, заполняется файл подкачки, система дает команду на запись и натыкается на отказ, т.к. места больше нет. Тогда и возникает злополучная ошибка «память не может быть Read» или «Out of memory» и т.п.
Повышаем размера файла подкачки
А теперь, для тех кто не знает, как изменить файл подкачки, небольшой туториал.
- Правой кнопкой мыши жмем на значке «Мой компьютер», выбираем свойства.
- В левом меню выбираем «Дополнительные параметры системы»
- Переходим в «Параметры» вкладки «Быстродействие»
- В верху выбираем «Дополнительно»
- Внизу видим область «Виртуальная память», где указан текущий размер файла подкачи, нажимаем «Изменить».
- Убираем галочку с «Автоматически выбирать объем файла подкачки».
- Выбираем диск «С» и жмем «Указать размер».
- Указываем размер равный 1,5-2 размерам оперативной памяти. В моем случае это 16 гигабайт. При этом исходный и максимальный размер лучше указать одинаковым, чтобы избежать фрагментации диска, а также не ставить файл подкачки на диск «D».
- Нажимаем «Задать», жмем «ОК».
- Перезагружаем компьютер.
Ради интереса взглянем на показатели системы во время игры. Оперативная память полностью забита, кэш отправился в файл подкачки, на его место встал игровой движок. При этом видеопамять забита лишь на половину, что подтверждает теорию о том, что в ошибку выбивает именно при трансфере графики.-