Что на самом деле происходит, когда видеопамять заканчивается

—

от автора

Котик грустит из-за нехватки VRAM

Котик грустит из-за нехватки VRAM

В сентябре 2026-го разводить холивар о том, хватает ли 8 ГБ видеопамяти, уже как-то неприлично. И даже не потому что вопрос закрыт, а потому что выбора особо не осталось. Ну, посудите сами. RTX 50 Super, которую нам два года обещали как спасение с 3-гигабайтными чипами GDDR7, на Gamescom похоронили окончательно. А то, что осталось на полках, дорожает на глазах: за один только август восьмигиговая RTX 5060 Ti у нас подорожала почти на 30-40%. И не потому что доллар вырос. Реальная причина – это дефицит памяти и то, что партнеры NVIDIA в попытках выжить первым зарезали именно дешевые карточки. Ну, оно и понятно: в условиях, когда чипов не хватает, штамповать копеечную Dual или Ventus – де-факто самоубийство.

С 16-гиговой версией получилось еще интереснее. Вы не поверите, но в конце августа ее вполне можно было взять за 50–60 тысяч. Да, не бесплатно, но в целом терпимо. А сейчас что? А сейчас за нее просят 70-80к, и люди берут. Да и чего бы не брать, если это остатки, которые закупали по старому курсу, а карточки из новой партии обещают быть еще дороже. Так что, восьмигиговая GPU в 2026 году – это уже не компромисс, а данность. И раз нам предстоит с этим как-то жить, давайте разбираться. Нет, не в том, хватит или нет, а в том, что конкретно происходит, когда памяти не хватает. Потому что происходит там, если честно, много всего, и почти ничего из этого в счетчике fps не видно.

Что вообще лежит в этих восьми гигабайтах

Для порядка проведем небольшую инвентаризацию. Потому что думать, что VRAM – это текстуры, – упрощение, из-за которого потом и рождаются странные выводы вроде того, что вы вот поставили текстуры на средние, а оно все равно икает.

Возьмем обычный рендер с отложенным освещением в разрешении 1440p и с активным DLSS в режиме Quality (то есть внутри у нас будет 1707×960) и прикинем на пальцах, куда на самом деле деваются 8 ГБ VRAM и почему текстурам из них достается меньше половины.

Из 8 ГБ самой игре достается в лучшем случае половина

Из 8 ГБ самой игре достается в лучшем случае половина

Первое, что отъедает память, – это буферы. И никуда вы от них не денетесь просто потому, что собрать без них кадр ну никак не получится. Поэтому они сидят в VRAM постоянно, вне зависимости от того, какие текстуры вы выставите. А дальше идут геометрия, трассировка и все нейросетевое, и вот там цифры уже зависят не от настроек, а от того, какую игру вы запустили и какие галочки в ней включили:

Потребитель

Сколько занимает

G-buffer, буферы постобработки, тени, история кадров для TAA и DLSS, вывод на экран

300–600 МБ в сумме

Пул кластеров Nanite в UE5

около 512 МБ по умолчанию

Вертексные буферы открытого мира

еще сотни МБ

BVH для трассировки

1,5–2 ГБ в открытом мире с динамикой

DLSS-апскейлер

около 85 МБ, то есть копейки

Генерация кадров

1–1,5 ГБ в 1440p с мультикадровой генерацией

По генерации кадров стоит пояснить отдельно. Модель из DLSS 3 отъедала 1,5–2 ГБ, в DLSS 4 ее сделали экономнее процентов на 30, но 1–1,5 ГБ она все равно попросит, потому что несколько полноразмерных кадров держать где-то надо. А что касается DLSS 5, которая вышла на этой неделе, то данных по ней пока нет. Но раз она опять только для RTX 50, дешевле она точно не стала.

И вот только после всего этого очередь доходит до текстур. Только что им там остается-то? А остается, как вы понимаете, немного. Ведь на тех же 8 гигах сидит и кэш шейдеров, и композитор рабочего стола, и браузер с аппаратным декодированием видео, и все, что у вас открыто на фоне. Вот и получается, что до текстур доходит в лучшем случае 4–4,5 ГБ, а иногда и того меньше.

