2010-05-31 6 views
0

Gday, j'essaie de créer une carte en mosaïque pour mon jeu, je l'ai déjà fait en utilisant d'autres méthodes xml mais j'ai eu des fuites de mémoire et toutes sortes d'erreurs. Cependant, j'avais un temps de chargement de la carte d'environ 2,5 à 3 secondes.Lecture dans un fichier texte de 5000 lignes sur l'Iphone

J'ai donc réécrit tout le code en utilisant NSMutableStrings et NSStrings. Après ma meilleure tentative d'optomisation, j'ai eu un temps de chargement de la carte de 10 à 11 secondes, ce qui est beaucoup trop lent.

J'ai donc réécrit le code en utilisant char * arrays, pour avoir maintenant un temps de chargement de 18 secondes -_-.

Voici le dernier code, je ne sais pas beaucoup c donc je pourrais avoir facilement bâclé le tout.

FILE* file = fopen(a, "r"); 
    fseek(file, 0L, SEEK_END); 
    length = ftell(file); 
    fseek(file,0L, SEEK_SET); 
    char fileText[length +1]; 

    char buffer[1024];// = malloc(1024); 
    while(fgets(buffer, 1024, file) != NULL) 
    { 
     strncat(fileText, buffer, strlen(buffer)); 
    } 
    fclose(file); 
    [self parseMapFile:fileText]; 




- (void)parseMapFile:(char*)tiledXML 
{ 


     currentLayerID = 0; 
     currentTileSetID = 0; 
     tileX = 0; 
     tileY = 0; 

     int tmpGid; 
     NSString* tmpName; 
     int tmpTileWidth; 
     int tmpTileHeight; 
     int tilesetCounter = 0; 

     NSString* tmpLayerName; 
     int tmpLayerHeight; 
     int tmpLayerWidth; 
     int layerCounter = 0; 
     tileX = 0; 
     tileY = 0; 
     int tmpFirstGid = 0; 


     int x; 
     int index; 
     char* r; 
     int counter = 0; 
     while ((x = [self findSubstring:tiledXML substring:"\n"]) != 0) 
     { 
      counter ++; 
      char result[x + 1]; 
      r = &result[0]; 
      [self substringIndex:tiledXML index:x newArray:result]; 
      tiledXML += x+2; 
      index = 0; 

      if (counter == 1) 
      { 
        continue; 
      } 
      else if (counter == 2) 
      { 
        char result1[5]; 
        index = [self getStringBetweenStrings:r substring1:"th=\"" substring2:"\"" newArray:result1]; 
        if (r != 0); 
         mapWidth = atoi(result1); 

        r += index +1; 
        index = 0; 
        index = [self getStringBetweenStrings:r substring1:"ht=\"" substring2:"\"" newArray:result1]; 
        if (r != 0); 
         mapHeight = atoi(result1); 

        r += index +1; 
        index = 0; 
        index = [self getStringBetweenStrings:r substring1:"th=\"" substring2:"\"" newArray:result1]; 
        if (r != 0); 
         tileWidth = atoi(result1); 

        r += index +1; 
        index = 0; 
        index = [self getStringBetweenStrings:r substring1:"ht=\"" substring2:"\"" newArray:result1]; 
        if (r != 0); 
         tileHeight = atoi(result1); 

        continue; 

      } 

      char result2[50]; 
      char result3[3]; 

      if ((index = [self getStringBetweenStrings:r substring1:" gid=\"" substring2:"\"" newArray:result3]) != 0) 
      { 

        tmpGid = atoi(result3); 

        if(tmpGid == 0) 
        { 
         [currentLayer addTileAtX:tileX y:tileY tileSetID:-1 tileID:0 globalID:0]; 
        } 
        else 
        { 
         [currentLayer addTileAtX:tileX 
           y:tileY 
           tileSetID:[currentTileSet tileSetID] 
           tileID:tmpGid - [currentTileSet firstGID] 
           globalID:tmpGid]; 
       }    
        tileX ++; 

        if (tileX > [currentLayer layerWidth]-1) 
        { 
         tileY ++; 
         tileX = 0; 
        } 



      } 
      else if ((index = [self getStringBetweenStrings:r substring1:"tgid=\"" substring2:"\"" newArray:result2]) != 0) 
      { 

        tmpFirstGid = atoi(result2); 

        r += index +1; 
        index = 0; 
        index = [self getStringBetweenStrings:r substring1:"me=\"" substring2:"\"" newArray:result2]; 
        if (r != 0); 
         tmpName = [NSString stringWithUTF8String:result2]; 


        r += index +1; 
        index = 0; 
        index = [self getStringBetweenStrings:r substring1:"th=\"" substring2:"\"" newArray:result2]; 
        if (r != 0); 
        tmpTileWidth = atoi(result2); 


        r += index +1; 
        index = 0; 
        index = [self getStringBetweenStrings:r substring1:"ht=\"" substring2:"\"" newArray:result2]; 
        if (r != 0); 
         tmpTileHeight = atoi(result2); 

      } 
      else if ((index = [self getStringBetweenStrings:r substring1:"rce=\"" substring2:"\"" newArray:result2]) != 0) 
      { 


        currentTileSet = [[TileSet alloc] initWithImageNamed:[NSString stringWithUTF8String:result2] name:tmpName tileSetID:tilesetCounter firstGID:tmpFirstGid tileWidth:tmpTileWidth tileHeight:tmpTileHeight spacing:0]; 
        [tileSets addObject:currentTileSet]; 
        [currentTileSet release]; 
        tilesetCounter ++; 


      } 
      else if ((index = [self getStringBetweenStrings:r substring1:"r name=\"" substring2:"\"" newArray:result2]) != 0) 
      { 

        tileX = 0; 
        tileY = 0; 

        tmpLayerName = [NSString stringWithUTF8String:result2]; 

        r += index +1; 
        index = 0; 
        index = [self getStringBetweenStrings:r substring1:"th=\"" substring2:"\"" newArray:result2]; 
        if (r != 0); 
         tmpLayerWidth = atoi(result2); 


        r += index +1; 
        index = 0; 
        index = [self getStringBetweenStrings:r substring1:"ht=\"" substring2:"\"" newArray:result2]; 
        if (r != 0); 
         tmpLayerHeight = atoi(result2); 

        currentLayer = [[Layer alloc] initWithName:tmpLayerName layerID:layerCounter layerWidth:tmpLayerWidth layerHeight:tmpLayerHeight]; 
        [layers addObject:currentLayer]; 
        [currentLayer release]; 
        layerCounter ++; 

      } 


     } 







} 




