Christoph Zurnieden: Globale Variablen in C

Beitrag lesen

Hi,

Nun, da ich Grafiken erzeuge, und irgendwie eine "Spritkollision" erzeugen will, tue ich das, indem ich bei einer Grafik A ab einem gewissen y-Wert für eine gewisse Pixelanzahl überprüfe, ob Grafik B Grafik A berührt. Hierzu speichere ich einfach die Werte in einer Variable oder Struktur, lasse jeden Thread die Werte lesen und reagiere eben dann dementsprechend.

Aha. So weit, so gut. Google schmeißt auf "SDL sprite collision example" zwar eine Menge aus, aber das hilft Dir für's Verständnis wahrscheinlich nicht weiter.

Gut. Gehen wir mal davon aus, das zwei Sprites frei im Raume schweben. Ein Sprite ist hierbei eine dirkrete Fläche 0<F_1<R. R sei ein diskreter Raum, hier: eine diskrete Ebene. Wenn sich zwei Sprites berühren, dann gibt es mindestens ein Pärchen, die Nachbarn sind. Meist wird Pixelweise gerechnet, ein Pixel ist nicht viel, da wird eine Kollision besser dadurch definiert, das sich eine Schnittmenge beider Sprites von mindestens einem Element Größe bilden läßt.
Ganz brutal läßt sich sowas lösen, indem man eine Matrix in der Größe R baut und alle Positionen der Außenmaße aller Sprites dort festhält. Soviel ist das aber meist gar nicht, hört sich nur doll an.
Da sich die Sprites aber bewegen - und zwar alle! - muß ein ständiges Update der Positionen in der Matrix vorgenommen werden. Damit ein wenig Ordnung reinkommt empfiehlt es sich, das immer nur einer schreibt, während der ganze Rest lesen darf. Es ist also eine Sperre nötig. So eine Sperre kann man z.B. mit einem Mutex (MUTual EXclusion) realisieren.
Ganz simples Beispiel:

  
/* globale Variable */  
int x;  
  
/* Mutex bezeichnen und gleich initialisieren */  
pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;  
  
/*Mutex sperren*/  
pthread_mutex_lock(&mut);  
  
/* globale Variable um eins erhöhen */  
x++;  
  
/*Mutex wieder entsperren*/  
pthread_mutex_unlock(&mut);  

Das kann jedoch zu Problemen führen. Unter anderem zu solchen, die "Deadlock" genannt werden.

So, das sollte für heute erstmal reichen ;-)
Das Gebiet ist aber riesig, da gibt es viel zu entdecken. Du solltest Dir wirklich erstmal die Zeit nehmen und durch die Links wandern. Bei Multithreadeing kannst Du nunmal nicht "mal eben" 'was hacken, das erfordert einfach etwas mehr Sorgfalt.

so short

Christoph Zurnieden