Отсюда и ирония, о которой маркетологи на коробке не пишут: фичи, которыми NVIDIA оправдывает ценник даже у младших карт, – и трассировка, и мультикадровая генерация – на восьмигиговой карте сами же и съедают около 3 ГБ из этих восьми еще до того, как игра загрузила первую текстуру. Отсюда и все вытекающие из недостатка VRAM нюансы: включаете вы, скажем, генерацию кадров, а она вместо того, чтобы улучшить fps, наоборот, делает только хуже.

А все потому, что ее буферы – это тот самый лишний гигабайт, который выталкивает игру за бюджет, и рывки от переполнения съедают весь выигрыш от нарисованных кадров. Так что если карта уперлась в память, первым делом выключать надо не текстуры, а генерацию.

Занято – не значит нужно

Хорошо, расход есть, и не маленький, скажете вы. Но зачем так все усложнять, если можно просто посмотреть, сколько памяти игра использует в реальности? Тем более, что для этих целей придумали целый Afterburner. Но тут есть подвох: цифра, которую все принимают за пруф, врет. Ну ладно, не врет, а просто показывает не то, что вы думаете. Но это, откровенно говоря, ничем не лучше.

Потому что показывает она не сколько памяти игра использует де-факто, а сколько под нее выделил драйвер. А это вообще не одно и то же. Ведь движки берут память с запасом: выделять ее в D3D12 дорого, и делать это посреди кадра никому не хочется. Так что игра, у которой в мониторинге занято 7,8 ГБ из 8, на деле может использовать только 5,5, а остальное держать про запас на всякий случай.

Вот такое мыло вы будете наблюдать, если памяти не хватит. Ну и низкий fps в придачу

Вот такое мыло вы будете наблюдать, если памяти не хватит. Ну и низкий fps в придачу

Поэтому куда честнее смотреть на выделенную память конкретного процесса в диспетчере задач или на счетчик GPU D3D memory dedicated в HWiNFO. Другое дело, что и эта цифра не показывает главного: сколько памяти игре вообще позволено занять. А позволено ей, между прочим, совсем не 8 ГБ. Дело в том, что Windows через QueryVideoMemoryInfo выдает каждому процессу свой бюджет, и на восьмигиговой карте он обычно составляет 6,5–7 ГБ, смотря кто еще висит на видеокарте.

Причем бюджет этот постоянно меняется в зависимости от текущего процесса. Свернулись вы, скажем, в браузер на 2 минуты, и он упал. Вот только когда вы вернулись, вообще не факт, что бюджет вернется вместе с вами. Поэтому одна и та же игра на одинаковых сборках у одного человека работает нормально, а у другого через час начинает дергаться. 

Кто вообще всем этим рулит

Выдает этот бюджет и забирает его обратно, скажу сразу, точно не видеокарта. И даже не игра. Рулит всем менеджер видеопамяти внутри WDDM – та самая штука, которая сидит в ядре Windows еще с Висты, о которой мы недавно рассказывали, и которую под DX12 переписали в WDDM 2.0.

Тут сразу оговорюсь, чтобы не отхватить в комментариях: само по себе железо в страничные промахи умеет еще с Pascal, но графический стек на это не рассчитывает. WDDM и D3D12 требуют, чтобы все, что GPU может тронуть в текущем кадре, заранее лежало там, откуда он читает напрямую. А таких мест два: своя VRAM и кусок обычной оперативки, который Windows отдает под видеокарту и который GPU видит через GART как продолжение своей памяти. Этот кусок вы наверняка видели: это та самая общая память графического процессора в диспетчере задач, которая на 32 ГБ оперативки показывает 16 и выглядит чистой халявой. Только халявы не бывает, и чуть ниже станет понятно, почему.

