Павел @Pavel_Agafonov
Game Developer по образованию. Пописываю на Rust-е
Information
- Rating
- 451-st
- Location
- Санкт-Петербург, Санкт-Петербург и область, Россия
- Date of birth
- Registered
- Activity
Specialization
Game Developer, System Software Engineer
Middle
Rust
C++
Vulkan API
Computer graphics
Golang
gRPC
PostgreSQL
Redis
DirectX
Вы хотя бы проверяйте, что пишете. Из стима:
Судя по отзывам, разрабы просто забросили игру.
Автор тоже приходит к такому выводу и демонстрирует асинхронный подход, но почему-то на графиках также присутствуют "Ожидание GPU0 другой GPU1". Мне это не понравилось, потому что у себя в реализации у меня никакого ожидания: рендеринг карт теней и передача полученной текстуры происходят асинхронно. Я могу посчитать отдельно сколько что занимает, но в общее время кадра оно не входит.
Абстрактный наброс. Будут примеры?
Можно и не добавлять зависимости. Либо напишите, как надо решить, мы RFC-ку расту напишем.
В DirectX12 помимо общей кучи (ID3D12Heap) можно сделать общий фенс (ID3D12Fence). Его могут сигналить и ожидать другие GPU.
Автор в своем коде ставит метки для разных рендер-проходов. У него есть проход с копированием ресурсов, в котором происходит синхронизация двух очередей из разных видеокарт и само копирование. То есть он ставит метку до самой синхронизации и метку после копирования.
С помощью ID3D12QueryHeap я ставлю временные метки (timestamps) на GPU, потом пытаюсь прочитать полученные результаты. Эти результаты отправляю по TCP программе-бенчеру, которая выполняет вычисления средних значений. После сохраняю это в CSV-формате и импортирую в Excel.
Не понял вопроса.
Мое предположение, что производительность будет +- такой же.
К сожалению, не разбираюсь DXVK экосистеме, но я пробежался по vkd3d и vkd3d-proton и понял, что прототип не запустится на vkd3d, так как отсутствует реализация функции
d3d12_device_OpenSharedHandle
, которая используется в моем коде.В vkd3d:
В vkd3d-proton есть реализация, но только для Windows.
Связка дискретная + интегрированная видеокарта встречается не мало. Наибольший прирост популярности и самая большая доля использования среди GPU за последний месяц у NVIDIA GeForce RTX 4060 Laptop GPU. https://store.steampowered.com/hwsurvey/directx/?sort=chg
Да, возможно. Я встречал работы, которые как раз этому посвящены. Только для VR понадобятся видеокарты с одинаковой производительностью.
Я нигде не утверждал, что это решение всех проблем. У меня был гипотеза "Перенос рендера Cascaded Shadow Maps на вторую видеокарту может увеличить производительность". Я реализовал прототип и подтвердил свою гипотезу.
2 гпу - это не требование, а опция. Условная галочка в настройках "задействовать вторую видеокарту" для систем, где несколько видях.
Оптимизации могут быть разные. В данном случае это перенос рендера теней на вторую видеокарту. Если это не оптимизация, то, по вашему мнению, использование нескольких ядер ЦПУ не является оптимизацией?
Дополнительные миллисекунды для бюджета кадра лишними не бывают.
Согласен. Сейчас современные игры без DLSS не вывозят стабильный и высокий фреймрейт.
В Rust работают над решением проблемы цветных фукнций.
В крейте bytemuck есть функция cast_mut. Если без крейта хотите, то через касты указателей в unsafe-е.
Hidden text
Зато прыгать по указателям быстро ?
19 марта выходит обновление 1.6
Надо мерить. Всё зависит от
LIMIT
, если оно большое, то время на синхронизацию будет меньше, чем вычисления, соответственно на бенчмарки сильно не повлияет. Я бы составил таблицу с зависимостью времени отLIMIT
.Метод
init3
работает некорректно, так как он недетерминированный - результаты выполнения потоков объединяются в неопределенном порядке. Из-за этого результат методаinit3
может отличаться от результатов других методов. В данном случае необходима другая логика объединения результатов.По второй ссылке представлены другие варианты бага, например, вместо placeholder-а используется Option:
let f: fn(Option<&'d &'d ()>, &'c T) -> &'d T = foo;
(Сигнатура helper-а другая).Возникнуть теоретически может, если писать код с временами жизни и с вложенными ссылками, а не с
Rc<RefCell<T>>
:)