Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / [DX9] Снижение подлагиваний при чтении из видеопамяти?

[DX9] Снижение подлагиваний при чтении из видеопамяти?

Поделиться
BorisVПостоялецwww18 окт. 201717:32#0
Юзаю 2*2 размером render target, просчитывая каждые 4 кадра, затем сразу stretchrect в точно такую же. И по прошествии 4 кадров вызываю GetRenderTargetData для копирования в sysmem такого же формата. Я думал, что этот трюк позволит побороть проблемы с max prerendered frames =3 и sli/crossfire, но фактически наблюдаются пропуски кадров у пользователей и все что больше 1 кадра задержки это проблема. Как тогда правильно без подтормаживаний передать небольшой объем данных с видяхи средствами д3д9?
BorisVПостоялецwww18 окт. 201722:42#1
Пофиксил запихав getrendertargetdata после present, а не перед ним. Хз в чем тут логика.
SuslikМодераторwww19 окт. 20174:30#2
GetRenderTargetData() нужен не после Present() и не перед ним, а непосредственно в тот момент, когда тебе данные уже нужны на CPU-стороне, то есть как можно позже. в любом другом случае будет лишняя синхронизация раньше времени. ещё эксперименты показали, что очень большое влияние на производительность оказывает использованный pool и usage для текстуры. я остановился на том, чтобы рендерю в обыкновенный рендертаргет, а потом копирую через CopySubresource() из него в текстуру, которую уже можно Lock'чить.

Правка: 19 окт. 2017 4:30

MrShoorУчастникwww19 окт. 20175:18#3
Suslik
> а потом копирую через CopySubresource() из него в текстуру, которую уже можно
> Lock'чить.
Это DX9. Какой CopySubresource?

BorisV
> Я думал, что этот трюк позволит побороть проблемы с max prerendered frames =3 и
> sli/crossfire
Непонятно что ты пытаешься побороть? Если хочешь избавиться от накапливания 3-х кадров, то зачем ты это делаешь И по прошествии 4 кадров?

SuslikМодераторwww19 окт. 20175:21#4
MrShoor
> Это DX9. Какой CopySubresource?
пардон, у нас во wrapper'е так функция называется. на самом деле это D3DXLoadSurfaceFromSurface().
MikleМодераторwww19 окт. 201713:43#5
Suslik
А D3DXLoadSurfaceFromSurface() сработает для RenderTarget источника?
Можно воспользоваться IDirect3DDevice9::GetRenderTargetData, правда задать Rect не выйдет, придётся копировать весь Surface.
SuslikМодераторwww19 окт. 201713:54#6
Mikle
> А D3DXLoadSurfaceFromSurface() сработает для RenderTarget источника?
конечно, ты же данные не в оперативу при этом тянешь, они на GPU остаются. а вот уже из текстуры, в которую их скопировал, можно вытаскивать.

/ Форум / Программирование игр / Графика

2001—2017 © GameDev.ru — Разработка игр