probleme mit SDL_AddTimer und events


G.o.D

Member
Joined
Jan 15, 2007
Messages
358
Hallo,

ich versuche gerade eine platformuebergreifende c-only 2d engine zu entwickeln die natuerlich auch auf dem gp2x laufen soll und hab da ein problem das ich einfach nicht durchschaue.

ich starte mit SDL_AddTimer eine routine, die das spiel zeichnet und in der hauptschleife will ich eigentlich nur zeit vertroedeln

die routinen sehen also ungefaehr so aus:
Code:
<i>
</i>
Uint32 callback(Uint32 interval, void *param) {
   while (SDL_PollEvent &event) {
      case SDL_KEYDOWN:
      case SDL_JOYBUTTONDOWN:
         // buttons verarbeiten
   }
   // zeichnen
   SDL_Flip(screen);
}

int main() {
   SDL_AddTimer(33, callback);
   while (!quit) {
      SDL_Delay(50);
   }
}

das funktioniert unter linux, nicht aber unter gp2x und windows

fuer windows habe ich herausgefunden, dass wenn ich in der hauptschleife noch ein SDL_Pollevents(); vor dem delay einbaue, es auch unter windows funktioniert

alleine der gp2x weigert sich hartnaeckig events zu erkennen. SDL_PollEvent(&event) liefert immer 0

Hatte jemand schonmal das problem?
Hat der gp2x irgendwie probleme mit threads?
 
erwartet SDL_AddTimer nicht 3 Parameter? Vielleicht ist die Funktion auch überladen, für den Fall, dass deine callback-Funktion keine Parameter erwartet (was logisch erscheint, wenn es unter Linux /Win läuft ), ansonsten könntest Du es mal mit

SDL_AddTimer(33, callback, null);

oder Ähnlichem versuchen.

Hat es eigentlich einen Grund, warum Du die callback Funktion nicht gleich in die main-Schleife schreibst und so einfach auf SDL_AddTimer verzichtest?

Viel Erfolg
--jo
 
jo said:
erwartet SDL_AddTimer nicht 3 Parameter? Vielleicht ist die Funktion auch überladen, für den Fall, dass deine callback-Funktion keine Parameter erwartet (was logisch erscheint, wenn es unter Linux /Win läuft ), ansonsten könntest Du es mal mit

SDL_AddTimer(33, callback, null);

oder Ähnlichem versuchen.

aeh, sorry, ja hat 3 params, hab den code oben nur kurz aus dem stegreif getippt. Es funktioniert ansich ja auch, das problem ist, dass events zu 100% ignoriert werden.
Hat es eigentlich einen Grund, warum Du die callback Funktion nicht gleich in die main-Schleife schreibst und so einfach auf SDL_AddTimer verzichtest?

ja, weil so die hardware (zumindest wo verfuegbar) die arbeit uebernimmt, das timing auf allen platformen gleich hinzubekommen. bei meinem ersten gp2x spiel z.b. time ich selbst ueber
while (!exit) {
starttime=SDL_GetTicks();
// spiel abhandeln und zeichnen
SDL_Delay(25-(SDL_GetTicks()-starttime));
}

und es gibt ein spuerbaren unterschied im timing zwischen pc und gp2x (warum auch immer, sollte ja eigentlich keinen geben).

da die library fuer saemltiche exoten, inkl. syllable, skyos und aros gebaut werden soll, haette ich einen so kritischen teil gerne SDL bzw. der hardware ueberlassen.

wie gesagt, an sich funktionierts ja auch, nur die events werden verschluckt
 
hi,

vielleicht hilft Dir das weiter (Programmbesipeil weiter unten):

http://de.wikibooks.org/wiki/SDL:_Timer

In der Callback-Funktion wird lediglich ein SDL_PushEvent aufgerufen (hmmm vielleicht hat die ganze Sache doch was mit den threads zu tun...)

--jo
 
oh mann :x

3 tage bug suche und alles nur wegen einem vergessenen SDL_JoystickOpen ... ab und zu wuenschte ich mir ich haette auf meine eltern gehoert als sie gesagt haben 'bua, lern was gscheits'... aber nein, ich musste programmierer werden :(

trotzdem danke, mit der variante scheints mir allgemein doch besser zu funktionieren ueber alle platformen hinweg
 
Hallo,

Nur mal so zwischengefragt: Warum machst du die Logik nicht einfach zeitabhaengig, anstelle bei konstant 40hz zu bleiben?

Gruss
Michael
 
falls ich jetzt richtig verstanden habe was du meinst - als c64 spiele entwickler, der noch nie was anderes gemacht hat als die logik des spiels beim einsetzen eines raster interupts durchzufuehren bin ich mir nicht ganz sicher wie ihr jungen hunde das heutzutage macht ;)

weil dann das spiel deutlich mehr cpu nutzen wuerde und dann weinen die ganzen happypenguin user wieder rum warum ihr gigaherz pc den luefter anwirft... fairer weise muss man aber auch sagen, dem gp2x batterie verbrauch wuerds auch nicht gerade gut tun.

abgesehen davon ist das nur das testprogramm fuer die engine, die engine nutzer koennen sich dann ja aussuchen wie sie es machen wollen ;)
 
Back
Top