我正在尝试创建一个简单的iPhone游戏,它将在整个运行过程中进行多项检查,以查看用户输入是否是真正的单词。我有一个1.7mb的文本文件(这是一个合理的大小?),每个单词都在其自己的行上,包含英语中的所有单词。这是在游戏场景的init方法中运行的代码。 correctWords
是一个数组,其中包含所有用户验证过的单词猜测。此代码解析文本文件,并将所有单词放入名为currentDict
的数组中:
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];
然后验证用户输入的单词实际上是否是我有此检查的单词
if([currentDict containsObject: userInput]){
每当游戏场景加载时,设备本身会有一个非常明显的延迟(3-4秒),虽然它几乎立即发生在模拟器中,然后我也会在游戏的大部分时间内运行动画,但是每当它试图验证一个单词时,动画中都会有轻微但明显的滞后。我只是想知道是否有更好的方法将字典加载到内存中,或者是否有某种标准练习来验证单词。另外,为什么要检查它是否是一个单词导致动画滞后?我假设动画是它自己的线程的一部分(因此理论上不会受到影响)
答案 0 :(得分:1)
我会建议另一种方法。我不知道你的游戏是如何运作的,但是为玩家提供一组有限的可能的单词选择可能是有意义的,例如Draw Something,你可以输入的字数太多;然后你会测试少得多。在场景加载之前,您可以从字典中选择一组可能的单词,然后提供字母或选项(无论您的游戏进展如何),只允许用户提出该集合中的单词。然后你可以测试一小组。
另一种选择是在整个关卡中重复我上面经常说的内容,因此可用单词的数量会不断变化,但是当你不处于动画中间或其他任何情况时,会定期加载。如果游戏中有一个短暂的停顿,因为等级越来越难,然后加载新词或类似的东西。
这样,实时游戏不受大字典的影响,但你仍然可以在整个游戏过程中提供很多选择。
答案 1 :(得分:-3)
比较数千个字符串需要花费一些时间并导致动画滞后并不奇怪。您应该阅读有关二进制搜索,散列等的内容。同时将整个文件加载到NSString然后拆分它非常慢。你的代码很糟糕,抱歉。