Помогая другим решить их проблемы проекта cocos2d за прошлый год стало очевидно, что у многих проектов есть по крайней мере одна большая проблема в одной из этих областей:

  • управление памятью
  • управление ресурсом
  • кодовая структура

Примеры

Управленческие проблемы памяти обычно колеблются от распределения слишком большой памяти, или загружая слишком много структур фронт, которые только собираются быть необходимыми позже, или утечками памяти, такими как сцены, не освобождающие, переключая сцены. Проблемы управления ресурса располагаются от не добавления правильных ресурсов к правильной цели, часто приводящей к увеличенному размеру Приложения, потому что ресурсы добавлены к связке, но никогда не используются Приложением. Это могло также означать загружать идентичные файлы ресурса за исключением того, что у них есть различные имена файла (копии?), израсходовав дополнительную память. Или не плотно упаковывающие вещи эльфы в Атласы Структуры, но вместо этого использование одного Атласа Структуры за объект игры – в то время как это понятно с точки зрения логического seperation, он действительно тратит впустую возможности для оптимизации. It could also mean loading identical resource files except that they have different filenames (copies?), using up additional memory. Or not tightly packing sprites into Texture Atlases but instead using one Texture Atlas per game object – while this is understandable from a standpoint of logical seperation it does waste opportunities for optimization.

Наконец, кодовая структура или нехватка этого регулярно приводят “ко всему в одном классе” кодовый дизайн, который является наиболее вероятным эволюционный процесс, а не намеренным. Весьма распространено видеть классы с тысячами линий кодекса, иногда даже идущие прошлые 10 000 линий кодекса в одном классе. Другие вещи используют слишком много CCLayers без них добавляющий ясную выгоду, например только, чтобы сгруппировать все узлы в определенном заказе z вместе или сгруппировать их функциональностью, eg один слой для врагов, один для игроков, один для фона, один для UI, один для счета, один для эффектов частицы, и так далее – без любого из этих слоев, используемых для того, в чем они действительно хороши: изменение многократных узлов сразу, как перемещение, вычисление, вращение или z-переупорядочение их. И конечно есть копия & паста черт, большие блоки программы, воспроизведенные в различных местах только, чтобы изменить некоторые параметры вместо того, чтобы создать метод, который берет поддающиеся изменению параметры в качестве аргументов. Даже профессионалы, я работал со ставшимся, столь привыкшим к выполнению, что стало трудно только преодолеть сопротивление того, чтобы отпускать старых привычек. Но они учились. Other things are using too many CCLayers without them adding a clear benefit, for example just to group all nodes at a specific z order together or to group them by functionality, eg one layer for enemies, one for players, one for background, one for UI, one for score, one for particle effects, and so on – without any of these layers being used for what they’re really good at: modifying multiple nodes at once, like moving, scaling, rotating or z-reordering them. And of course there’s the copy & paste hell, large blocks of code reproduced in various places only to modify some parameters instead of creating a method which takes the modifiable parameters as arguments. Even professionals I worked with got so used to doing that it became hard just to overcome the resistance of letting go of old habits. But they learned.

Резюме

Ничто из этого кодового дизайна и структурирования не кажется мне странный или удивительный. Я написал кодекс как это непосредственно. Я также верю, достаточно хорошо ли это и работы, тогда какого черта нет? Это - вопрос опыта, и только с опытом Вы ясно видите, как улучшить вещи. Это сводится к регулярной кривой обучения, где только обучение и обучение и просто делание ошибок и изучение от них помогают в конечном счете. Это - то, как мы изучаем вещи. I also believe if it’s good enough and works, then why the hell not? It’s a matter of experience and it’s only with experience that you clearly see how to improve things. This boils down to the regular learning curve where only training and tutoring and just simply making mistakes and learning from them helps in the long run. That’s how we learn things.

С другой стороны вещи как управление Памятью и Ресурсом могут также быть выучены лишь, у них есть различная природа. Они могут быть статистически оценены, они могли быть вычислены и проверены автоматически. Это заставляет меня задаться вопросом, нет ли некоторых инструментов автоматизации и информации, которые помогли бы разработчикам достигнуть лучших результатов с точки зрения использования памяти и управления ресурсом? Тем временем это - все о подъеме понимания … This makes me wonder if there isn’t some kind of automation and information tools that would help developers achieve better results in terms of memory usage and resource management? In the meantime it’s all about raising awareness …

Подъем Понимания Памяти

