|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Chriss Senior JLI'ler
Anmeldedatum: 18.08.2004 Beiträge: 267
Medaillen: Keine
|
Verfasst am: 22.10.2006, 20:56 Titel: FPS limitierung im Fenstermodus abstellen? |
|
|
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 |
|
|
manu Super JLI'ler
Alter: 35 Anmeldedatum: 09.03.2006 Beiträge: 327 Wohnort: allgäu (DE) Medaillen: Keine
|
Verfasst am: 22.10.2006, 21:01 Titel: |
|
|
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 |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 22.10.2006, 21:02 Titel: |
|
|
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 _________________ 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 |
|
|
Chriss Senior JLI'ler
Anmeldedatum: 18.08.2004 Beiträge: 267
Medaillen: Keine
|
Verfasst am: 23.10.2006, 06:41 Titel: |
|
|
ok, danke für die Infos.
Dann werde ich mein Problem mit Threads lösen. |
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 23.10.2006, 07:19 Titel: |
|
|
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 |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 23.10.2006, 15:16 Titel: |
|
|
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 |
|
|
Chriss Senior JLI'ler
Anmeldedatum: 18.08.2004 Beiträge: 267
Medaillen: Keine
|
Verfasst am: 23.10.2006, 17:01 Titel: |
|
|
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 |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 24.10.2006, 07:45 Titel: |
|
|
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 |
|
|
Chriss Senior JLI'ler
Anmeldedatum: 18.08.2004 Beiträge: 267
Medaillen: Keine
|
Verfasst am: 26.10.2006, 18:18 Titel: |
|
|
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 |
|
|
|
|
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
|