2012-06-11 2 views
1

Я не уверен в том, каком подход даст мне лучшую производительность:Cocos2d: использование ссылок против производительности GetChild

У меня есть класс GameScene, в котором я пытаюсь выделить объекты, а затем добавить их в качестве Чайлдса в класс с тегом. Этот подход используется во многих примерах, которые я изучил, но я не уверен, что это лучшее, когда мне нужно часто обращаться к дочерним объектам (например, обновлять метку оценки в GameScene). В таких случаях мне интересно, будет ли лучший подход с точки зрения производительности объявлять указатель на те часто используемые объекты и использовать его для доступа к объекту, а не для получения дочернего элемента по тегу.

Полезно ли использовать getChildByTag или получить доступ к этим объектам через их указатель?

As example I provide a label that I frequently update during the game, e.g. it could be the score label: 

@interface GameScene : CCLayer 
{ 
    CCLabelTTF *frequentlyUsedLabel; 
} 

//Implementation 

-(id) initWithId:(int)sceneId 
{ 
    if ((self = [super init])) 
    { 
     //..code 
     frequentlyUsedLabel = [CCLabelTTF labelWithString:@"Hearths:" fontName:@"Arial" fontSize:20]; 
     [self addChild:frequentlyUsedLabel]; 
     } 
} 
+1

Знаете ли вы, что вам нужно улучшить производительность? Если вы этого не сделаете, придерживайтесь своего шаблона, улучшите читаемость кода, таким образом, ремонтируемость. Ответ на ваш вопрос, как указано: getChildByTag гарантированно занимает больше времени, чем использование указателя. Таким образом, речь не идет о том, улучшится ли ваша производительность, но «насколько», следовательно, мое вступительное замечание: если вам не нужно улучшаться, не изменяйте свой код. – YvesLeBorg

+0

Прохладно, дело в том, что мне нужно часто обращаться к этим ярлыкам (почти каждый другой фрейм), и по этой причине я думал, что ответ на «насколько часто» будет «очень часто», но я не был уверен и хотел спросить вас, ребята, если у вас есть похожие подходы-проблемы-переживания. Но спасибо за ваш ответ, это помогает, поскольку я не был уверен, что getChildByTag был медленнее! – mm24

ответ

1
  1. Написать код, который прост в обслуживании.
  2. Все, что стоит оптимизировать, стоит измерить.

Время, необходимое для рендеринга кадра с использованием обоих методов. Спросите себя, если это имеет значение.

дополнительная служебная памяти является немного более трудно измерить (в частности, Cocos2D может использовать умный аллокатор, что является более эффективным, если ваш CCLayer подкласс не декларирует никаких дополнительных Иваров). Я считаю, что 4 байта - это объем памяти, используемый одним пикселем.

С помощью UIKit я лично нахожу гораздо проще использовать ivars, чем беспокоиться о уникальности тегов (особенно при повторном использовании кода в разных приложениях или использовании вида в нескольких местах). Это особенно касается ARC, поскольку вам больше не нужно беспокоиться о getters/seters/keep/release.

+0

thnks, я постараюсь и опубликую некоторые результаты. Мне нужно, чтобы вы повесили инструменты, чтобы измерить производительность, и как только я это сделаю, я опубликую некоторое обновление. Я также должен правильно понять, как Cocos2D и iOS работают вместе, чтобы рисовать каждый кадр (например, есть ли призыв рисования для всей сцены, основанный на абсолютном уровне z, или же вызовы основаны на иерархии узлов и, следовательно, на числе дочерних узлов (а также на количестве z уровни) прямо пропорциональны количеству вызовов..PS: будет ждать день или два, чтобы отметить, как принято, чтобы увидеть, добавляет ли кто-нибудь еще – mm24

+1

. Мое главное было то, что хранение подслоев в ivars, вероятно, проще кодировать и поддерживать, чем использовать теги. Единственная причина, почему * не * - это увеличение использования памяти, но с 4 байтами, разница не стоит беспокоиться. –

+0

Спасибо за объяснение и ответ :) – mm24

Смежные вопросы