Что наиболее важно я думаю, что мы должны поднять больше понимания до этих проблем cocos2d разработчикам. Один шаг к этому был бы для cocos2d, чтобы показать “доступный прилавок памяти” рядом с прилавком FPS. Я имел обыкновение исправлять CCDirector, чтобы просто показать память вместо FPS, так как это было всегда более важным для меня. Товарищ cocos2d разработчик Джозеф послал мне свою версию, чтобы показать обоих – я просто не думал об очевидном. Так, если Вы хотели бы видеть FPS и доступную память друг рядом с другом, я думаю, что Вы можете обращаться с изменениями CCDirector, обрисованного в общих чертах здесь: I used to patch CCDirector to simply display memory instead of FPS since that was always more important to me. Fellow cocos2d developer Joseph sent me his version to display both – I simply didn’t think of the obvious. So if you’d like to see FPS and available memory next to each other I think you can handle the changes to CCDirector outlined here:


//CCDirector.h, добавляют ниже @interface:
+ (двойной) getAvailableBytes;
+ (двойной) getAvailableKiloBytes;
+ (двойной) getAvailableMegaBytes;

//CCDirector.m, добавляют как соответствующий:
#include <sys/sysctl.h>  
#import <mach/mach.h>
#import <mach/mach_host.h>

[...]

+ (двойной) getAvailableBytes
{
  vm_statistics_data_t vmStats;
  mach_msg_type_number_t infoCount = HOST_VM_INFO_COUNT;
  kern_return_t kernReturn = host_statistics (mach_host_self (), HOST_VM_INFO, (host_info_t)&vmStats, &infoCount);

  если (kernReturn! = KERN_SUCCESS)
  {
    возвратите NSNotFound;
  }

  возвратитесь (vm_page_size * vmStats.free_count);
}

+ (двойной) getAvailableKiloBytes
{
  возвратитесь [CCDirector getAvailableBytes] / 1024.0;
}

+ (двойной) getAvailableMegaBytes
{
  возвратитесь [CCDirector getAvailableKiloBytes] / 1024.0;
}

[...]

- (пустота) showFPS
{
  структуры ++;
  accumDt + = dt;

  если (accumDt> CC_DIRECTOR_FPS_INTERVAL)  {
    frameRate = frames/accumDt;
    структуры = 0;
    accumDt = 0;

    //единственное изменение в showFPS - эта линия:
    NSString *str = [[NSString alloc] initWithFormat:@" %.1f  %.1f", frameRate, [CCDirector getAvailableMegaBytes]];

    [FPSLabel setString:str];
    [выпуск str];
  }
}

Подъем понимания к протекающим Сценам

Кроме того, я чрезвычайно, сильно и с предельным укреплением (не вытаскивая оружие) рекомендую cocos2d разработчикам часто проверить dealloc методы Вашей сцены. Предпочтительно добавьте контрольную точку там, или по крайней мере добавьте линию заготовки леса: CCLOG (”dealloc: %”, сам). Если Вы хотите более видимый, но менее навязчивый метод, Вы могли бы сделать что-то как высвечивание экрана или игра звука всякий раз, когда последняя сцена освобождена, так, чтобы Вы стали настолько привыкшими к этому, что, когда Вы не видите или слышите это больше, это немедленно поднимает Ваше внимание. CCLOG(@”dealloc: %@”, self). If you want a more visible but less intrusive method you could do something like flashing the screen or playing a sound whenever the last scene is deallocated, so that you get so used to it that when you’re not seeing or hearing it anymore it immediately raises your attention.

Если когда-либо во время развития Вашего проекта dealloc метод сцены не называют, когда Вы изменяете сцены, Вы пропускаете память. Утечка целой сцены является утечкой памяти худшего вида. Вы хотите поймать это рано, в то время как Вы можете все еще восстановить свои шаги, которые, возможно, вызвали проблему. Как только Вы добираетесь до использования сотен активов и тысяч линий кодекса и затем понимаете, что сцена не освобождена, Вы будете в для забавной поездки, пытающейся выяснять, куда это прибывает из. В этом случае удаление узлов, некомментируя их, пока Вы не можете приблизиться к преступнику, является, вероятно, лучшей стратегией, рядом с использованием Инструментов (который я не счел слишком полезным в тех случаях). You want to catch that early while you can still retrace your steps that might have caused the problem. Once you get to using hundreds of assets and thousands of lines of code and then realize the scene isn’t deallocated, you’ll be in for a fun ride trying to figure out where that’s coming from. In that case, removing nodes by uncommenting them until you can close in on the culprit is probably the best strategy, next to using Instruments (which I haven’t found too helpful in those cases).

