JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=013bcb4ded57fa4ba9f6d8c808ac540eMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

FPS limitierung im Fenstermodus abstellen?

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Chriss
Senior JLI'ler



Anmeldedatum: 18.08.2004
Beiträge: 267

Medaillen: Keine

BeitragVerfasst am: 22.10.2006, 21:56    Titel: FPS limitierung im Fenstermodus abstellen? Antworten mit Zitat

Hi,

ich schreibe eine Anwendung die nur im Fenstermodus läuft. Da es dort wohl eine limitierung der fps gibt, bekomme ich einen starken Leistungsverlust. Für den fullscreen modus kann man ja einen entsprechenden Parameter setzen, damit das Programm nicht auf den Bufferwechsel wartet und gleich weiterläuft. Dummerweise funktioniert das nicht im Fesntermodus. Ich habe auch schon gelesen das dieser Parameter im Fenstermodus ignoriert wird. Gibt es dennoch eine Möglichkeit das hinzubekommen?

Grüße
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
manu
Super JLI'ler


Alter: 35
Anmeldedatum: 09.03.2006
Beiträge: 327
Wohnort: allgäu (DE)
Medaillen: Keine

BeitragVerfasst am: 22.10.2006, 22:01    Titel: Antworten mit Zitat

Kann ich mir kaum vorstellen, da im Fenstermodus für dein Programm genau das selbe gelten muss, wie für die Windowsoberfläche. Die Anwendung Teilt sich da ja auch den Speicher mit den anderen.
Und ich kann mir nicht vorstellen, dass man dieses vsync nur für einen Teil des Anzeigebereichs deaktivieren kann. Würde ja irgendwie der Ganzen Technik wiedersprechen... Aber ich lerne auch gerne dazu, falls jemand doch was weiß..
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 22.10.2006, 22:02    Titel: Antworten mit Zitat

Nein, soweit ich weiß nicht.

Sobald du im Fenstermodus bist, bist du gezwungen, mit den Parametern zu arbeiten, die dein Desktop hat. Vielleicht kannst du ja irgendwo bei den GraKa-Treibern vsync abstellen, aber solange dein Windows mit einer bestimmten Bildfrequenz dargestellt wird, hat eine Windowed-Anwendung dieselbe. Genauso ist es ja mit der Farbtiefe Wink
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Chriss
Senior JLI'ler



Anmeldedatum: 18.08.2004
Beiträge: 267

Medaillen: Keine

BeitragVerfasst am: 23.10.2006, 07:41    Titel: Antworten mit Zitat

ok, danke für die Infos.

Dann werde ich mein Problem mit Threads lösen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 23.10.2006, 08:19    Titel: Antworten mit Zitat

VSync kann man sowohl im Vollbildmodus als auch im Fenstermodus an und ausschalten. (Presentation Parameters)
Wenn dein Programm im Fenstermodus dann trotz abgeschalteter VSync im Fenstermodus VSync nutzt, liegt es an deinen Grafikkartentreibern - die haben manchmal eine möglichkeit des "Überschreibens" einiger Parameter angegeben. Das Gilt vorallem für VSync, Frequenz, Kantenglättung und manchmal auch für die Farbtiefe...

PS.: Threads werden dir bei diesem Problem wahrscheinlich nicht sehr viel weiterhelfen - sie verursachen eventuell nur noch mehr Probleme - vorallem wenn du von unterschiedlichen Threads auf die selben Resourcen zugreifen musst!
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 36
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 23.10.2006, 16:16    Titel: Antworten mit Zitat

Außerdem hat VSync mal überhaut nix mit Leistungsverlsut zu tun. Da könnte ich auch kotzen, wenn die GameStar oder so das schreibt.
VSync beschrängt zwar die Maximale Bildwiederhohlrate. Aber das ist eignetlihc nur positiv. Zum einen kommt es nciht zu so Schlieren. Zum andern könnte ich mir vorstellen, das es bei floats und bei Langsamen Geschwindigkeiten bei extrememn Frameraten zu Ungenauigkeiten kommen kann.
VSync abschalten hat für mich nur dann Sinn, wenn man die tatsächlcihe Leistung des Programms messen will. Also gucken, ob das optimeirne was gebracht aht oder net.
Aber es kann mir eignetlihc niemand erzählen, das 60 Herz (was ja fast das Minimum bei VSync ist) signifikant zu wenig ist...
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Chriss
Senior JLI'ler



