Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mo Jul 14, 2025 21:18

Foren-Übersicht » DGL » Feedback
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Di Sep 05, 2006 09:15 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Sep 01, 2006 08:22
Beiträge: 26
Wohnort: Frauenfeld / CH
Hallo zusammen,
erstmals danke für diese Seite, das Wiki und die Tutorials. Bin jetzt schon länger am OpenGL / SDL probieren und es war bis jetzt sehr hilfreich.
Auch bei meinem ersten spielbaren Spiel sieht man langsam ein mögliches Ende :wink:

Vermehrte (zyklische) Abstürze führten dann dazu dass ich auch noch dass "Debugger benutzen und andere praktische Tipps" Tutorial durchmachte. Das Problem wies alle Symptome eines wilden Pointers auf - jedoch blieb die Suche erfolglos.

Doch das Problem war natürlich ganz woanders: Ich verwende einen Timer der die Eingaben behandelt und die Positionen berrechnet, die Grafik wird in einem Loop so schnell wie möglich gezeichnet. Aus beiden Tasks wird auf das gleiche Objekt zugegriffen, was dann manchmal zum Fehler führte.
Abhilfe: Mutex rein, alles ok.

Villeicht als Anregung für das Tutorial.


Gruss Urs


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 05, 2006 09:35 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Könntest du bitte mal genauer erklären was du machst? Bzw würde mich gerne mal interessieren wie du renderst? Das was du dort beschreibst klingt für eher nach einen Synchronisationsproblem. Aber es sollte mich wundern, wenn du zum Rendern einen extra Thread aufgemacht hast. Bzw bei DLLs gibt es einen solchen Seiteneffekt mit TTimer mitunter auch.

Eine Mutex hat nichts aber auch gar nichts mit dem Debugger zu tun. Und ich möchte auf keinen Fall, das die Mutexe wie wild aus dem Boden sprießen obwohl es eigentlich mit etwas ganz Anderem zu tun hat. ;-)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 05, 2006 10:40 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Sep 01, 2006 08:22
Beiträge: 26
Wohnort: Frauenfeld / CH
Es war ein Synchronisationsproblem. Nur zeigte es erschwerend alle Symptome eines Zeigerproblems.
Wie ich gesehen habe läuft ein SDL-Timer in einem eigenen Thread. So kommt es, dass mitten im Rendern mal ein Timer reinfunken kann.
Allerdings wird die Timer-Callback-Funktion erst wieder aufgerufen nachdem sie beendet wurde (im Gegensatz zu einem TTimer dessen Intervall-Funktion beim Debuggen oder mit ProcessMessages schon mal mehrmals aktiv sein kann).


Der Code sieht vereinfacht so aus:

Code:
  1.  
  2.   TGame = class( TObject );
  3.   Game: TGame;
  4.  
  5. function glInputTimer( interval : UInt32; param : Pointer ) : UInt32;
  6. Begin
  7.   ...
  8.   Game.Calc( iTime, keystate );
  9.   ...
  10. end;
  11.  
  12. Procedure main;
  13. Begin
  14.   ...
  15.   Timer  := SDL_AddTimer( 10, TSDL_NewTimerCallback( @glInputTimer ), nil );
  16.  
  17.   while ( Done <> -1 )  do
  18.     begin
  19.       Game.Draw;
  20.     end;
  21.   ...
  22. end;
  23.  


Wie bereits erwähnt, abhilfe schaffte ein SDL_LockMutex( mutex ) vor dem Calc und Draw und ein SDL_UnLockMutex( mutex ) jeweils dannach.

Ich denk einfach, dies wäre als Fehler-Bereiningungs-Ansatz noch hilfreich.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 05, 2006 11:23 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ja okay. Dann hast du aber wiederrum 2 Threads. Und dafür gibt es bereits ein Tutorial. Denke mal auch nicht, dass es jetzt so ein üblicher Fall sein dürfte. Oder?

Aber okay. Im Zusammenhang mit SDL Timern ist es sicherlich erwähnenswert, dass dort dafür ein Thread aufgemacht wird. Viele (mich eingeschlossen) dürften davon ausgehen, dass ein Timer sich wie ein normaler Windowstimer verhält. Denke der beste Ort für diese Info wäre der SDL_AddTimer Artikel.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 05, 2006 11:42 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
Das steht bereits drin. Sollte vielleicht auffälliger markiert werden. Conf. http://wiki.delphigl.com/index.php/SDL_ ... schreibung


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 05, 2006 12:43 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Wie bist du eigentlich auf den Code gekommen? Ich habe, nach einer kleinen Google suche, nämlich festegestellt, dass bei DGL mindestens noch eine Person mit dem SDL_AddTimer arbeitet. Falls dein Code auf DGL Code basiert wäre ein Hinweis auf die Quelle für uns gut. Dann könnten wir dort das Problem beheben. Anscheinend befindet sich zu diesem Thema auch etwas Code im DGLSDK. Dort sollte man mal prüfen ob ein Mutex ergänzt werden muss.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Foren-Übersicht » DGL » Feedback


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 2 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 16 Queries | GZIP : On ]