Привет, Хабр! Представляю вашему вниманию перевод статьи " Шаблоны проектирования в Cocos2d-x "Алексея Пинчука.
Статья будет интересна разработчикам Cocos2d-x и тем, кто изучает паттерны.
Он выполнен в виде краткого аннотации, в котором можно быстро увидеть, где в Cocos2d-x используется тот или иной паттерн.
Целью этой статьи не является предоставление полного описания каждого шаблона.
Генеративные шаблоны
Опытный образец
Прототип определяет интерфейс копирования объекта.Новый объект создается путем копирования состояния объекта.
Например, если мы вызовем функцию clone() для объекта Animation, мы создадим объект Animation с точно такими же параметрами.
Синглтон
Да, окей.
Структурные закономерности
Наилегчайший вес
Приспособленец следует использовать для использования одних и тех же ресурсов по отдельности, не создавая большого количества копий одного и того же ресурса.Это позволяет эффективно использовать память.
Этот шаблон хорош для отображения текста.
Класс Label используется для отображения текста.
Для отображения текста нам нужен шрифт. Чтобы получить шрифт TTF, вам нужно использовать метод getFontAtlasTTF класса FontAtlasCache. FontAtlasCache — это пул всех шрифтов, используемых в приложении.
Шрифт сохраняется до тех пор, пока его использует хотя бы один объект. Если у нас есть 10 объектов Label с одним и тем же шрифтом, то все они будут использовать один и тот же экземпляр класса FontAtlas.
FontAtlas содержит данные для отображения символа — текстуры и координаты.
Размер текстуры 512х512 и таких текстур можно создать несколько, если все персонажи не поместятся в одну.
Создаются только те символы, которые используются объектами, ссылающимися на этот шрифт. Label получает структуру FontLetterDefinition из FontAtlas для каждого символа.
На основе данных из этой структуры Label создает спрайт и помещает его в свой BatchNode. В целом мы видим, насколько тщательно оптимизирован Label.
Еще один хороший пример совместного использования ресурсов — использование спрайтами текстур.
Текстура для каждого скачанного файла хранится в единственном экземпляре.
Несколько спрайтов, созданных из одного файла, будут связаны с одним и тем же экземпляром текстуры.
Мы можем найти некоторую закономерность — если имя класса заканчивается на Cache, то он создаёт объекты для отдельного использования.
Мост
Мост разделяет абстракцию и реализацию.Этот шаблон чаще всего используется для реализации кроссплатформенных объектов.
Classic Bridge можно найти в EditBox и Downloader.
Этот шаблон также хорош для GLView, AudioEngine, Controller и WebView. Однако в них мы видим разные способы реализации одной и той же задачи — отделение абстракции от реализации.
Композитный
Цель Composite — построение деревьев и унификация доступа к компонентам дерева.
Обычно составная схема выглядит следующим образом:
Composite — составной объект, состоящий из нескольких объектов, унаследованных от Component. Таким образом, мы можем воспринимать несколько объектов как один.
В Cocos2d-x узел является одновременно составным и компонентом.
Благодаря Node создается граф-сцена, каждый узел которой является Node.
Модели поведения
Команда
Команда инкапсулирует запрос как объект, тем самым позволяя ставить запросы в очередь.Другие варианты использования мы рассматривать не будем.
В Cocos2d-x этот шаблон используется для создания очереди для средства рендеринга.
Благодаря этому шаблону было удалено использование API OpenGL внутри объектов.
Один и тот же код для OpenGL выводится одной командой и не копируется несколько раз.
Это также может облегчить переход к другим графическим API, но это не сделает его простым.
наблюдатель
Определяет зависимость «один ко многим» между объектами.В Cocos2d-x субъектом является EventDispatcher, а наблюдателем — EventListener. EventDispatcher не является одноэлементным, мы можем наследовать от него наш EventDispatcher. Директор через EventDispatcher уведомляет наблюдателей об изменениях состояния акселерометра, мыши, клавиатуры и т. д. Также можно создавать собственные сообщения EventCustom. Эти сообщения имеют имя и данные, которые необходимо отправить наблюдателю.
Это альтернатива NotificationCenter, которая уже помечена как устаревшая.
Директор также определяет несколько полезных EventCustoms, таких как EVENT_BEFORE_UPDATE, EVENT_AFTER_UPDATE и другие.
EVENT_BEFORE_UPDATE удобно использовать при работе с Box2D. Например, перед обновлением физического мира измените линейную скорость какого-нибудь объекта.
Шаблоны разделения
Компонент
Я думаю, что каждый разработчик игр знает о компонентной архитектуре.Программисты Unity3d обязательно должны это знать.
Эта система уменьшает связанность компонентов и позволяет добавлять компоненты к объекту, даже если объект об этом даже не знает. Эта система находится в Cocos2d-x. Каждый узел имеет контейнер для компонентов.
Ваши компоненты должны наследовать от класса Component. Каждый компонент имеет ссылку на узел, который им владеет (владельца), метод обновления и метод сериализации для обработки сообщений между компонентами и другими объектами.
Шаблоны оптимизации
Местоположение данных
Цель этого паттерна — ускорить доступ к памяти за счет более удобного размещения данных для кэширования процессором.Этот шаблон часто используется для создания частиц.
А в Cocos2d-x он также используется для создания частиц.
В ParticleSystem все данные о частицах хранятся в ParticleData. ParticleData содержит данные для всех частиц.
Почти каждый член ParticleData представляет собой массив.
Например, массив posx хранит координаты частиц по оси x.
Теги: #cocos2d-x #cocos2d-x #patterns #patterns #creativepatterns #PROTOTYPE #singleton #structural Patterns #flyweight #bridge #composite #behavioral #command #observer #Decoupling Patterns #компонент #шаблоны оптимизации #локальность данных #грязный флаг #паттерны #ООП #паттерны проектирования #программирование #дизайн и рефакторинг #Разработка игрclass ParticleData { public: float* posx; float* posy;
-
Денежный Ящик – Объективный Обзор
19 Oct, 24