-(void)substringIndex:(char*)c index:(int)x newArray:(char*)result 
{ 
     result[0] = 0; 
     for (int i = 0; i < strlen(c); i++) 
     { 
      result[i] = c[i]; 
      if (i == x) 
      { 
        result[i+1] = '\0'; 
        break; 

      } 

     } 
} 


-(int)findSubstring:(char*)c substring:(char*)s 
{ 
     int sCounter = 0; 
     int index = 0; 

     int d; 
     for (int i = 0; i < strlen(c); i ++) 
     { 
      if (i > 500)//max line size 
        break; 
      if (c[i] == s[sCounter]) 
      { 
        d = strlen(s); 
        sCounter ++; 

        if (d > sCounter) 
        { 

        } 
        else 
        { 
         index = i - (d); 
         break; 
        } 
      } 
      else 
        sCounter = 0; 

     } 
       return index; 


} 

-(int)getStringBetweenStrings:(char*)c substring1:(char*)s substring2:(char*)s2 newArray:(char*)result 
{ 
     int sCounter = 0; 
     int sCounter2 = 0; 
     int index = 0; 
     int index2 = 0; 

     int d; 
     for (int i = 0; i < strlen(c); i ++) 
     { 

      if (index != 0) 
      { 
        if (c[i] == s2[sCounter2]) 
        { 
         d = strlen(s2); 
         sCounter2 ++; 

         if (d > sCounter2) 
         { 

         } 
         else 
         { 
           index2 = i - (d); 
           break; 
         } 
        } 
        else 
         sCounter2 = 0; 


      } 
      else 
      { 
        if (c[i] == s[sCounter]) 
        { 
         d = strlen(s); 
         sCounter ++; 

         if (d > sCounter) 
         { 

         } 
         else 
         { 
           index = i; 

         } 
        } 
        else 
         sCounter = 0; 

      } 

     } 
     if (index != 0 && index2 != 0) 
      [self substringIndex:(c + index+1) index:index2-index-1 newArray:result]; 

return index; 
} 

(Je sais qu'il est beaucoup de code à mettre ici) Je pensais que l'aide des tableaux char de base que je pourrais augmenter considérablement les performances, au moins sur le code à base de nœud initial que je remplaçais.

Merci pour tous vos efforts.

+0

Avez-vous testé la sérialisation PList au lieu de le faire manuellement? –

+1

La meilleure réponse semble être "revenir à votre code d'origine et corriger les bugs". A défaut, essayez de profiler le code avec Shark. – JeremyP

Répondre

1

Il semble que vous numérisiez l'ensemble de la matrice chaque fois que vous recherchez une nouvelle ligne plutôt que de commencer là où vous l'aviez laissé? Essayez d'utiliser strtok, qui fait cela pour vous.

1

Je vous recommande fortement de revenir en arrière et d'utiliser NSXMLParser, ou si vous devez utiliser votre propre libxml ou quelque chose comme ça. Les analyseurs XML sont non triviaux et très bien résolus. Si vous avez des fuites de mémoire, il y a beaucoup d'outils dans Xcode qui peuvent vous aider à dépister cela. Vos autres alternatives utilisent des listes de propriétés, qui peuvent être sérialisées binaires, ou CoreData.

Questions connexes