Обновить
0
@Tiredread⁠-⁠only

Пользователь

Отправить сообщение

Собственная реализация библиотеки ECS

Время на прочтение23 мин
Охват и читатели9.8K
image

На этой неделе я начал работать над своим движком для игры Vagabond и приступил к реализации шаблона entity-component-system.

В этой статье я хочу рассказать о своей реализации, которая свободно доступна на GitHub. Но вместо простого комментирования кода я хочу объяснить, как проектировалась его структура. Поэтому я начну с первой написанной мной реализации, проанализирую её сильные и слабые стороны, а затем покажу, как улучшил её. В конце я перечислю список аспектов, которые также можно улучшить.

Введение


Мотивация


Я не буду рассказывать о преимуществах ECS перед объектно-ориентированным подходом, потому что с этим хорошо справились многие люди до меня. Одним из первых про ECS рассказал на GDC 2002 Скотт Билас. Среди других знаменитых введений в тему можно назвать Evolve Your Hierarchy Майка Уэста и главу Components из потрясающей книги Game Programming Patterns Роберта Нистрома.

Вкратце скажу, что задача ECS — создание ориентированного на обработку данных подхода к игровым сущностям и удобное разделение данных и логики. Сущности (Entities) составляются из компонентов, содержащих данные. А системы, содержащие логику, обрабатывают эти компоненты.

Если вдаваться в детали, то вместо наследования в ECS используется композиция. Более того, этот подход, ориентированный на обработку данных, оптимальнее использует кэш, а значит, достигает отличной производительности.
Читать дальше →

Unity, ECS и все-все-все

Время на прочтение7 мин
Охват и читатели116K


Сколько уже было мануалов "Как сделать игру на Unity за 3 часа", "Делаем Counter-Strike за вечер" и т.п.? Низкий порог входа — это, несомненно, главный плюс и минус Unity. Действительно, можно накидать “ассетов”, дописать несколько простых “скриптов”, обмотать синей изолентой и это даже будет как-то работать. Но когда проект обрастает игровыми механиками, сложной логикой поведения, то проблемы при подобном подходе нарастают как снежный ком. Для внедрения новых механик требуется переписывание кода во многих местах, постоянная проверка и переделывание префабов из-за побившихся ссылок на компоненты логики, не говоря уже об оптимизации и тестировании всего этого. Разумеется, архитектуру можно продумать изначально, но на практике это всегда недостижимая цель — дизайн-документ довольно часто меняется, какие-то части выкидываются, добавляются абсолютно новые и никак не связанные со старой логикой поведения. Компоненты в Unity — это шаг в правильном направлении в виде декомпозиции кода на изолированные блоки, но особенности реализации не позволяют достичь необходимой гибкости, а самое главное, производительности. Разработчики придумывают свои фреймворки и велосипеды, но чаще всего останавливаются на ECS (Entity Component System). ECS – одно из решений, продолжающее идею компонентной модели Unity, но придающее ей ещё больше гибкости и сильно упрощающее рефакторинг и дальнейшее расширение приложения новым функционалом без кардинальных изменений в текущем коде.

Читать дальше →

Source Modding — Часть 2 — Всё есть сущность

Время на прочтение4 мин
Охват и читатели5.6K

В предыдущей части урока мы научились базовой работе с VPC и печати сообщений в консоль разработчика.


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


Читать дальше →

C++ template аллокатора с потокобезопасным циклическим буфером

Время на прочтение9 мин
Охват и читатели9.2K
Вашему вниманию простой C++ template аллокатора с потокобезопасным циклическим буфером.

Вся реализация в одном заголовочном .h файле: [fast_mem_pool.h]

Фишки, чем этот аллокатор лучше сотни подобных — под катом.
Читать дальше →

15 базовых советов по Git для эффективной работы каждый день

Время на прочтение5 мин
Охват и читатели62K

Привет, меня зовут Сергеев Сергей aka gurugray. Сейчас я «Mentor FrontEnd Community» в компании ManyChat. Вы могли видеть мои лекции по релизному циклу и регламенту работ с системами контроля версий в Школе Разработки Интерфейсов Яндекса (ШРИ).


