DirectX anwendung wird nach ersten 5 sekunden langsamer
Verfasst: 02.05.2014, 22:26
Ich arbeite gerade an einer DirectX 11 Anwendung für meine Master-Arbeit. Dabei muss ich folgendes Phänomen beobachten:
Ich messe die Zeiten verschiedenere grob aufgelöster Renderabschnitte mit timer queries. Wenn ich meine Anwendung frisch starte, sehe ich 5 sekunden lang Werte in Millisekunden die ich erwrarten würde. Nach 5 Sekunden allerdings steigen die Zeiten der einzelnen Abschnitte plötzlich um ungefähr faktor 300%, allerdings ohne dass die FPS sinken (warscheinlich weil noch genug Luft für verlangsamungen ist). Wenn ich allerdings mit GPA einen frame capture mache (egal ob in den ersten 5 sekunden, oder später in der "langsamen" Phase) sehe ich in GPA immer die Werte der ersten 5 Sekunden.
Ich gehe momentan wie folgt vor. Direkt am Anfang des Frames beginne ich ein disjoint query und beende ein timer query. Immer mal wieder zwischen drin beende ich ein timer query um mir die aktuelle Zeit abzuholen. Am ende des Frames wird dann wieder ein timer query beended und letztendlich auch das disjoint query. Direkt danach kommt der swapChain->Present aufruf. Dann passiert erst mal 4 frames lang gar nichts mit Queries. Dann hole ich mir zuerst das Ergebnis des disjoint Queries und danach, in der Reihenfolge in der sie abgesetzt wurden, die Ergebnisse der timer Queries. Im nächsten Frame geht das ganze dann wieder von vorne los. Ich besitze überigens eine Nvidia Karte, Treiber update habe ich schon erfolglos versucht. Davor hatte ich versucht jedes Frame das beschriebene durchzuführen, allerdings die queries in einer Ringbuffer manier durchzulaufen, sodass sie 4 frames lang nicht abgeholt werden. Der Effekt mit der verlangsamung nach 5 Sekunden trat trozdem auf. Ich habe auch schon versucht direkt am Ende des Frames die Queries abzuholen, das hat allerdings nur dazu geführt, dass der CPU ewig lang auf die queries wartet und dadurch die FPS einbrechen.
Hat schonmal jemand ein ähnliches Phänomen beobachtet? Irgendwelche Tipps oder Ideen an was es liegen könnte?
Ich messe die Zeiten verschiedenere grob aufgelöster Renderabschnitte mit timer queries. Wenn ich meine Anwendung frisch starte, sehe ich 5 sekunden lang Werte in Millisekunden die ich erwrarten würde. Nach 5 Sekunden allerdings steigen die Zeiten der einzelnen Abschnitte plötzlich um ungefähr faktor 300%, allerdings ohne dass die FPS sinken (warscheinlich weil noch genug Luft für verlangsamungen ist). Wenn ich allerdings mit GPA einen frame capture mache (egal ob in den ersten 5 sekunden, oder später in der "langsamen" Phase) sehe ich in GPA immer die Werte der ersten 5 Sekunden.
Ich gehe momentan wie folgt vor. Direkt am Anfang des Frames beginne ich ein disjoint query und beende ein timer query. Immer mal wieder zwischen drin beende ich ein timer query um mir die aktuelle Zeit abzuholen. Am ende des Frames wird dann wieder ein timer query beended und letztendlich auch das disjoint query. Direkt danach kommt der swapChain->Present aufruf. Dann passiert erst mal 4 frames lang gar nichts mit Queries. Dann hole ich mir zuerst das Ergebnis des disjoint Queries und danach, in der Reihenfolge in der sie abgesetzt wurden, die Ergebnisse der timer Queries. Im nächsten Frame geht das ganze dann wieder von vorne los. Ich besitze überigens eine Nvidia Karte, Treiber update habe ich schon erfolglos versucht. Davor hatte ich versucht jedes Frame das beschriebene durchzuführen, allerdings die queries in einer Ringbuffer manier durchzulaufen, sodass sie 4 frames lang nicht abgeholt werden. Der Effekt mit der verlangsamung nach 5 Sekunden trat trozdem auf. Ich habe auch schon versucht direkt am Ende des Frames die Queries abzuholen, das hat allerdings nur dazu geführt, dass der CPU ewig lang auf die queries wartet und dadurch die FPS einbrechen.
Hat schonmal jemand ein ähnliches Phänomen beobachtet? Irgendwelche Tipps oder Ideen an was es liegen könnte?