"Из пушки по воробьям или недооцененные BitMask"
Многим из вас нравятся тэги Tag, или GameplayTag, когда я пишу что для квантизованных мелких задач использовать их не всегда разумно многие хотят возразить, ну что же, по ним уже есть хороший разбор уважаемого автора https://boosty.to/natatem00/posts/5dd090fb-3eb5-418d-8400-ec9ed93653cd?share=post_link где описаный многие подводные камни полностью исключаемые при использовании BitMask значений когда это уместно.
А теперь к тому чем-же битовые маски лучше любой системы тегов;
a. Они не используют кэш
b. Их обработка быстрее чем обработка обычной арифметики целых чисел
c. при репликации не тянет лишние переменные, все необходимые состояния уже включены в одной переменной
d. при сохранении они остаются по прежнему простым числом что обрабатывается всегда быстрее чем string
e. в отличие от GameplayTag не требует поиска их в глобальном списке тегов, значения все уже сразу под рукой, накладные расходы минимизируются..
f. быстрее чем FName - который хранит каждое значение как число глобально в виде хэша что требует накладных расчётов на его получение и хэш функцию
g. позволяет за 1 битовую операцию получить общий результат сравнения битов для анализа их комбинаций что эквивалентно многократному поочерёдному сравнению в случае использования раздельных переменных что в некоторых случаях уменьшает количество проверок в несколько раз
h. позволяет передавать данные и флаги для их обработки как единое значение неразрывно
j. так-же в контексте задач когда условная сущность имеет очень простые способности "Ability" зачастую совсем не обязательно тянуть к ней GameplayAbilitySystem и прочие тяжёлые сложные решения, в те моменты когда может быть достаточно просто установки нескольких флагов и эта обработка будет быстрее и стабильнее чем использование сложных систем там где они излишни.
j. не стоит недооценивать потенциал BitMask, часто они по многим параметрам превосходят другие решения но из-за отсутствия удобных инструментов для работы с ними на чуть более удобном для понимания человека уровне абстракции остаются в тени, продолжают преминяться не подходящие под задачу способы и зачастую "стреляя из пушки по воробьям" разработчики лишь утяжеляют и замедляют свой код но там где задачи не столь глобальны, не требуют каких либо особых решений, а просто передать состояние, либо комбинации значений и сделать это надёжно и компактно то BitMask превосходно справляется часто лучше различных вариантов с Tag, GameplayTag, enum, bool итд...
k. так-же они дают большие возможности по шифрованию, сжатию данных, их квантизации минимизируя обьем передаваемых данных
Ну и стоит не забывать что каждый инструмент не луче и не хуже другого если используется правильно, но сразу тянуть заведомо тяжёлую артиллерию в минималистичные задачи может быть не целесообразно и в этом могут помочь BitMask давая большие возможности гибкого использования в различных простых задачах и не имея недостатков более тяжёлых решений
Так-же у меня вышел краткий обзор по одному из решений позволяющих использовать BitMask в BP более удобно и возможно кому-то поможет решить некоторые задачи проще
Набор инструментов для удобной работы с BitMask на уровне абстракции позволяющем комфортно использовать в BP и C++ без необходимости глубоко лезть в битовую математику и логику будет развиваться и далее
Creator has disabled comments for this post.