Меня часто спрашивают какие life-hacks или best-practices я использую при работе с Git'ом и репозиториями проекта.


Эта заметка — попытка объяснить те базовые настройки и приёмы, которыми я пользуюсь каждый день. Рецепты не претендуют быть ноу-хау, но могут помочь с освоением ежедневной гигиены работы с репозиторием.


Читать дальше →

Указатели на методы классов в C++

Время на прочтение6 мин
Охват и читатели46K
Привет, интернет.

Решил написать статью об указателях на методы классов. Недавно мне пришлось столкнуться с тем, как они работают изнутри, когда писал некоторые вещи ориентированные под компилятор. Эти указатели работают не совсем как обычные указатели, не имеют возможности быть приведенными в void, и часто имеют размер больше 8 байт. Информации на эту тему в интернете я нашел относительно немного, потому решил разобраться сам.
Читать дальше →

Коды избыточности: простыми словами о том, как надёжно и дёшево хранить данные

Время на прочтение11 мин
Охват и читатели41K


Так выглядит избыточность


Коды избыточности* широко применяются в компьютерных системах для увеличения надёжности хранения данных. В Яндексе их используют в очень многих проектах. Например, применение кодов избыточности вместо репликации в нашем внутреннем объектном хранилище экономит миллионы без снижения надёжности. Но несмотря на широкое распространение, понятное описание того, как работают коды избыточности, встречается очень редко. Желающие разобраться сталкиваются примерно со следующим (из Википедии):



Меня зовут Вадим, в Яндексе я занимаюсь разработкой внутреннего объектного хранилища MDS. В этой статье я простыми словами опишу теоретические основы кодов избыточности (кодов Рида — Соломона и LRC). Расскажу, как это работает, без сложной математики и редких терминов. В конце приведу примеры использования кодов избыточности в Яндексе.


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


* Под термином «коды избыточности» в статье подразумевается инженерный термин «erasure codes».

Читать дальше →

Солнечная электростанция, интернет в деревне и самоизоляция

Время на прочтение7 мин
Охват и читатели29K
Почти год прошел с моей публикации об установке солнечной электростанции на дом 200 кв.метров. В начале весны грянула пандемия и заставила всех пересмотреть взгляды на свое жилище, возможности существования в изоляции от общества и отношение к технологиям. У меня же за это время прошло боевое крещение всей техники и моего подхода самодостаточности своего дома. Сегодня я хочу рассказать о солнечной энергии, обеспечении себя в автономии всеми инженерными системами, а также нормальном и резервном доступе в Интернет. За статистикой и накопленным опытом- под кат.



Создание Minecraft за одну неделю на C++ и Vulkan

Время на прочтение8 мин
Охват и читатели37K
Я поставил перед собой задачу воссоздания с нуля Minecraft за одну неделю с помощью собственного движка на C++ и Vulkan. Меня вдохновил на это Hopson, который сделал то же самое при помощи C++ и OpenGL. В свою очередь, его вдохновил Шейн Бек, которого вдохновила Minecraft, источником вдохновения для которой была Infiniminer, при создании которой, предположительно, вдохновлялись реальными горными промыслами.


Репозиторий GitHub этого проекта находится здесь. У каждого дня есть своя git-метка.

Разумеется, я не планировал в буквальном смысле воссоздавать Minecraft. Этот проект должен был стать обучающим. Я хотел изучить использование Vulkan в чём-то более сложном, чем vulkan-tutorial.com или демо Саши Виллема. Поэтому основной упор сделан на проектирование Vulkan-движка, а не на дизайн игры.

Задачи


Разработка на Vulkan намного медленнее, чем на OpenGL, поэтому я не смог включить в игру многие функции настоящей Minecraft. Нет ни мобов, ни крафта, ни красного камня, ни физики блоков, и т.п. С самого начала цели проекта были следующими:

  • Создание системы рендеринга рельефа
    • Мешинг
    • Освещение
  • Создание системы генератора рельефа
    • Рельеф
    • Деревья
    • Биомы
  • Добавление возможности изменения рельефа и перемещения блоков

