|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
almdudler Mini JLI'ler
Anmeldedatum: 30.11.2002 Beiträge: 4
Medaillen: Keine
|
Verfasst am: 30.11.2002, 19:50 Titel: Problem:Kurzes Flimmern/Dropped Frame |
|
|
Hi,
ich habe vor ein paar Tagen mit meinem ersten Spiel in C++ angefangen, und es geht auch schon einiges, nur ein problem ist seit gestern hinzugekommen (ich bin mir nicht sicher, aber ich glaube, dass früher das flimmern nicht war). also wenn das programm in der render()-Funktion die oberflächen/bitmaps und texte blittet (is nicht viel, 3 texte, 4 gdi-grafiken,eine directx oberfläche), dann funktioniert auch alles.
aber in unbestimmten abständen (alle ~2-10 sec) kommt es mir so vor, als ob er einen frame dropped, also alle elemente sind für einen augenblick schwarz...
ich habe schon versucht verschiedene dargestelle sachen auszukommentieren, hilft aber nix. ich weiß jetzt net, ob ich euch einen ausschnitt geben soll oder euch mal die exe aufn ftp laden, damit ihr euch das mal anschauen könnt.
wäre echt klasse, bin nämlich verzweifelt daran.
ist es eigentlich normal, dass das programm immer >90% cpu-auslastung macht (bei nem p4 2000 mhz) ?
danke schon mal im vorraus
cu almdudler |
|
Nach oben |
|
|
DarK Super JLI'ler
Anmeldedatum: 23.07.2002 Beiträge: 452 Wohnort: NRW Medaillen: Keine
|
Verfasst am: 30.11.2002, 20:19 Titel: |
|
|
ein Quellcode wäre sinvoll |
|
Nach oben |
|
|
almdudler Mini JLI'ler
Anmeldedatum: 30.11.2002 Beiträge: 4
Medaillen: Keine
|
Verfasst am: 30.11.2002, 20:40 Titel: |
|
|
okay
also (ähnlich wie das beispiel-game):
die render()-funktion:
Code: | CalcFrameRate(DDraw.GetBuffer());
car1.Show(DDraw.GetBuffer());
car2.Show(DDraw.GetBuffer());
part1.Draw(DDraw.GetBuffer(),50,50);
part2.Draw(DDraw.GetBuffer(),50,100); |
die init()-funktion für den start:
Code: | DInput.Init(hWnd,hInst);
DDraw.Init(hWnd);
car1.statusx=100;
car2.statusx=400;
InitTrack(&DDraw);
DeterminePixelFormat(DDraw.GetBuffer()); |
- CalcFrameRate = die ausm buch
- die show-funktion der car-class zeichnet jeweils einen text und 2 rechtecke
- inittrack lädt bitmaps in die parts-class und speichert sie dort in einzelnen surfaces(mit dieser funktion auch ausm buch:)), die beim rendern immer per bltfast auf die lpDDSBackBuffer geblittet werden.
mehr is im moment nicht. jetzt habe ich eben gesehen, dass es mal ging, und beim nächsten start war das problem mal wieder da (so nach 20 sec)
cu almdudler |
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 30.11.2002, 23:25 Titel: |
|
|
Zum Flimmern:
Verwendest du einen Backpuffer und Flip()? Wenn nicht baue dein Programm entsprechend um.
Zur Systemauslastung:
Christian's Spieleschleife ist daran schuld: Da dort PeekMessage() verwendet wird, läuft das Programm ununterbrochen, auch wenn keine Messages vorliegen und es gerade keinen Frame zu zeichnen gibt. Das lässt sich durch inteligenter programmierte Hauptmeldungsschleifen im Zusammenhang mit mehreren Prozessen umgehen. Aber fast alle Kaufspiele haben eine Prozessorauslastung >=99% - auch wenn eigendlich gar nichts Berechnet wird.
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 |
|
|
almdudler Mini JLI'ler
Anmeldedatum: 30.11.2002 Beiträge: 4
Medaillen: Keine
|
Verfasst am: 01.12.2002, 12:24 Titel: |
|
|
a)
ja, den backpuffer und flip() is ausm beispiel-game übernommen
Code: | void DirectDrawClass::Flip(void)
{
// Puffer anzeigen
lpDDSPrimary->Flip(NULL,DDFLIP_WAIT);
} |
Kann es an diesem Clear liegen?
die funktion wird ja bei jedem rendern am anfang aufgerufen....
Code: | void DirectDrawClass::Clear(int Color)
{
DDBLTFX BlitFX;
ZeroMemory(&BlitFX,0);
BlitFX.dwSize = sizeof(BlitFX);
// Hintergrundfarbe setzen
BlitFX.dwFillColor = Color;
// Puffer löschen
lpDDSBackBuffer->Blt(NULL,NULL,NULL,DDBLT_COLORFILL | DDBLT_WAIT,&BlitFX);
} |
b) hm...okay, also sollte man es so lassen? oder kann man PeekMessage() weglassen (wohl eher net )? |
|
Nach oben |
|
|
Revil Senior JLI'ler
Anmeldedatum: 28.07.2002 Beiträge: 242
Medaillen: Keine
|
Verfasst am: 01.12.2002, 13:35 Titel: |
|
|
AFE-GmdG, wo findet man denn etwas über diese bessere Hauptschleife? oder kannst du das mal näher erläutern, das hört sich interessant an =) |
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 01.12.2002, 16:45 Titel: |
|
|
Ich habe selber solch eine entwickelt - in meinem Spiel, an dem ich gerade programmiere.
(Ja, der Leveleditor, die Mausgesten und einige weitere Kleine Test- und zwischenprojekte gehören alle dazu, das Spiel wird ein wenig aufwendiger als ich mir am Anfang vorgestellt habe.)
Ich muß mal den Sourcecode durchschauen, wie ich das genau gemacht habe. Ein Beispiel sollte ich demnächst hier zeigen können.
(Ich programmier wohl am besten mal ein Minibeispiel und frage Christian, ob er es hier zum Scrollbeispiel packen kann.)
Ich kann nur so viel sagen: Ich verwende GetMessage(), was ja blockiert in einem eigenem Thread. Ein eigener Thread ist nur für das Zeichnen der Szene da, was unabhängig vom dritten Thread, dem Berechnen der nächsten Szene passiert. Alle Threads müssen untereinander Syncronisiert werden. Weitere Threads sind für die Soundausgabe und die Inputbehandlung erstellt worden. Gesamtprozessorlast: Unter 15%
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 |
|
|
Revil Senior JLI'ler
Anmeldedatum: 28.07.2002 Beiträge: 242
Medaillen: Keine
|
Verfasst am: 01.12.2002, 22:16 Titel: |
|
|
cool!!
ich freu mich schon auf das spiel und das beispiel =) |
|
Nach oben |
|
|
almdudler Mini JLI'ler
Anmeldedatum: 30.11.2002 Beiträge: 4
Medaillen: Keine
|
Verfasst am: 03.12.2002, 14:15 Titel: |
|
|
hi,
ich habe ein neues problem (das alte tritt nicht mehr auf ):
wenn ich eine zeit lang im spiel bin, werden meine beiden rechteck-anzeigen (speed-balken) plötzlich weiß, obwohl sie vorher rot waren, und wenn das passiert und dich danach in windows (xp) gehe, ist das hintergrundbild weg, also nur eine einfache farbe ????!!!!
was kann ich tun bzw wtf is that?
THX
cu alm |
|
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
|