2010-12-01 3 views
0

Je veux créer un jeu en temps réel. Le jeu aura un modèle qui sera mis à jour périodiquement ...Quelle est la meilleure pratique pour partager des objets entre threads pour un jeu en temps réel

- (void) timerTicks { 
    [model iterate]; 
} 

Comme tous les jeux, je vais relancer les événements d'entrée utilisateur, touche. En réponse, je dois mettre à jour le modèle ....

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    [model updateVariableInModel]; 
} 

Donc, il y a deux fils:

  1. A partir d'une minuterie. Répète souvent le modèle
  2. À partir du fil d'interface utilisateur. Met à jour le modèle en fonction de l'entrée utilisateur

Les deux threads partageront des variables dans le modèle.

Quelle est la meilleure pratique pour partager les objets entre les threads et éviter les problèmes de multi-threading?

+0

Que signifie «itérer»? Je pense que vous voulez dire "itérer". –

+0

Oui, je l'ai fait, merci. – Robert

Répondre

1

Verrouillez les objets qui doivent être partagés sur le thread à l'aide du mot clé @synchronized.

Un moyen facile de verrouiller tous les objets est comme ceci:

-(void) iterate 
{ 
    @synchronized(self) 
    { 
     // this is now thread safe 
    }   
} 

-(void) updateVariableInModel 
{ 
    @synchronized(self) 
    { 
     // use the variable as pleased, don't worry about concurrent modification 
    } 
} 

Pour plus d'informations sur le filetage en Objective-C, s'il vous plaît aller here

Notez également que vous devez verrouiller les deux fois le même objet ou bien le verrou lui-même est inutile.

+0

Que fait exactement @synchronized (self) {} ici? Cela empêche-t-il simplement les autres threads d'entrer dans la méthode? – Robert

+1

@Robert Cela empêche tous les autres threads d'accéder à la variable 'self' (dans ce cas, votre instance de classe, juste celle-là, disons 0x01aa2d) et tous les objets qu'elle contient. Cela signifie que jusqu'à ce que votre méthode se termine, aucun autre code ne peut utiliser la variable à l'emplacement de mémoire 0x01aa2d. Si c'est le cas, alors ce thread devra simplement attendre pour exécuter ce code. Im aussi désolé que cela m'a pris si longtemps pour répondre –

+0

Merci, c'était une réponse très claire. – Robert

Questions connexes