Для работы API DirectStorage понадобится NVMe SSD с интерфейсом PCI-E 3.0 и видеокарта с DirectX 12

Обсуждение статей и новостей сайта
Автор
Повідомлення
yuriy8
Member
Звідки: Львів

Повідомлення

manbearboar: 21.04.2021 23:32
yuriy8: 21.04.2021 14:51Он навіть у АМД 5000 серія працює на 3хх чіпсеті тільки з асроком
Как минимум на Асус тоже есть биосы для ряда мат плат.
Ну мова йде про те що виробники, стараються якісь цікаві фішки впроваджувати тільки в нові продукти для стимулювання продажів (і якби не масове незадоволення людей то й 4хх серія материнок не працювала б з 5000 райзенами) :beer: .
Dark_Diver
Member
Аватар користувача

Повідомлення

Вся фишка в том, что сейчас, для того чтобы ресурсы игры попали, в конце концов, в видеопамять, где они нужны видеокарте, чтобы отрендерить картинку, нужно сделать много разных телодвижений.
Сами ресурсы, например, текстуры, хранятся на накопителе. В упакованном виде (много текстур в одном файле), а, зачастую, ещё и в сжатом - пусть сжатие, обычно, не очень сильное, но многие текстуры хорошо сжимаются даже со слабым сжатием, а без него они занимают слишком много места. Поскольку ресурсов может быть очень много (десятки и сотни тысяч), а пользователи ведь так не любят "мыло", то нужны текстуры высоко разрешения. А работа с огромным количеством файлов никогда не бывает быстрой, даже на SSD. Про обычные диски я вообще молчу - если ресурсы хранятся в отдельных файлах, то пока игра просто разберётся при загрузке, где что хранится и составит в памяти список своих ресурсов, можно пойти себе кофе сделать. Ещё и памяти этот список занимает гораздо больше, чем если всё упаковано в один файл.
Это заметно даже, когда наставишь в игру много распакованных модов - время загрузки игры вырастает ощутимо и папка с игрой так же заметно увеличивается в размерах.
Это я к чему - потому ресурсы игры как минимум упаковывают в небольшое количество файлов и, зачастую, ещё и сжимают каким-либо быстрым алгоритмом сжатия.
И для того, чтобы текстура, например, в конце концов попала в видеопамять, необходимо следующее:
Считать небольшой кусок сжатой текстуры из файла в оперативную память - при этом заняты накопитель, системная шина, к которой он подключён, шина памяти и оперативная память.
Потом, когда этот небольшой кусок считан, центральный процессор обращается к нему в памяти и расжимает текстуру в другое место в памяти - занята память, шина памяти и сам процессор. Процедура расжатия обычно неплохо нагружает процессор и занимает время и память сама по себе.
Операция повторяется, пока не будет считана с диска и расжата в оперативную память вся текстура.
После чего уже эту текстуру можно загрузить в видеопамять GPU, занимая, при этом, шину памяти и системную шину, к которой подключена видеокарта.
Сама текстура, при этом, остаётся в оперативной памяти, потому что видеопамяти, скорее всего, не хватит для всех текстур игрового уровня и её, зачастую, меньше, чем оперативной. И, при необходимости, видеокарта удалит у себя не использующуюся в данный момент текстуру, а потом, при необходимости, опять подгрузит её из оперативной памяти (опять занимая шину памяти и системную).
В общем, достаточно много ресурсоёмкой работы необходимо выполнить железу, системе и игре.
Как этот алгоритм можно изменить - NVMe-накопитель и видеокарта подключены к одной и той же системной шине (PCIe). Можно напрямую отправлять текстуру, даже в сжатом виде, видеокарте, та её будет на лету распаковывать и помещать в видеопамять. Видеокарта может очень быстро выполнять простые алгоритмы, типа распаковки по быстрому алгоритму, да ещё и параллельно.
Это может работать очень быстро, чуть ли на на скоростях линейного чтения, при этом не будут загружены ни процессор (он будет только командовать этим процессом), ни шина памяти и сама оперативная память. Да и видекарта будет загружена именно этим процессом не очень сильно, скорее всего, вообще параллельно процессу обычного рендеринга картинки.
Т.е. либо время загрузки нового уровня можно будет синизить на порядки, либо делать вообще "бесшовную" смену уровня, без прерывания игрового процесса. Ну, разве что, заставить главного героя пролезть через какую-нибудь узкую щель, в которой используется мало текстур, мало объектов и которую легко отрендерить, пока параллельно грузятся ресурсы для нового уровня.
Чтобы всё работало так, как описано, скорее всего необходима поддержка этого механизма самой видеокартой - это не очень сложно реализовать, но если чего-то не хватает, то именно так работать не будет.
В таком случае "прозрачную" поддержку этого механизма надо реализовать в API, типа DirectX и называться она может, ну, например, "DirectStorage".
Разработчики просто используют это высокоуровневое API в своих проектах для загрузки ресурсов, а API само разбирается, что железо умеет, и, при необходимости, берёт часть работы на себя, "по старинке", а что можно - отдаёт железу. В худшем случае всё произойдёт как раньше - с использованием оперативки и процессора, в лучшем - всю работу возьмёт на себя только накопитель и видеокарта. Разработчика это даже может не интересовать вообще, этим будет заниматься DirectX API.
Потом основные распространённые игровые движки типа Юнити и Анриал Энжина включат поддержку этого API - и технология уйдёт в массы.
Dark_Diver
Member
Аватар користувача

Повідомлення

Да, хочу добавить - на консолях и PC алгоритм, всё же, будет отличаться, и на консолях он более эффективный.
Дело в том, что в консолях оперативка=видеопамять. Она быстрая, она одна, объём её заранее известен и он достаточно большой. Текстура, загруженная в эту память доступна как процессору, так и видеочипу. Ещё и специальные оптимизации и контроллеры добавлены для максимально быстрой загрузки ресурсов с накопителя в память без нагрузки на процессор на распаковку.
На PC так не выйдет - текстуры придётся загружать и в оперативную память (которой достаточно много, в теории) и копировать в видеопамять (которой не известно сколько и, скорее всего, меньше оперативки).
Основной выигрыш будет в том, что центральный процессор максимально разгрузят от работы по распаковке текстур. И, судя по картинке, в оперативной памяти будут хранится не распакованные текстуры, а сжатые, т.е. потребуется гораздо меньше оперативки, и, соответственно, меньший объём придётся копировать из неё в видеопамять за меньшее время, а видеокарта сама будет распаковывать текстуры.
Т.е. выигрыш будет, и хороший, но не такой, как на консолях.
И, как я уже писал, поскольку это отдельное высокоуровневое API, то детали реализации всего этого ложатся не на разработчиков игр, а на Microsoft и разработчиков драйверов видеокарт.
Відповісти