JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

Problem:Kurzes Flimmern/Dropped Frame

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



Anmeldedatum: 30.11.2002
Beiträge: 4

Medaillen: Keine

BeitragVerfasst am: 30.11.2002, 19:50    Titel: Problem:Kurzes Flimmern/Dropped Frame Antworten mit Zitat

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... Sad
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) Smile?

danke schon mal im vorraus

cu almdudler
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
DarK
Super JLI'ler



Anmeldedatum: 23.07.2002
Beiträge: 452
Wohnort: NRW
Medaillen: Keine

BeitragVerfasst am: 30.11.2002, 20:19    Titel: Antworten mit Zitat

ein Quellcode wäre sinvoll Very Happy
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
almdudler
Mini JLI'ler



Anmeldedatum: 30.11.2002
Beiträge: 4

Medaillen: Keine

BeitragVerfasst am: 30.11.2002, 20:40    Titel: Antworten mit Zitat

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
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: 30.11.2002, 23:25    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
almdudler
Mini JLI'ler



Anmeldedatum: 30.11.2002
Beiträge: 4

Medaillen: Keine

BeitragVerfasst am: 01.12.2002, 12:24    Titel: Antworten mit Zitat

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 Smile )?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Revil
Senior JLI'ler



Anmeldedatum: 28.07.2002
Beiträge: 242

Medaillen: Keine

BeitragVerfasst am: 01.12.2002, 13:35    Titel: Antworten mit Zitat

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
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: 01.12.2002, 16:45    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Revil
Senior JLI'ler



Anmeldedatum: 28.07.2002
Beiträge: 242

Medaillen: Keine

BeitragVerfasst am: 01.12.2002, 22:16    Titel: Antworten mit Zitat

cool!!
ich freu mich schon auf das spiel und das beispiel =)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
almdudler
Mini JLI'ler



Anmeldedatum: 30.11.2002
Beiträge: 4

Medaillen: Keine

BeitragVerfasst am: 03.12.2002, 14:15    Titel: Antworten mit Zitat

hi,
ich habe ein neues problem (das alte tritt nicht mehr auf Confused ):
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
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