Найти тему
G-aim

Почему вылетают игры — ошибка «Память не может быть Read»

Всем привет! Не так давно лично столкнулся с такой проблемой: после запуска какой-то достаточно тяжелой игры на ультра пресете графики, спустя несколько минут игра просто вылетает в рабочий стол. В некоторых случаях появляется ошибка «память не может быть 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».
  • Нажимаем «Задать», жмем «ОК».
  • Перезагружаем компьютер.
-2

Ради интереса взглянем на показатели системы во время игры. Оперативная память полностью забита, кэш отправился в файл подкачки, на его место встал игровой движок. При этом видеопамять забита лишь на половину, что подтверждает теорию о том, что в ошибку выбивает именно при трансфере графики.-