Laden...

DirectX... Immer leichtes Ruckeln

Erstellt von MrJack vor 17 Jahren Letzter Beitrag vor 17 Jahren 1.906 Views
M
MrJack Themenstarter:in
17 Beiträge seit 2006
vor 17 Jahren
DirectX... Immer leichtes Ruckeln

Hallo,
ich habe mein Programm frameunabhängig gemacht ungefähr so...


while(form.Created){
_millisecs = Environment.TickCount;

objekt.x = objekt.x + speed * _schleifenzeit

... Render Render 

_schleifenzeit = Environment.TickCount - _millisecs;
}

Das klappt eigentlich auch gut, nur das Problem ist,
dass es nicht ganz flüssig läuft sondern immer
minimal stottert. Das nervt ganz schön...

Woran kann das liegen und vor Allem wie kann man das lösen?

5.942 Beiträge seit 2005
vor 17 Jahren

Hallo MrJack

Dein geposteter Code sieht nicht so aus, als ob er sowas verursachen könnte.
Ich hatte auch mal ein ähnliches Problem.
Schlussendlich lag es daran, dass ich vergessen habe, den VertexBuffer zu disposen.

Also immer schön alle Ressourcen wieder freigeben.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

M
MrJack Themenstarter:in
17 Beiträge seit 2006
vor 17 Jahren

Im Moment benutze ich gar keinen VertexBuffer sondern nur Sprites (Ohne selbsterstellten VertexBuffer)

Ich habe dies schon auf mehreren PCs getestet also liegt es wohl nicht an meinen Computer...

G
58 Beiträge seit 2007
vor 17 Jahren

Zeit für die Verarbeitung der verschiedenen Blöcke messen und ausgeben, um zu sehen wo's hängt..?

M
MrJack Themenstarter:in
17 Beiträge seit 2006
vor 17 Jahren

Also es hängt direkt beim Zeichnen einens Sprites.
Dor habe ich immer wieder eine Verzögerung von max. 16ms.
Auch wenn ich gar keinen Sprite male sondern
nur das Gerüst habe...

Es tritt direkt beim Zeichnen eines Sprites auf.
Der Code sieht in Etwa so aus:


Sprite sp = new Sprite(device);
sp.Begin(SpriteFlags.AlphaBlend);

sp.End();
sp.Dispose();

Kann das vielleicht an einer falsches Instanzierung des Devices
liegen bzw an falschen einstellungen, VSYNC ist übrigens aus,
obwohl das ja eigentlich keine Rolle spielen darf.

148 Beiträge seit 2006
vor 17 Jahren

also wenn es bei mir ruckelte oder zu langsam war, lag das meistens an den PresentationParameters, die nicht optimal konfiguriert wurden.. Abhilfe schafften dabei diese zwei flags:


itsPresentParams.ForceNoMultiThreadedFlag = true;  // der name verwirrt: true bedeutet dass du multithreading einschaltest.. danach musst du bei kritischen aktionen aufpassen und selber locken
itsPresentParams.PresentationInterval = PresentInterval.Immediate;  // gibt an, wie schnell der backbuffer in den vordergrund wechselt      

vielleicht bringt das ja was 🙂

greetz..

I cna tpye 300 wrods pre mnuite!

M
MrJack Themenstarter:in
17 Beiträge seit 2006
vor 17 Jahren

Thx, aber das hat leider nichts gebracht...

Ob ich vsync an oder aus habe, es stockt immer...

Ich häng hier mal das Beispiel an,
vielleicht ruckelts bei euch nicht
(ist eine minimale Verzögerung, genau hinschauen...)

Bei Schleife wird die zeit für die Renderschleife ausgegeben.

E
265 Beiträge seit 2004
vor 17 Jahren

Laut Pseudocode instanzierst du pro Rendern einen Sprite. Das macht nach ein paar Sekunden ein paar tausend Sprite Instanzen. Somit muss der GC dauer aufräumen, das könnte das ruckeln verursachen.

M
MrJack Themenstarter:in
17 Beiträge seit 2006
vor 17 Jahren

Aso, du meinst ich könnte besser am Anfang einen
"globalen" Sprite erzeugen und diesen dann immer wieder verwenden?

5.942 Beiträge seit 2005
vor 17 Jahren

Hallo zusammen

Original von MrJack
Aso, du meinst ich könnte besser am Anfang einen
"globalen" Sprite erzeugen und diesen dann immer wieder verwenden?

Ja, genau das.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

M
MrJack Themenstarter:in
17 Beiträge seit 2006
vor 17 Jahren

Ok, das leuchtet ein ^^
Es verzögert zwar die 16ms Pausen aber
das leichte stottern (fällt besonders bei höheren Geschwindigkeiten auf)
hat sich nicht gelegt...

Dafür muss es noch einen anderen Grund geben. 🤔

M
MrJack Themenstarter:in
17 Beiträge seit 2006
vor 17 Jahren

also komisch ist schon mal wenn ich die zeit messe, die schleifenzeit größtenteils 0 ist oder manchmal 16..
wenn ich die zeit am anfang nehme und am ende der schleife kann doch nicht 0 rauskommen oder ?