В D3D11 и OpenGL за все это отвечал драйвер, а в D3D12 и Vulkan бюджет отдали приложению: теперь движок и сам следит за Budget, и сам ужимает пул текстур, и сам дергает Evict, когда прижало. Если движок все это умеет, вы получаете мыло, но хотя бы плавное. А вот если не умеет, за дело берется системный менеджер, и вот тут-то и начинается самое интересное.

Как только процесс перевалил за бюджет, менеджер начинает переселять выделенные блоки в тот самый кусок оперативки. Причем не выгружать в своп, как многие думают, а переносить туда, откуда GPU может читать данные напрямую по шине. Игра, кстати, об этом даже не узнает: суслика она не видит, хоть он и есть. Она рисует себе дальше как ни в чем не бывало, просто часть ресурсов теперь лежит в DDR5 на другом конце PCIe. И каждое обращение к ним идет уже не на 448 ГБ/с, как у GDDR7 на 5060 Ti, а ровно на столько, сколько даст шина. А шина у RTX 5060 и 5060 Ti – это x8 (у RX 9060 XT все 16 линий, и это один из немногих ее настоящих козырей), так что и считать будем для x8:

Откуда GPU читает данные

Пропускная способность

Своя GDDR7 у 5060 Ti

448 ГБ/с

PCIe 5.0 x8

64 ГБ/с

PCIe 4.0 x8

32 ГБ/с

PCIe 3.0 x8

16 ГБ/с

Оперативка DDR5-6000, двухканал

около 96 ГБ/с

Оперативка DDR4-3600, двухканал

около 50 ГБ/с

Оперативка в таблице, кстати, указана не просто так. Ведь за шиной стоит еще и контроллер памяти процессора, и весь канал упирается в самое узкое из двух звеньев. Вот и получается, что в худшем случае, когда восьмигиговая карта стоит на B450 с DDR4, между GPU и текстурой, которая нужна ему прямо сейчас, лежит канал в 16 ГБ/с. То есть не 448 как надо, а в 28 раз меньше. И это мы еще не считаем задержки, которые тоже влияют на конечный результат, и притом весьма заметно.

Но и это еще не все, потому что при постоянном превышении бюджета менеджер начинает гонять блоки туда-сюда каждый кадр: один вытеснил, другой вернул, а в следующем кадре все наоборот. Microsoft в документации так прямо и пишет: процесс, который не влезает в бюджет, будут периодически замораживать, чтобы дать поработать остальным. Вот вам и фризы на 100–300 мс, которые ни один средний fps в жизни не поймает, просто потому что за секунду они растворяются в среднем.

Выселяет менеджер из VRAM, правда, далеко не все подряд. Приложение может расставить приоритеты через SetResidencyPriority, и нормальные движки так и делают: буферам кадра и DLSS – высокий, подгружаемым текстурам – низкий. Плюс драйвер помнит, что и когда использовали, а буферы кадра трогают каждый кадр, так что в хвост очереди они не попадают почти никогда, да и кто ж их выселит, они же памятник.

Первыми на вылет идут текстуры локации, из которой вы ушли 2 минуты назад, поэтому при небольшом переполнении картинка и не разваливается. Вот только редко нужное и совсем ненужное – это не одно и то же. Стоит развернуться на 180°, и холодные текстуры нужны прямо сейчас, причем все разом, а лежат они по ту сторону PCIe. Отсюда и типичная картина переполнения: ровные 60 fps, пока бежишь вперед, и провал до 15, стоит только резко повернуть камеру в сторону.

Как это выглядит в игре: три сценария и один обман

Вот эти три сценария

Вот эти три сценария

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

Сценарий первый, вежливый. Это когда движок умеет считать. Такие движки, как UE5, id Tech или Decima, держат для текстур отдельный пул с жестким лимитом, и как только они переполняются, то просто выбрасывают верхние мипы. Игра при этом не тормозит: fps ровный, редкие кадры в порядке, в тестах все прилично. А потом вы подходите к NPC и видите лицо, у которого текстура на пару мипов ниже, чем у стены за спиной. 

