cocos2d在字典创建和搜索方面的帧速率滞后



我正在尝试创建一个创建一个简单的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秒),尽管它几乎立即在模拟器中发生,而且我在游戏的大部分时间里都有动画运行,但每当它试图验证一个单词时,动画中都会有轻微但明显的延迟。我只是想知道是否有更好的方法将字典加载到内存中,或者是否有某种标准的方法来验证单词。同样,为什么检查它是否是一个单词会导致动画中的滞后?我假设动画是它自己线程的一部分(因此理论上不会受到影响)

我推荐一种替代方法。我不知道你的游戏是如何运作的,但给玩家一组有限的可能单词选择可能是有意义的,例如,像Draw something这样你只能键入这么多单词的游戏;那么你的测试对象就会少得多。在加载场景之前,您可以从字典中选择一组可能的单词,然后提供字母或选项(无论您的游戏如何),只允许用户想出该组中的单词。然后你可以在一个小集合中进行测试。

另一种选择是在你的整个级别上经常重复我上面说过的话,所以可用单词的数量会不断变化,但当你不在动画或其他内容中时,会定期加载设置。如果随着关卡的难度增加,游戏中有短暂的停顿,那么加载新单词或类似的东西。

这样,实时游戏就不会受到大字典的影响,但你仍然可以在整个游戏过程中提供许多选项。

比较数千个字符串需要一些时间并导致动画滞后,这并不奇怪。你应该读一些关于二进制搜索、哈希等的知识。此外,将整个文件加载到NSString中,然后进行拆分是非常缓慢的。你的代码太糟糕了,对不起。

最新更新