Мне нужно было найти способ реализовать всё это без добавления в игру GUI, потому что я не смог найти никаких библиотек GUI, работающих с Vulkan и простых в интеграции.

Что такое алгоритм?! Часть первая

Время на прочтение13 мин
Охват и читатели56K

Терзаем вместе основной кирпичик программиста — Алгоритм.


Title

Читать дальше →

Что такое алгоритм! (часть 2) «Жизнь»

Время на прочтение10 мин
Охват и читатели4.8K

Продолжаем искать рецепт блюда "Алгоритм". В меню обусловленная и свя́зная последовательность исполнения на примере химических и биологических процессов


Title

Читать дальше →

Что такое алгоритм !!? Часть III «Память и мозг»

Время на прочтение13 мин
Охват и читатели6.5K

Используем алгоритм. Он ключ к решению головоломки с названием "Память".


Title

Читать дальше →

Как создать свой первый open source проект на Python (17 шагов)

Время на прочтение10 мин
Охват и читатели68K
Каждый разработчик ПО должен знать как создать библиотеку с нуля. В процессе работы Вы можете многому научиться. Только не забудьте запастись временем и терпением.

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

В этой статье мы пошагово разберем процесс создания базовой библиотеки на Python. Не забудьте заменить в приведенном ниже коде my_package, my_file и т.п. нужными вам именами.

Шаг 1: Составьте план


Мы планируем создать простую библиотеку для использования в Python. Данная библиотека позволит пользователю легко конвертировать блокнот Jupyter в HTML-файл или Python-скрипт.
Первая итерация нашей библиотеки позволит вызвать функцию, которая выведет определенное сообщение.

Теперь, когда мы уже знаем, что хотим делать, нужно придумать название для библиотеки.
Читать дальше →

Почему центр пикселя должен быть в (0,5; 0,5)

Время на прочтение3 мин
Охват и читатели6.8K
Сегодня, когда всё популярнее становится трассировка лучей (ray tracing) выполняемая из «глаза» камеры, этот урок нужно усвоить заново: код становится лучше, а жизнь — проще, если центр пикселя находится в координате (0,5; 0.5). Если вы уверены, что делаете всё правильно, то продолжайте в том же духе, для вас в статье нет ничего нового. Прочитайте лучше вот это.

Смысл размещения центра пикселя в (0,5; 0,5) впервые объяснила (по крайней мере, мне) милая короткая статья Пола Хекберта «Что такое координаты пикселя?» из книги 1990 года Graphics Gems, стр. 246-248.

Сегодня эту статью найти трудновато, поэтому вкратце изложу её суть. Допустим, у нас есть экран с шириной и высотой 1000. Давайте рассмотрим только ось X. Может возникнуть искушение назначить 0,0 центром самого левого пикселя в строке, 1,0 — центром следующего, и так далее. Можно даже использовать округление, при котором координаты с плавающей запятой 73,6 и 74,4 переносятся в центр 74,0.

Однако над этим стоит поразмыслить. При таком сопоставлении левый край будет находиться в координате -0,5, а правый — в 999,5. С такой системой неудобно работать. Хуже того, если к значениям координат пикселей применяются различные операторы наподобие abs() или mod(), то такое сопоставление может привести к незначительным погрешностям на краях.

Проще работать с интервалом от 0,0 до 1000,0, в котором центр каждого пикселя имеет дробную часть 0,5. Например, тогда целочисленный пиксель 43 будет иметь красивый интервал значений значений входящих в него субпикселей от 43,0 до 43,99999. Вот чертёж из статьи Пола:

Читать дальше →

100 cамых ценных репозиториев GitHub [по версии алгоритма UOS]

Время на прочтение10 мин
Охват и читатели52K
Привет, Хабр! Представляю вашему вниманию подборку — перевод статьи из Hackernoon «GitHub’s Top 100 Most Valuable Repositories Out of 96 Million». А саму статью написали ребята, которые использовали алгоритм U°OS Network, чтобы выявить самые ценные оупесорсные проекты на Github.