Anmeldedatum: 18.08.2004
Beiträge: 267

Medaillen: Keine

BeitragVerfasst am: 23.10.2006, 18:01    Titel: Antworten mit Zitat

Ok ich hätte mal schreiben sollen was ich überhaupt mache.

Ich habe eine Anwendung in C# geschrieben die auf MDI basiert. Da ich nicht vor hatte alles selber zu schreiben sondern auf die Standards des VS zurückgreife, habe ich also eine Anwendung die mein Hauptfenster erst erzeugt und dann in etwo so arbeitet.

CPP:
while(mainForm.Created)
{
      MainForm.RenderNextWindow();
      Application.DoEvents();
}


Der leistungsverlust besteht darin das meine Anwendung nach dem Rendern schön braf auf den Bildwechsel wartet und erst danach die Events verarbeitet.

So kommt es zu einem unschönen Verhalten beim verkleinern/vergrößern der Fenster, dem benutzen der Menüleiste usw.

Deswegen hatte ich auch überlegt, ob ich das nicht mit Threads löse.

Vieleicht gibt es noch eine 3. Lösung aber auf mehr bin ich bisher noch nicht gekommen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 24.10.2006, 08:45    Titel: Antworten mit Zitat

soweit ich mich erinnere nutzt mainForm.Created die gemarshallte Win32-Funktion PeekMessage.
RenderNextWindow ruft die ganzen Zeichen / Berechnungsroutinen auf und Application.DoEvents schaut in der Windows Nachrichtenschleife nach, ob Nachrichten vorhanden sind und arbeitet diese erstmal ab.

Zuerst mal würde ich die Nachrichtenbehandlungsschleife vor RenderNextWindow einfügen und nicht danach - das hat etwas damit zu tun, wie MDX beim schliessen des Forms reagiert. (Close wird verarbeitet, und es kommt nicht mher zu Zeichenoperationen auf geschlossene Fenster - welche abzufangende Fehler verursachen. Jeder Fehler, der zusätzlich mit Try/Catch/Finally behandelt werden muss, kostet einiges an Rechenleistung, hab ich festgestellt. Vorallem in MDX-Anwendungen welche ohne VSync laufen sollen)

Dann solltest du dir die Codestelle anschauen, wo das DX-System initialisiert wird: Bei den PresentParameters muss die Eigenschaft "PresentationInterval" auf "Immediate" gesetzt werden, um VSync abzuschalten.
PresentParameters
PresentationInterval

Threads bringen in deinem Zusammenhang enorme Probleme mit sich, da ich mir vorstelle, dass du dieses "Application.DoEvents" in einen Extra Thread auslagern willst. Dabei passiert folgendes:
Da auf sämtliche GUI-Elemente von WinForms nur im selben Thread zugegriffen werden kann, wie sie erstellt worden sind (ThreadSicherheit) müssen sämtliche von DoEvents aufgerufene Funktionen auf den HauptThread Invoket werden - was wiederum bedeutet, dass auf dem Hauptthread eine Nachrichtenschlange aufgebaut wird, die durch nicht mehr vorhandensein von DoEvents dort nicht abgearbeitet wird - und das Programm "hängt" oder stürtzt ab. Es kann auch sein, dass du jede Menge Exceptions bekommst als "Ungültiger Thread für Aktion xyz"

Das MDXFramework, was du nutzen möchtest kann auf jeden Fall VSync deaktivieren - ansonsten solltest du vielleicht mal schauen, dass du dir dein eigenes Framework zusammenschraubst.

Oder du verzichtest komplett auf MDX und nutzt GDI+^^

MFG, AFE-GmdG
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Chriss
Senior JLI'ler



Anmeldedatum: 18.08.2004
Beiträge: 267

Medaillen: Keine

BeitragVerfasst am: 26.10.2006, 19:18    Titel: Antworten mit Zitat

AFE-GmdG hat Folgendes geschrieben:

Zuerst mal würde ich die Nachrichtenbehandlungsschleife vor RenderNextWindow einfügen und nicht danach


Danke für den Tip, das hat mein Problem genau gelöst.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum