Как мога да извършвам действия, докато чакам вертикална синхронизация?

Искам да мога да заредя/изтегля куп ресурси и да уведомя потребителя за файла, който се зарежда в момента, но не мога просто да начертая рамка, след като всеки файл започне да се зарежда, защото v-sync ще изчака, докато може да начертае кадър, преди да продължи (свиване на натоварванията до по-малко от 60/секунда).

Има ли начин да проверя дали устройството е готово за рисуване или не (без хакване „изминала ли е вече 1/60 от секундата?), за да мога да извършвам действия, докато не е готово? Нямам нищо против, ако известието прескочи файлове, които са приключили преди да е готов за рисуване, но искам да увелича максимално скоростта на зарежданията, като същевременно мога да уведомя потребителя.

Също така, бих искал да избегна деактивирането на v-sync дори временно, защото не искам да предизвикам 300 FPS скорост на графична карта, ако компютърът се зарежда много бързо.


person Jengerer    schedule 23.06.2011    source източник


Отговори (1)


Не посочвате коя версия на Direct3D използвате. С D3D9 можете да подадете D3DPRESENT_DONOTWAIT към вашето извикване Present() и то ще върне D3DERR_WASSTILLDRAWING, ако хардуерът е зает с обработка или чака интервал за вертикална синхронизация. Това означава, че ако сте активирали vsync, в основния си цикъл можете просто да извикате Present с флага DONOTWAIT всеки път, когато сте заредили файл, и да заредите друг, ако върне WASSTILLDRAWING.

Обърнете внимание, че трябва да получите веригата за размяна и да извикате Present() във веригата за размяна, вместо да извиквате Present() директно на устройството, за да можете да предадете този флаг на представяне, или можете да го зададете в структурата D3DPRESENT_PARAMETERS, когато създавате устройството или създайте IDirect3DDevice9Ex вместо устройство IDirect3DDevice9 и извикайте PresentEx() вместо Present().

Това обаче не решава проблема с файловете, които отнемат повече от един кадър за зареждане - скоростта на кадрите ви ще спадне, ако имате файл, чиято обработка отнема много време. По-добро решение на този проблем според мен би било да преместите възможно най-голяма част от вашия IO в друга нишка (в D3D9 все пак ще трябва да създавате D3D ресурси в основната си нишка) и просто да предадете името на файла, който е в момента се обработват към вашата основна / нишка за изобразяване, за да се показват всеки път, когато представяте рамка.

person mattnewport    schedule 23.06.2011