image
Читать дальше →

Монетизация в онлайн-играх: как использовать чужой опыт для собственных нужд

Время на прочтение3 мин
Охват и читатели4.4K
image

Иногда “добрые люди” интересуются какую бы новую акцию придумать, чтобы повысить средний чек игроков, конвертировать неплатящих в платящих или, чем черт не шутит, увеличить LTV. Вопрошающие в большинстве случаев не идут дальше банальностей вроде “предложить больше ништяков за меньшие деньги” или “побрейнштормить”. А между тем, монетизационных концепций т.е. принципов на которых строится монетизация в играх, не так чтоб очень много. Я бы даже сказал — совсем немного и вместо того, чтобы придумывать что-то из головы, высматривать в остатках кофейной гущи или выкуривать из бабушкиного гербария, стоило бы присмотреться к уже существующим играм и совершить перенос их подхода к себе. Под “переносом” понимаю не тупое “сдирание”/копирование, как это обычно бывает, а адаптацию под свой конкретный случай.

О том, как это можно делать см. в продолжении статьи.
Читать дальше →

Почему функциональное программирование такое сложное

Время на прочтение15 мин
Охват и читатели96K

Я несколько раз начинал читать статьи из серии «Введение в функциональное программирование», «Введение в Теорию Категорий» и даже «Введение в Лямбда Исчисление». Причем и на русском, и на английском. Каждый раз впечатление было очень сходным: во-первых, много новых непонятных слов; во-вторых, много новых определений, которые возникают из ниоткуда; в-третьих, совершенно непонятно, как это использовать.


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


Попытки использовать как-то в работе изученные концепции разбивались о полное непонимание, как применить полученное глубокое знание. Ведь, напомню, что парадигму ФП (где-то удобнее, где-то не очень, но) можно использовать практически в любом ЯП, совсем необязательно для этого изучать условный Хаскель.

Читать дальше →

Принципы SOLID в картинках

Время на прочтение4 мин
Охват и читатели665K


Если вы знакомы с объектно-ориентированным программированием, то наверняка слышали и о принципах SOLID. Эти пять правил разработки ПО задают траекторию, по которой нужно следовать, когда пишешь программы, чтобы их проще было масштабировать и поддерживать. Они получили известность благодаря программисту Роберту Мартину.

В Сети множество отличных статей, где рассказывается о принципах SOLID, но иллюстрированных среди них мне практически не попадалось. Из-за этого таким людям со склонностью к визуальному восприятию информации – таким, как я – бывает сложно схватывать суть и не отвлекаться.

Основная цель этой статьи – лучше усвоить принципы SOLID через отрисовку иллюстраций, а также определить назначение каждого принципа. Дело в том, что некоторые из принципов кажутся похожими, но функции выполняют разные. Может получиться так, что одному принципу следуешь, а другой при этом нарушаешь, хотя с виду особой разницы между ними нет.

Чтобы проще читалось, я упоминаю здесь только классы, однако всё сказанное в статье применимо также к функциям, методам и модулям, так что имейте это в виду.

Ну, приступим.
Читать дальше →

Идеальное пользовательское соглашение: как минимизировать риски для разработчиков

Время на прочтение6 мин
Охват и читатели4.1K
В работе компаний-производителей программного обеспечения есть много рисков, но мало кто отнесет к ним недостаточно проработанное пользовательское соглашение. Однако если подойти к этому вопросу невнимательно и не учесть важные детали, есть риск столкнуться с серьезными последствиями в дальнейшем.
Читать дальше →

Написать игровой движок на первом курсе: легко! (ну почти)

Время на прочтение8 мин
Охват и читатели34K
Привет! Меня зовут Глеб Марьин, я учусь на первом курсе бакалавриата «Прикладная математика и информатика» в Питерской Вышке. Во втором семестре все первокурсники нашей программы делают командные проекты по С++. Мы с моими партнерами по команде решили написать игровой движок. 

О том, что у нас получается, читайте под катом.

Читать дальше →
1
23 ...

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность