О неочевидных особенностях использования видеопамяти в Windows
Краткое содержание поста: при отсутствии файла подкачки максимальный объём использующейся видеопамяти ограничивается "свободной" (не зарезервированной) оперативной памятью, размер которой в Windows может падать практически до нуля.
А теперь чуть более подробное, но по возможности всё ещё краткое описание ситуации. Сразу обмолвлюсь, что я не являюсь супер-специалистом в компьютерном железе и, возможно, рассказываю о каких-то супер-очевидных вещах, но лично для меня и нескольких моих знакомых это было открытием, так что, думаю, не помешает сделать на эту тему пост)
Некоторое время назад у меня иногда стали вылетать игры с ошибками о невозможности подгрузки текстур или карты теней. Обычно такое может случаться при нехватке видеопамяти (текстуры просто физически туда не помещаются), но проблема заключалась в том, что из моих 6 Гб оказывались заполненными ну максимум 4 Гб. Начал уже думать о частичном повреждении памяти и решил попробовать полностью её загрузить через MSI Kombustor:
По мониторингу в диспетчере задач и MSI Afterburner было выяснено, что действительно загрузка памяти прекращается по достижению определённого значения и не доходит до максимальных 6 Гб. Подозрителен был тот факт, что значение это всегда разное, чего не могло быть, если бы просто повредился один блок памяти.
Опытным путём было установлено, что момент прекращения загрузки совпадает с окончанием "свободной" части оперативной памяти. Слово "свободной" написано в кавычках, т.к. фактически Windows считает доступной всю оперативную память, которая не используется. Хотя большая часть остатка оперативки при этом может быть забита кэшированными данными (что полезно для ускорения работы), в случае необходимости Windows просто выкинет эти данные и запишет поверх информацию, необходимую для работы программ. В Диспетчере задач эта часть "зарезервированной" памяти обозначается белым прямоугольником:
Проблема в том, что при работе с графикой этот принцип почему-то не работает. Перед загрузкой данных в видеопамять Windows нужно сначала загрузить их в оперативку, и для этого она может использовать только тот "по-настоящему свободный" остаток памяти, что на рисунке я обозначил "доступно". Кэшированные (зарезервированные) данные почему-то не затираются, а должны быть предварительно сброшены в файл подкачки (если вдруг кто-нибудь в комментариях объяснит мне, почему, буду рад). Соответственно, если у вас не используется файл подкачки (а я при своих 16 гигах оперативки так и сделал), объём используемой видеопамяти будет ограничен только "свободной" (в понимании винды) оперативкой. Иногда этот объём может падать практически до нуля. Например, сейчас, когда я пишу этот пост, у меня там всего лишь 180 Мб)
Вывод: для корректного функционирования видеопамяти крайне желательно иметь файл подкачки (желательно по размеру самой видеопамяти), куда при загрузке текстур, карт теней и т.п. из оперативной памяти смогут сбрасываться кэшированные данные. Иначе возможны внезапные вылеты из игр даже при наличии свободной видеопамяти. Если у вас нет файла подкачки, советую попробовать загрузить всю видеопамять хоть через тот же бесплатный Комбустор)
P.S.: видеокарта NVIDIA GeForce GTX 1060


> если вдруг кто-нибудь в комментариях объяснит мне, почему, буду рад
все просто. это механика работы виртуальной памяти.
нельзя просто так взять и освободить блок(особенно отображение файла)
но можно положить в файл подкачки.
приложению отдать память системе непросто.
Уже давно ясно, что файл подкачки нужен всегда. Без него - синька или в лучшем случае, вылет из приложения.
Бро вообще не понял что ты написал.
У тебя есть виртуальная память, которую винда использует.
Виртуальная память -- это:
1. ОЗУ
2. ОЗУ + фикс.файл подкачки
3. ОЗУ + расширяемый файл подкачки.
Если твоя программа "запросила ещё памяти" -- ей винда откусит кусок от этой виртуальной памяти.
Как только ВСЕ ПРОГРАММЫ ВМЕСТЕ попросили памяти больше, чем у тебя есть -- вероятнее всего последняя программа крашится (мало программ умеют обрабатывать "нет памяти").
Заметь ошибка "нет памяти" бывает в случаях, если:
в.1 -- закончилась ОЗУ
в.2 -- закончилась ОЗУ + файл подкачки
в.3 -- закочилось ОЗУ + всё свободное место на диске.
ПС
Чем в этом смысле память под "графические потребности" (не обязательно текстуры, там 3Д модельки могут быть) отличается от любого другого выделения (например под ворд, чтобы текст туда поместился) -- ну по-моему ничем.
> если вдруг кто-нибудь в комментариях объяснит мне, почему, буду рад
Если и правда интересно, то советую навернуть пятую главу Windows Internals и документацию по WDDM. Ответ вкратце - так надо, винде херово без файла подкачки)