Я столкнулся с такой проблемой как, потому что я передавал объект CCScene к подклассам так, чтобы у них был доступ к методам сцены. Подкласс сохранил сцену и был самостоятельно получен из CCNode и добавил к CCScene как ребенок. Проблема с этим: во время уборки сцены это правильно удалило все детские узлы, но некоторые из детских узлов все еще сохранили сцену. Из-за этого их dealloc метод никогда не называли, и в свою очередь сцена никогда не освобождалась. The problem with that: during cleanup of the scene it correctly removed all child nodes but some of the child nodes still retained the scene. Because of that their dealloc method was never called, and in turn the scene was never deallocated.

Книга cocos2d, Глава 5: Получение, больше и лучше

23 июля 2010, в Объявлениях, книге, Штеффеном Иттераймом by Steffen Itterheim

Глава 5 – Получение больше и лучше

Суть этой главы должна будет обсудить простой проект игры из предыдущей главы. Я бросил все в один класс, ясно не, что Вы хотите сделать для больших игр. Но получение от одного класса до реального кодового дизайна - большой шаг, который некоторые смущаются делать. Я сделаю это легче и буду обсуждать общие вопросы и их решения, такой как, что к seperate, что подклассифицировать от и как у Вас могут быть все объекты seperated, общаются друг с другом и обменивают информацию различными способами. But getting from one-class to real code design is a big step which some hesitate to take. I’ll make that easier and discuss common issues and their solutions, such as what to seperate, what to subclass from and how you can have all the seperated objects communicate with each other and exchange information in various ways.

Большая тема, конечно, будет то, как использовать в своих интересах cocos2d’s иерархию сцены и какие ловушки это может иметь, перемещаясь от игры единственного слоя до того, у которого есть многократные слои и даже многократные сцены.

Что касается названия главы я не настолько уверен, если это будет им. Возможно по пути, в то время как я пишу, что изменю это. Приветствие предложений! Suggestions welcome!

В пятницу, 30-ого июля будет представлена глава.

Каково Ваше взятие на хорошей кодовой структуре cocos2d?

Вы когда-либо боролись с cocos2d концепциями проекта? Или cocos2d иерархия сцены? Или как к расположению сцена и делят Вашу игру на логические части? Скажите мне об этом. Or how to layout a scene and divide your game into logical parts? Tell me about it.

Я знаю, что вопросы о тезисах являются несколько родовыми, чтобы спросить. Именно о вещах не чувствуют себя хорошо, но там, кажется, не лучший, более очевидный путь. Я думаю, что все мы знаем некоторых из тех, если Вы делаете, убедиться, что сказали мне! Оставьте комментарий или напишите мне электронную почту. I think we all know some of those, if you do, be sure to tell me! Leave a comment or write me an email.

Резюме работы над Главой 4 – Сначала простая игра

Игру, которую я хотел делать, называют Снижением Болвана и особенностями, понижающими пауков, и акселерометр управлял иностранцем, пытающимся избегать пауков. В целом это было разделено на 8 конкретных шагов. Партии и много кодовых комментариев, также. Lots and lots of code comments, too.

Это начинает достаточно простые, добавляющие ресурсы к Xcode и добавляющих эльфов. Это получает больше геймплея-esque, когда управляемые акселерометром средства управления игрока щипнули, чтобы обеспечить ускорение и замедление объекта игрока. Напротив, движения пауков стимулируют только действия. In contrast, the spiders movements are driven only by actions.

Я представляю Вас двум недокументированной функциональности cocos2d, а именно, CCArray, который является с тех пор v0.99.4, имел обыкновение хранить всех детей узла. Другой класс CGPointExtension, у которого есть все функции, обычно обеспечиваемые двигателем физики, однако не, каждая игра должна связать двигатель физики только, потому что каждый нуждается в тех математических функциях. Именно поэтому CGPointExtension пригождается. That’s why CGPointExtension comes in handy.

С ccpDistance методом сделаны проверки столкновения. Простые радиальные столкновения, и в режиме отладки радиусы столкновения оттянуты также.

Промежуточный CCLabel для счета был заменен CCBitmapFontAtlas, потому что это убило framerate. Я коротко упоминал Хиро и как использовать это в принципе, но для всех деталей не было никакой комнаты. Но в то время как я был в этом, я создал Обучающую программу Hiero. But while I was at it I created the Hiero Tutorial.

