2012-04-03 3 views
0

Ich versuche ein einfaches iPhone-Spiel zu erstellen, das während des Laufs mehrere Überprüfungen durchführt, um zu sehen, ob Benutzereingaben ein echtes Wort sind. Ich habe eine 1.7mb Textdatei (ist das eine angemessene Größe?) Mit jedem Wort in einer eigenen Zeile, die alle Wörter in der englischen Sprache enthält. Dies ist der Code, der in der init-Methode der Spielszene ausgeführt wird. correctWords ist ein Array, das alle von Benutzern bestätigten Wortschätzungen enthält. Dieser Code analysiert durch die Textdatei und legt allen Wörtern in ein Array currentDict genannt:cocos2d Bildrate Verzögerung bei der Erstellung und Suche von Wörterbüchern

correctWords = [[NSMutableArray alloc] init]; 

    //set where to get the dictionary from 
    NSString *filePath = [[NSBundle mainBundle] pathForResource: [NSString stringWithFormat: @"dictionary"] ofType:@"txt"]; 

    //pull the content from the file into memory 
    NSData* data = [NSData dataWithContentsOfFile:filePath]; 
    //convert the bytes from the file into a string 
    NSString* string = [[[NSString alloc] initWithBytes:[data bytes] 
               length:[data length] 
               encoding:NSUTF8StringEncoding] autorelease]; 

    //split the string around newline characters to create an array 
    NSString* delimiter = @"\n"; 
    currentDict = [string componentsSeparatedByString:delimiter]; 

    [currentDict retain]; 

und dann gibt der Benutzer, wenn das Wort ist ein Wort, das ich dieses Kontroll haben in der Tat zu überprüfen

if([currentDict containsObject: userInput]){ 

Immer wenn die Spielszene geladen wird, gibt es eine merkliche Verzögerung (3-4 Sekunden) auf dem Gerät selbst, obwohl es fast simultan im Simulator passiert, und dann habe ich Animationen während des größten Teils des Spiels, aber wann auch immer es versucht ein Wort zu verifizieren, es gibt eine leichte, aber spürbare Verzögerung in den Animationen. Ich frage mich nur, ob es einen besseren Weg gibt, das Wörterbuch in den Speicher geladen zu bekommen, oder ob es eine Art Standardpraxis für die Überprüfung von Wörtern gibt. Auch warum sollte prüfen, ob es ein Wort ist, eine Verzögerung in der Animation verursachen? Ich hatte angenommen, dass die Animation Teil eines eigenen Threads war (und somit theoretisch nicht betroffen wäre)

+0

1,7 MB Text entspricht Zehntausenden, wenn nicht Hunderttausenden von Wörtern. Die Suche nach einer Zeichenfolge in diesem Wörterbuch * wird * langsam sein. Natürlich läuft der Simulator schneller, weil er die CPU Ihres Macs nutzen kann, die zehn- bis hundertmal schneller ist als die iOS-CPUs. – LearnCocos2D

+0

seine rund 70.000 Wörter. Diese Größe ist etwas unumgänglich, aber es gibt viele Spiele, die das gleiche Wörterbuch verwenden und eine effektive Methode zum Laden haben. Ich habe es derzeit in ein Array geladen, aber ich frage mich, ob es eine Art von Standard-Praxis gibt, die ich machen kann dafür? Im Moment sucht die Suche nur nach einem o (n) -Such durch alle Elemente, so dass ich nach der Implementierung einer binären Suche schneller loggen kann, aber was das Laden betrifft, ist ein Array die beste Option? sollte ich ein nsdictionary verwenden? Was ist der Unterschied in Bezug auf die Geschwindigkeit – Ben

Antwort

-3

Nichts überraschend, dass der Vergleich von Tausenden von Zeichenfolge dauert einige Zeit und verursacht Verzögerung in der Animation. Sie sollten etwas über binäre Suche, Hashing usw. lesen. Auch das Laden der gesamten Datei in NSString und das anschließende Teilen ist sehr langsam. Dein Code ist einfach schrecklich, sorry.

+1

keine Notwendigkeit, den Mann zu beleidigen. wir alle lernen, einige von uns sind näher am Anfang der Kurve als andere. wir lernen aus unseren Fehlern, und das OP lernt auch. – johnbakers

1

Ich würde einen alternativen Ansatz empfehlen. Ich weiß nicht, wie dein Spiel funktioniert, aber es könnte Sinn machen, dem Spieler eine begrenzte Anzahl von möglichen Wortwahlen zu geben, zum Beispiel etwas wie etwas zeichnen, wo es nur so viele Wörter gibt, die man tippen kann; dann würdest du gegen viel weniger testen. Bevor die Szene geladen wird, können Sie die Menge der möglichen Wörter aus Ihrem Wörterbuch auswählen und dann Buchstaben oder Optionen angeben (was auch immer Ihr Spiel spielt), die nur dem Benutzer erlauben, Wörter zu finden, die in diesem Satz sind. Dann können Sie gegen ein kleines Set testen. Eine andere Möglichkeit ist es, das, was ich oben erwähnt habe, häufig während des Levels zu wiederholen, so dass sich die Anzahl der verfügbaren Wörter ständig ändert, aber das wird regelmäßig geladen, wenn man nicht gerade mitten in einer Animation ist. Wenn es eine kurze Pause im Spiel gibt, wenn das Level schwieriger wird, dann lade neue Wörter oder etwas ähnliches.

Auf diese Weise wird das Spiel in Echtzeit nicht von einem großen Wörterbuch beeinflusst, aber Sie können immer noch viele Optionen während des Spiels anbieten.

+0

das Spiel muss die Möglichkeit haben, die Gültigkeit von Wörtern zu überprüfen, sonst verliert es den größten Teil seiner Funktionalität.Ich habe eine binäre Suche für das Wörterbuch implementiert, so dass es jetzt super schnell läuft. Ich habe auch das Laden des Wörterbuchs in das AppDelegate verschoben, sodass es nur einmal geladen werden muss. Das dauert immer noch etwa 4 Sekunden ... Sollte ich drängen, dass es viel schneller geht? oder sollte ich einfach akzeptieren, dass es nicht wirklich schneller als das laufen wird – Ben

+0

gibt es viele Spiele und Anwendungen, die mehr als 4 Sekunden zum Laden brauchen, also würde ich mich nicht darum kümmern – johnbakers