Мне интересно, как оптимизировать использование CCSpriteBatchNode. Другими словами, я понимаю, что:
- 1) Каждый экземпляр CCSpriteBatchNode выполняет один вызов метода рисования, что приводит к сокращению вызовов OpenGL и, следовательно, к значительному повышению производительности.
- 2) Каждый CCSpriteBatchNode может ссылаться на один и только текстурный атлас.
В чем я не уверен на 100% и хотел бы получить ваш ответ:
3) Если у меня есть один атлас текстур, например. game-art-hd.png и создайте несколько CCSpriteBatchNode в разных классах, получу ли я несколько вызовов отрисовки? Другими словами, я предполагаю, что каждый экземпляр CCSpriteBatchNode будет вызывать свой собственный метод отрисовки, что приведет к множественным вызовам отрисовки GL и снижению производительности по сравнению с одним общим пакетным узлом. Я прав?
– 4) Если я использую анимацию, состоящую из нескольких кадров спрайта, думаю, мне следует добавить кадры анимации в пакетный узел спрайта. Как мне это сделать?
Ниже приведен фрагмент кода о том, как я обычно анимирую спрайт. Как можно заметить, кадры спрайтов не добавляются в узел пакета спрайтов. Для повышения производительности мне, вероятно, следует сделать это во время инициализации. Это правильно?
NSMutableArray* frames = [[NSMutableArray alloc]initWithCapacity:2]; for (int i = 0; i < 4; i++) { NSString*bulletFrame = [NSString stringWithFormat:@"animation-%i.png", i]; CCSpriteFrame* frame = [[CCSpriteFrameCache sharedSpriteFrameCache]spriteFrameByName:bulletFrame]; [frames addObject:frame]; } CCAnimation* anim = [CCAnimation animationWithFrames:frames delay:0.1f]; CCAnimate* animate = [CCAnimate actionWithAnimation:anim]; CCRepeatForever* repeat = [CCRepeatForever actionWithAction:animate]; [self runAction:repeat]; }
5) Частично ссылаясь на 4. Вы подтверждаете, что предпочитаете избегать добавления и удаления спрайтов в пакетном узле спрайтов во время выполнения?
6) Будет ли CCSpriteBatchNode учитывать только спрайты, у которых для параметра visible установлено значение true, или спрайты, положение которых фактически находится за пределами области экрана?
Другие соображения по поводу 3
Чтобы учесть мое предположение в 3. и уменьшить количество экземпляров CCSpriteBatchNode, мое решение будет следовать тому, что предложено @Suboptimus в этом ответ. Мне нравится предложенный подход инициализации классов, которые хотят использовать один и тот же пакетный узел с классом MainScene, а не предоставлять им доступ к MainScene через self.parent.parent.(...).parent.finallysharedbatchNode.
Вместо этого другие люди предложили бы обратиться к MainScene, используя self.parent.....parent и правильно приведя его.
Является ли это лучшим подходом с точки зрения разработки программного обеспечения?
Я предпочитаю указывать, куда добавляются спрайты, используя явную ссылку на класс MainScene. Это должно помочь, если я работаю в команде или меняю иерархию классов. Но недостатком этого является то, что мне «нужно» хранить ссылку на него, если я хочу впоследствии добавить спрайты в пакетный узел, что приводит к необходимости поддерживать больше кода.
Причина, по которой я задаю этот вопрос, заключается в том, что если я найду небольшое противоречие между моим традиционным мышлением «Разработка программного обеспечения» и подходом к иерархии «родительский узел Cocos2d». Я новичок в программировании игр и хотел бы понять, какой подход используют опытные разработчики игр, работающие в больших командах :). ЧАС