Самый быстрый способ скопировать или создать игровой объект CCNode в cocos2d-iphone? - PullRequest
1 голос
/ 26 января 2011

Справочная информация: Я разрабатываю игру для iPhone / iPad с использованием cocos2d-iphone. Наш движок позволяет дизайнеру уровней создавать новых плохих парней, определяя ряд свойств, таких как скорость, искусственный интеллект, оружие и текстура основного спрайта, в файлах .plist.

Проблема: В настоящее время мы строим NSDictionary всех прототипов до начала уровня. Для каждой сущности мы храним имя класса и NSDictionary, описывающий параметры, необходимые для создания нового экземпляра этой сущности. Мы создаем экземпляр каждого прототипа во время загрузки, чтобы предварительно кэшировать текстуры, но немедленно уничтожаем его. Когда появляется новый плохой парень, мы используем сохраненный NSDictionary и передаем его методу init следующим образом (без проверки ошибок для краткости);

IKPrototype* prototype = [prototypes objectForKey:prototypeID]; 
IKBaseEntity* entity = [[[NSClassFromString([prototype prototypeClass]) alloc] init] autorelease];
[entity setPrototypeID:prototypeID];
[entity parseParameters:[prototype parameters]];
return entity;

Теперь это работает, но создание нескольких пуль в одном и том же кадре приводит к заметному замедлению (один или два кадра), когда движок анализирует параметры (иногда 20-30 значений). Однако они, по сути, всегда одинаковы и меняются только при добавлении в мир (что происходит позже).

Вопрос: Какой самый эффективный способ хранения объекта-прототипа для последующего создания дубликатов. Будет ли сериализация / десериализация работать с подклассом CCNode, и будет ли это быстрее, чем я делаю? Было бы лучше сохранить копию конечного объекта в моем классе-прототипе, а затем сделать «глубокую копию» этого объекта для порождения? Придется ли мне беспокоиться о ссылках на CCTexture, если я это сделаю? Пожалуйста, кратко объясните необходимые шаги для предлагаемого решения.

Некоторое время пытался придумать наиболее эффективный метод решения этой проблемы. Мне интересно, есть ли способ, о котором я не думал выше, который мог бы быть лучше? Спасибо, что прочитали это далеко.

1 Ответ

1 голос
/ 02 февраля 2011

Один из подходов, которые я выбрал, заключается в том, чтобы предварительно создать группу объектов во время первой загрузки ресурсов (скажем, в init), кооптируя один из этих ресурсов во время выполнения, просто изменив его параметры. и перемещение его из массива неактивных объектов в активные объекты.

Конечно, вы могли создать недостаточно, но если эти объекты имеют общие текстуры и т. Д., Вы можете создать их как члены CCBatchNode и сделать рисование еще более эффективным. многие из них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...