2012-04-29 7 views
2

Я недавно получал немного отставания, так как я переместил весь мой код рендеринга C# SlimDX DX11 из моей формы (да, я ленивый разработчик), чтобы на заказ. Я хлопнул свою программу в EQATEC Profiler и получил это как основной вклад в моей лаг:Swapchain.Present() слишком долго, вызывая отставание

EQATEC Profiler results showing function postRender() to be at fault

Теперь ясно, что здесь что бы ни в postRender() действительно коробления драгоценные миллисекунды. На самом деле, какой бы сумасшедший, запутанный код, который у меня есть, эффективно снижает частоту кадров до ~ 15 FPS самостоятельно.

Так что же в postRender()? Только одна строка кода:

swapChain.Present(0, PresentFlags.None); 

Я просто понятия не имею, что приводившая замедлить настолько, что я не сделал каких-либо изменений в код swapchain вообще. Все, что я изменил, это разрешение экрана (1680x1050), но это должно быть абсолютно нормально (для справки, эта машина может запускать crysis2 при максимальных настройках при этом разрешении, не разбивая пота).

Есть ли у кого-нибудь идеи, что может заставить swapchain так долго представлять или где я должен смотреть дальше на проблемы?

EDIT:

Глядя на структуру моего кода, функция моя RenderFrame() выглядит следующим образом:

preRender(); 
DeferredRender(preShader); 
//Composite scene to output image 
CompositeScene(compositeShader); 
//Post Process 
PostProcess(postProcShader); 
//Depth of Field 
DoF(dofShader); 
//Present the swapchain 
postRender(); 

Результаты некоторых из этих функций на основе функций ранее (например, , DeferredRender использует четыре цели рендеринга для захвата Diffuse lighting, Normals, Positions и Color в пиксельном режиме. Затем CompositeScene объединяет их. Это потребует, чтобы графический процессор вычислил предыдущий шаг, прежде чем он сможет продолжить. наряду с DoF, требующим результатов PostProcess и т. д. Поэтому единственный шейдер, который возможно, будет содержать Swapchain.Present() вверх должен быть шейдер, который работает в функции DoF, так как все остальные шейдеры заставляют CPU блокироваться, пока они не закончатся. Верный?

+0

Вы нашли решение проблемы? – Kayn

+0

@ Kayn Да, один из моих шейдеров был невероятно неэффективным, и это поддерживало настоящий шаг. –

ответ

1

Есть несколько причин, по которым вы можете найти Present(), занимающее столько времени в вашем фрейме. Текущий вызов является основным методом синхронизации между CPU и графическим процессором; если ЦП генерирует кадры намного быстрее, чем GPU может их обрабатывать, они будут стоять в очереди. Когда буфер заполняется, Present() превращается в прославленный вызов Sleep(), пока он ждет его выхода из системы.

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

Также взгляните на свое приложение, используя один из доступных профилей GPU; PIX хорош как базовая точка, в то время как у NVIDIA и AMD есть свои более конкретные предложения для собственных продуктов. Наконец, убедитесь, что ваши драйверы обновлены. Если в драйвере есть ошибка, любой случай, который вы имеете при обсуждении проблемы, выходит из окна.

+0

Спасибо за обновление. Прошу прощения за ограниченную информацию, приведенную здесь, но я действительно не был уверен, что будет актуальным, а что - нет - отсюда и мой призыв дать советы о том, где я должен смотреть дальше.Это должно быть что-то в пиксельных шейдерах, тогда как отставание становится заметно хуже, когда разрешение экрана увеличивается, но не становится заметно хуже, когда геометрия увеличивается. Я посмотрю на них и посмотрю, что я могу выкопать. Еще раз большое спасибо! –

+0

Это, вероятно, указывает на обработку скорости заполнения. В таких ситуациях я заменяю свои пиксельные шейдеры простыми версиями и пробую их. Различия во времени четко показывают, что может быть узким местом. – Ani

+0

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

 Смежные вопросы

  • Нет связанных вопросов^_^