В конце проекта я добавил некоторый блеск, который не описан в книге (слишком много деталей), но действительно добавляет к взгляду игры и чувству. Снижение пауков, висите в там, затем зарядите перед опущением, всеми сделанными действиями использования. Я также добавил нить, которую они вешают от использования ccDrawLine. И затем есть игра закончена лейбл который шоу даже больше использования действия. I’ve also added the thread they’re hanging from using ccDrawLine. And then there’s a game over label which shows even more action use.

Один из принципов, за которыми я следовал, должен избежать неподвижных координат в максимально возможной степени. Таким образом, проект, когда-то законченный, действительно бежал очень хорошо на iPad. Хотя опыт - различный, есть больше понижения пауков, и они понижаются быстрее, но есть также более безопасное пространство, чтобы маневрировать к. Although the experience is a different one, there’s more spiders dropping and they drop faster but there’s also more safe space to maneuver to.

Об и, искусство игры - вся шахта. Да, я знаю …, но у Пауков человека действительно есть только шесть ног! :)

Книга cocos2d, Глава 2: Начало

2 июля 2010, в Объявлениях, книге, cocos2d, Штеффеном Иттераймом by Steffen Itterheim

Глава 2 – Начинание

Эта глава начинается с обычных предпосылок. Загрузите и установите iPhone SDK и cocos2d. Монтаж cocos2d Шаблоны. Создание первого проекта от cocos2d проектирует шаблон. Installing cocos2d Templates. Creating the first project from a cocos2d project template.

Из того, что я уже написал, что оцениваю, что это будет приблизительно одной третью главы. Я думаю, что было бы самым интересным в этой главе, должен говорить об общей кодовой структуре проектов cocos2d. Основные элементы как Сцены, Слои и Узлы. Как перейти от одного экрана до другого, чтобы видеть, что мы фактически делаем что-то прохладное с небольшим усилием. Для этого я думаю, что запланированные отборщики должны также быть представлены переходам времени, и одним экраном мог бы быть Слой, который ждет входа прикосновения, чтобы продвинуться к следующему экрану. The basic elements like Scenes, Layers and Nodes. How to transition from one screen to another, to see that we’re actually doing something cool with little effort. For that I think the scheduled selectors should also be introduced to time transitions, and one screen might be a Layer which is waiting for touch input to advance to the next screen.

Это могло бы также быть хорошее место, чтобы обсудить cocos2d управление памятью, как статический автовыпуск initializers, и удостоверяющийся называют dealloc, когда Вы переключаете сцены – иначе у Вас, очевидно, есть утечка памяти.

Цель состоит в том, чтобы получить читателя в положение, где он чувствует себя комфортно, выкладывая структуру экрана в cocos2d. Он знает, как калибровать объекты и как добавить и удалить их из сцены. Фонд работы с cocos2d, если Вы так будете. The foundation of working with cocos2d if you so will.

То, что делает Вы думаете, должно быть в Главе 2?

Сообщите мне, думаете ли Вы, что я пропускаю что-либо важное. Если бы у Вас нет никаких предложений, тогда только думают о том, что Вы ожидали бы от главы, читая это описание, которое могло бы дать Вам некоторые мысли.

Также я приветствовал бы любые подсказки, и распространенные ошибки в первый раз cocos2d разработчики могли бы заманить себя в ловушку в. Опытные подсказки также приветствуются, те небольшие противные вещи или привычки, которые могли укусить Вас позже, если Вы не рассматриваете их с начала.

Я с нетерпением жду Вашей обратной связи! Ранее лучше. Глава 2 будет представлена затем пятница, 9-ого июля. Chapter 2 will be submitted next Friday, July 9th.

Что запланировано Главу после этого

Только, чтобы поместить Главу 2 в контекст, для Главы 3 я планирую говорить о существенных cocos2d классах и процессах. Эльфы, Лейблы, Меню, Действия, и т.д. Это покажет Вам, как работать с ними использующий маленькие фрагменты кода. У главы, вероятно, будет "справочный" характер с различными кодовыми образцами, так, чтобы опытные пользователи чувствовали себя комфортно, пропуская вперед, в то время как новички все еще считают это легким и ободрительным, чтобы поднять детали. It’ll show you how to work with them using small code snippets. The chapter will probably have a “reference” character with various code samples, so that experienced users feel comfortable skipping ahead while beginners still find it easy and encouraging to pick up the details.