Vasara 4 Share Posted February 19 Добрый день. При запуске вычислительного шейдера в цикле увеличивается время возврата данных. Чем больше счётчик, тем дольше время возврата данных из памяти. Если шейдер пустой, данные возвращаются несколько минут. Если добавить в шейдер какую либо логику, возврата текстур вообще не дождаться. Так же растёт время выполнения самого шейдера. ptrRenderTarget->enableCompute(); for (int i = 0; i < 50000; i++) { material->renderCompute(Render::PASS_POST, 512, 512); } ptrRenderTarget->disable(); Предполагаю где-то не отпускается какой-то ресурс и происходит переполнение. getImage() вылетает с ошибкой: D3D11Texture::getImage(): can't map 16384x16384 2D texture Рабочий ли вообще такой вариант с циклами или надо выносить в апдейт и там как то всё это обрабатывать? С Уважением Константин. Link to post
sweetluna 11 Share Posted February 20 Добрый день. Это весь код, что выполняется или опущены какие-то детали? 50к диспатчей 512x512x1 это огромный запрос для GPU, тем более для текстуры 16384x16384. Лично у меня вылезает еще ошибка о нехватке памяти: Direct3D11 error: out of memory D3D11Texture::getImage(): can't create R32U 16383x16383 2D staging texture Обычно так не делают на GPU, советую уменьшить размеры текстуры и работать над меньшими размерами. Link to post
Vasara 4 Author Share Posted February 20 (edited) Ничего лишнего, только инициализация текстуры в шейдере. Всё было убрано, чтобы быть уверенным, что с моей стороны нет ошибок. 8 гигов памяти у видеокарты. Если все ресурсы отпускаются правильно, должно работать. Гдето утечка. Я бы грешил на command list, но не помню точно, как это в dx11 сделано. Ошибки памяти нет даже после 1кк итераций с 5 текстурами. Edited February 20 by Vasara Link to post
Recommended Posts