Помните Hogwarts Legacy на релизе, где на мыльные лица не жаловался только ленивый? Вот это оно и было. И это не баг. Движок сделал ровно то, что должен был: не дал игре упасть, а пожертвовал картинкой. Самое противное здесь в том, что обзоры с графиками fps этого не показывают в принципе, потому что на графике-то все хорошо. В итоге вы купили карту, она вроде тянет, и только через месяц замечаете, что текстуры на высоких выглядят примерно как на средних у соседа с GT 1050.

Ручка у этого поведения, кстати, вполне конкретная: в UE это r.Streaming.PoolSize, в id Tech – ползунок текстурного пула, тот самый, из-за которого Indiana Jones на пресете Supreme не давал себя запустить на 8 ГБ. И не потому что игре и правда нужно 12, а потому что мылить движок не умеет и не хочет.

Сценарий второй, честный. Это когда движок не ужимается или ужиматься ему уже некуда, и тогда за дело берется системный менеджер с переселением в оперативку. И вот тут уже начинаются настоящие цифры. TechSpot гонял RTX 5060 Ti 8 ГБ против 16 ГБ на разных поколениях PCIe, и в тяжелых сценах на PCIe 3.0 восьмигиговая выдала 27 кадров в среднем и всего 9 по редким (тот самый 1% low). Шестнадцатигиговая на тех же настройках оказалась быстрее на 130% в среднем и на 411% по редким. 411%, на минуточку, между двумя картами с одним и тем же чипом. А у ComputerBase на 27 играх в 1440p вышло так:

  • в 12 играх у 8 ГБ проблем нет;

  • в 11 – небольшие, по их меркам это минус 19% fps в среднем, но играть еще можно;

  • в 9 – либо слайд-шоу, либо не запускается вовсе.

И это на PCIe 5.0. Что характерно, загрузка GPU при этом нередко проседает до 70%, и народ идет менять камень. А камень-то вообще ни при чем: чип просто ждет данные с другого конца шины. Так что упавшая загрузка – это симптом, а не диагноз. Диагноз – это когда общая память ползет вверх при выделенной в потолке.

Сценарий третий, окончательный. Это когда CreateCommittedResource возвращает E_OUTOFMEMORY, движок не знает, что с этим делать, и вы видите то самое «Out of video memory trying to allocate a rendering resource» (как это по-русски?). Обычно это случается в UE на загрузке уровня или при компиляции шейдеров, когда игра пытается создать что-то большое одним куском, например структуры для трассировки или буферы генерации кадров. Иногда вместо этого прилетает DXGI_ERROR_DEVICE_REMOVED и перезапуск драйвера по таймауту, и тогда экран моргнул, а игра закрылась.

А теперь обещанный обман. Дело в том, что ровно эта же ошибка про нехватку видеопамяти с 2024 года массово вылетает у владельцев Core i9-13900K и 14900K. Причем с RTX 4090 и 32 ГБ оперативки, где никакой нехватки нет и быть не может. Всему миной деградация Raptor Lake: нестабильность на высоких частотах ломает компиляцию шейдеров в UE, а движок заворачивает любой сбой выделения памяти в одну и ту же строку. Люди меняли видеокарты, а помогала в итоге прошивка BIOS с новым микрокодом. Так что если ошибка про видеопамять, а карта у вас на 16 или 24 ГБ, сначала проверьте процессор. Я серьезно.

PCIe как множитель, а не как причина

Несмотря на то что PCIe 3.0 всплывал в этой статье чуть ли не в каждом разделе, о самом-то главном мы так и не поговорили – а именно виновата ли шина сама по себе? Спойлер: нет.

Как PCIe влияет на итоговую картинку

Как PCIe влияет на итоговую картинку

Пока данные лежат в VRAM, по шине ходит мелочь вроде командных буферов и обновлений констант, и ей хватает любого поколения PCIe. Так что менять плату ради одной шины смысла нет, и кто говорит обратное, тот перевирает.

Другое дело, что происходит, когда игра вылезла за бюджет. Тут шина из мелочи превращается в единственный канал, по которому GPU достает выселенные текстуры, и вот здесь поколение решает все. То, что на PCIe 5.0 обошлось бы парой рывков, на 4.0 уже заметно, а на 3.0 превращается в неприемлемые 9-10 кадров. Так что шина – не причина беды. Шина – это ее множитель.

А ведь кто у нас вообще берет восьмигиговые карты? Явно не владельцы X870E. Их берут на B450, B550 и Z490, то есть на все то, что стоит у людей с 2019–2021 года и что менять никто не собирается. Ну, а что? Процессор-то еще нормальный, а переезд на AM5 с нынешними ценами на плашки DDR5 – это тысяч 45–50 сверху. Вот и получается связка, где самая уязвимая к переполнению карта встает на платформу с самым узким аварийным каналом.

Чем это ловить, если не Afterburner

Средний fps и Afterburner, как мы уже выяснили, переполнение не ловят. Зато его ловят три другие вещи, и ни одна из них не требует ничего сложнее бесплатной утилиты.

  • Первая – это время кадра вместо fps. Откройте PresentMon или CapFrameX с графиком времени кадра, и переполнение будет видно сразу. Выглядит оно не как 45 вместо 60, а как ровная линия с одиночными шипами по 80–200 мс, которые вылезают на повороте камеры или на входе в новую зону. На графике fps все это размазывается в незаметный процент, а на графике времени кадра торчит так, что не пропустишь.

  • Вторая – это два счетчика в HWiNFO рядом: GPU D3D memory dedicated, то есть выделенная, и GPU D3D memory dynamic, то есть та самая общая. Пока динамическая держится около нуля, все в порядке. Поползла вверх при выделенной в потолке, значит, текстуры уже уехали на другой конец шины. А вот если выделенная не в потолке, а мыло есть, то это первый сценарий, и крутить надо пул текстур в настройках, а не бежать за новой картой.

  • Третья – это слот. GPU-Z покажет, на каком поколении PCIe и на скольких линиях карта реально договорилась с платой. Карта x8 на PCIe 3.0 – это не чуть медленнее, это вдвое уже аварийный канал у карточки, которой он понадобится первой. А если криво вставили или воткнули через райзер и линк договорился на x4, то все, что выше, умножается еще на два.

Сухой остаток

Да, 8 ГБ стоят дешево. Но нужна ли вам такая экономия?

Да, 8 ГБ стоят дешево. Но нужна ли вам такая экономия?

Если совсем коротко, то нехватка видеопамяти в 2026-м – это не одна проблема, а лестница из 4 ступенек: мыло, рывки, вылет и ложный вылет по вине процессора. И ни одну из них средний fps не покажет. Смотреть надо на время кадра, на динамическую память рядом с выделенной и на то, на скольких линиях договорился слот. Ну и на текстуры: высокие вместо ультра на восьмигиговой карте почти всегда лучше, чем ультра, из которых движок все равно выкинул верхние мипы.

Что до обещанного спасения в виде нейросетевого сжатия текстур, то заграница нам поможет, но не сейчас. NVIDIA показала на GTC сцену, где текстуры в BCn занимают 6,5 ГБ, а в NTC – 970 МБ, и это красиво. Вот только режим, который экономит VRAM на самом деле, стоит по замерам Tom’s Hardware 0,5–0,85 мс на кадр в одном проходе, без DLSS шумит так, что смотреть больно, и, по словам разработчика NTC Алексея Пантелеева, «жизнеспособен только на самых быстрых GPU». То есть на тех, у которых памяти и так хватает. А коммерческих игр с NTC на сегодня попробуй отыщи, так что это технология для следующего поколения консолей и для ждунов RTX 60.

Софт когда-нибудь догонит железо, но не в этом поколении и не на этих картах. А пока память дорожает быстрее, чем программисты учатся ее экономить, единственный рабочий способ не упереться в VRAM – просто в нее не упираться. Скучно, зато проверено.

ссылка на оригинал статьи https://habr.com/ru/articles/1085090/