Что такое батчинг
Перейти к содержимому

Что такое батчинг

  • автор:

Батчинг вызовов отрисовки (Draw Call Batching)

Для отрисовки объекта на экране движок отправляет команду (draw call) графическому API (например, OpenGL или Direct3D). Графический API производит значительную работу для каждого DC, что сильно влияет на производительность CPU.

Unity uses several techniques to address this:

  • Static Batching: combine static (i.e. not moving) objects into big meshes, and render them in a faster way.
  • Dynamic Batching: for small enough meshes, transform their vertices on the CPU, group many similar ones together, and draw in one go.

Built-in batching has several benefits compared to manually merging objects together (most notably, the objects can still be culled individually). But it also has some downsides too (static batching incurs memory and storage overhead; and dynamic batching incurs some CPU overhead).

Material Setup For Batching

Батчатся только объекты, имеющие один и тот же материал. Соответственно, для эффективного батчинга вам необходимо делать материалы общими для множества объектов, если это возможно.

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

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

While rendering shadow casters, they can often be batched together even if their materials are different. Shadow casters in Unity can use dynamic batching even with different materials, as long as the values in materials needed by the shadow pass are the same. For example, many crates could use materials with different textures on them, but for shadow caster rendering the textures are not relevant – in that case they can be batched together.

Динамический батчинг (Dynamic Batching)

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

  • Динамический батчинг связан с дополнительной нагрузкой для каждой вершины, так что он применим только к мешам, содержащим менее 900 вершин в сумме.
  • Если ваш шейдер использует Vertex Position, Normal и единственный UV, то вы можете батчить до 300 вершин; тогда как, если шейдер использует Vertex Position, Normal, UV0, UV1 и Tangent, то только 180 вершин.
  • Обратите внимание: ограничение на количество атрибутов в будущем может быть изменено
  • Objects will not be batched if they contain mirroring on the transform, for example object A with +1 scale and object B with –1 scale can not be batched together.
  • Использование разных экземпляров материалов — даже если они по сути своей являются одним материалом — сделает динамический батчинг невозможным.
  • Объекты с картами освещения имеют дополнительное свойство: индекс карты освещения и смещение/масштаб внутри карты освещения. Для батчинга объекты должны ссылаться на одно и то же место в карте освещения.
  • Multi-pass shaders will break batching.
  • Многопроходные шейдеры могут нарушить батчинг. Почти все шейдеры Unity поддерживают несколько источников света при forward rendering, и эффективно делать дополнительный проход для них. DC для “дополнительных пиксельных источников света” не будут батчиться.
    • Legacy Deferred (light pre-pass) rendering path has dynamic batching disabled, because it has to draw objects twice.

    Since it works by transforming all object vertices into world space on the CPU, it is only a win if that work is smaller than doing a “draw call”. How exactly expensive is a draw call depends on many factors, primarily on the graphics API used. For example, on consoles or modern APIs like Apple Metal the draw call overhead is generally much lower, and often dynamic batching can not be a win at all.

    Статический батчинг (Static Batching)

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

    При использовании статичного батчинга вы должны убедиться, что объекты статичны и не двигаются, не вращаются и не масштабируются во время выполнения. Если эти условия соблюдаются, можно пометить объекты как статичные, поставив галочку Static в Inspector:

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

    Internally, static batching works by transforming the static objects into world space and building a big vertex + index buffer for them. Then for visible objects in the same batch, a series of “cheap” draw calls are done, with almost no state changes in between. So technically it does not save “3D API draw calls”, but it saves on state changes done between them (which is the expensive part).

    Другие советы по батчингу

    На данный момент, только Mesh Renderers и Particle Systems могут батчиться. Это значит, что skinned meshes, ткань, trail renderers и прочие типы рендеринг-компонентов не батчатся.

    Полупрозрачные шейдеры часто требуют объектов, которые визуализируются в порядке “от заднего к переднему”, чтобы прозрачность работала корректно. Unity сначала визуализирует объекты в этом порядке и лишь затем пробует сбатчить их — так как соблюдение этого порядка очень важно, то эффективность батчинга для полупрозрачных объектов страдает по сравнению с непрозрачнымию

    Manually combining objects that are close to each other might be a very good alternative to draw call batching. For example, a static cupboard with lots of drawers often makes sense to just combine into a single mesh, either in a 3D modeling application or using Mesh.CombineMeshes.

    Что такое батчинг

    Что такое Batch. Часть 1

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

    Вообще, batch-процесс – это вид технологического процесса, который иногда противопоставляют непрерывному процессу (о коих речь шла раньше). Иногда batch-процессы называют рецептурными процессами (или просто рецептами); эту терминологию мы и будем в дальнейшем использовать. Слово “batch” еще можно перевести как “партия продукции”, и это тоже относится к затрагиваемой теме, так как в результате рецептурного процесса производится партия продукции. Ладно, хватит путаницы – теперь по делу.

    Раньше мы рассматривали технологические процессы, которые идут непрерывно в течение 24 часов в день, 7 дней в неделю, 365 дней в году. Хотя, на самом деле, раз в году делают плановый останов на несколько дней для выполнения ремонтных и других работ, но это происходит строго в соответствии с планом, и этому предшествуют значительные подготовительные работы. В другое же время остановка производства – это “чрезвычайное” происшествие. При этом отдельно взятая технологическая установка принимает участие в производстве одного вида продукции, а сам процесс идет по фиксированной технологической цепочке с неизменными настройками (уставками). Короче, все скучно, однообразно и весьма предсказуемо.

    А теперь представим гипотетический пищевой цех по производству сока. При этом цех может производить несколько видов сока: яблочный, вишневый и апельсиновый, т.е. 3 вида продукции. Пусть сок производится из концентрированного сока в специальной емкости с мешалкой, где он тщательно смешивается с водой, а потом пастеризуется и идет на розлив (пакетирование).

    Имеет ли смысл ставить для производства этих трех видов сока три производственные линии (по одной линии на каждый вид сока)? Было бы круто, но чрезвычайно дорого. Выход – использовать одну и ту же линию для выпуска разных видов продукции. При этом понятно, что и технологические параметры для производства различных соков будут заметно друг от друга отличаться. Например, вишневый концентрат нужно смешивать с водой гораздо дольше, чем яблочный, но пастеризовать его надо при меньшей температуре (я на самом деле этого не знаю — чисто предположение:)

    Набор технологических параметров для производства определенного вида продукции называется рецептом (recipe). В нашем примере для сока это может быть: соотношение вода/концентрат, длительность и температура смешивания; температура пастеризации + другие параметры. В общем случае, рецепт также может содержать последовательность технологических операций, которые для различных видов продукции могут быть, строго говоря, разными. Хотя на практике, как правило, рецепт не подразумевает различающиеся технологические операции, а содержит всего лишь массив технологических уставок для того или иного продукта.

    Рис. 1. Иллюстрация рецептурного управления на примере производства различных видов сока

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

    Теперь попробуем дать характеристику batch-процессу:

    1. На выходе несколько видов продукции.
    2. При производстве разных видов продукции задействуется одно и то же технологическое оборудование.
    3. Имеется множество рецептов.
    4. Производство по “партиям”, которое может быть относительно легко и без последствий остановлено после завершения партии, а потом возобновлено.

    Автоматизированное управление batch-процессом называется рецептурным управлением (batch control, или recipe control). Этот вид управления несколько специфичен, и требует от системы управления некоторой смекалки. Конечно, можно использовать для задач рецептурного управления обычные программные блоки, подходящие для управления непрерывным процессом, НО на практике это приводит к огромным трудностям (=головной боли) при попытке все это реализовать, используя стандартные подходы программирования. Поэтому многие производители АСУ ТП разработали специализированные batch-модули, которые адаптированы именно под рецептурные процессы. Эти модули могут выполняться на уровне ПЛК или на выделенном сервере batch. Иногда эти сервера, к тому же, резервируются. Также batch-модули дополняются специализированной средой разработки batch-программ, что сильно облегчает жизнь инженера.

    На рисунке ниже в качестве примера приведена конфигурация верхнего уровня АСУ ТП SIMATIC PCS 7, оснащенной выделенным сервером batch.

    Рис. 2. Структурная схема АСУ ТП с выделенным сервером batch

    Перечислим основные обязанности системы batch-управления:

    1. Ну, собственно, самая главная задача – хранение/загрузка рецептов и их выполнение в режиме реального времени (batch process management).
    2. Отслеживание, не занята ли технологическая установка выполнением другого рецепта. Если занята, то выделяется другая аналогичная установка для выполнения данного рецепта (process unit allocation).
    3. Формирование отчетов об изготовление партии продукции в задаваемой пользователем форме. Причем, требуются отчеты с возможностью отслеживания истории (ретроспективы) “прогона” партии по технологической цепочке (reporting and batch tracking).
    4. Расчет различных показателей эффективности производства, как, например: удельного времени простоя (в %), производительности (в л/c) технологической установки или полного времени изготовления партии продукции (в мин).
    5. Планирование изготовления партий, что фактически подразумевает составление производственного расписания. Ну, это на самом деле ни одна система в полном объеме пока не реализует (batch planning).

    И еще несколько слов.

    Как правило, пакет batch состоит из двух частей – операторской (клиентской) и исполняемой. Клиентская часть устанавливается на АРМы и всего лишь обеспечивает удобный операторский интерфейс. Клиентская часть, как правило, органично вписывается в общую операторскую среду, и работа с ней идет непосредственно из мнемосхем.

    Исполняемая часть – это костяк системы. Именно она ответственна за автоматизированное выполнение задач рецептурного управления, описанных выше. Исполняемая часть прогружается в специальные серверы batch или в обычные ПЛК в зависимости от архитектуры АСУ ТП.

    И еще. Существует международный стандарт ISA-88, специфицирующий batch-процессы, определяющий модель и философию рецептурного управления, а также стандартизирующий соответствующую терминологию. Документ тяжеловесный, и посему прочитан полностью мной не был. Тем не менее, в следующей части я попытаюсь более детально описать рецептурные системы с привязкой именно к стандарту ISA-88.

    И напоследок. Многие поставщики АСУ ТП предлагают пакет batch (здесь я имею в виду его программную часть) за баснословные деньги, что, конечно же, является абсолютным безобразием. По моему разумению, современная АСУ ТП должна включать такой пакет по “дефолту”, так как функционал batch в той или иной мере требуется даже на самых с первого взгляда “нерецептурных” производствах.

    Создан 11.10.2008. Автор: Казанцев Андрей

    Что такое Батчинг\Batching и как оно работает

    Обястите на пальцах что такое Батчинг\Batching и как оно работает.

    еще лучше дайте почитать (на русском) а то гугл тока одни ссылки на английском дает

    94731 / 64177 / 26122
    Регистрация: 12.04.2006
    Сообщений: 116,782
    Ответы с готовыми решениями:

    Что такое » и как оно работает
    Код arr = for line in sys.stdin: arr.extend(line.split()) for x in arr: .

    Что такое наследование классов и как оно реализуется
    помогите пожалуйста ответить на вопросы 1. Что такое метод. Разновидности методов: метод.

    что такое super.onCreate(savedInstanceState);? что оно делает?
    подскажите, начинающему программисту под android, что делает строка.

    Что такое умножение в процессорах что оно дает?
    Я много чего не понимаю в процессорах и хотелось бы задать несколько вопросов. Что такое умножение.

    Регистрация: 09.08.2012
    Сообщений: 132

    Если гуру программирования (а то все, как-то подпадающее под «Microsoft рекомендует» читать довольно сложновато для начнающих), можешь попытаться посмотреть вот здесь:
    https://directxtk.codeplex.com/
    Смотри там SpriteBatch

    Также мне когда-то говорили что довольно просто батчинг сделан в HGE.

    Что это вообще такое? Тут я буду своими словами, как когда-то понял из того что объясняли мне. Может чуток промахнусь

    Вообщем проблема в компьютерной графике в дороговизне вызовов команд видеокарты. Поэтому умные люди рекомендуют эти вызовы уменьшить, а в идеале вообще не дергать. Так родились такие оптимизации:
    — текстурный атлас (запаковываем кучу текстур в одну которую и отправляем один раз видеокарте)
    — кеширование стейтов (запоминаем и сортируем всякие блендинги, стенсилы, растеризации и прочие установки, что как можно меньше дергать видеокарту)
    — инстансинг (рисуем одну геометрию много раз, одной командой)
    — батчинг (запаковываем группы команд в один пакет)

    Батчинг — это по сути «пакет». То есть в самом простом случае, в случае спрайтов. Создаем массив под максимальное количество вершин под все спрайты. Допустим ты выводишь 100 спрайтов на экран. Каждый спрайт состоит из 4 вершин. Значит выделяешь массив на 400 вершин (100х4). Затем все текстуры загоняешь в атлас (делается это не в коде, а художником, ты наверняка такое видел — одно большое изображение на котором понапихана куча маленьких). Затем создаешь некий Render State, в котором ставишь значения блендинга, z-буфера, растеризатора единные для всех 100 спрайтов. Все это загоняешь в один класс. И затем просто рисуешь ровно одной командой Draw Primitive. То есть идеальный батчинг, это когда все содержимое рисуется ровно за один DIP (Draw Call).
    Хотя конечно это не возможно, но к этому надо стремится
    Вместо выделения 400 вершин можешь попробовать инстансинг на 4 вершины, но это для гуру и не сильно будет отличаться.

    Регистрация: 09.11.2013
    Сообщений: 72

    ЦитатаСообщение от warchief Посмотреть сообщение

    Каждый спрайт состоит из 4 вершин. Значит выделяешь массив на 400 вершин (100х4). Затем все текстуры загоняешь в атлас. Затем создаешь некий Render State, в котором ставишь значения блендинга, z-буфера, растеризатора единные для всех 100 спрайтов. Все это загоняешь в один класс. И затем просто рисуешь ровно одной командой Draw Primitive. То есть идеальный батчинг, это когда все содержимое рисуется ровно за один DIP (Draw Call).

    Большое спасибо за ответ. Но я по прежнему не совсем понял.
    Вот например у меня 2D игра выглядит как стратегия вид с верху. Рисую квадраты сверху вниз (в строгой очередности чтобы спрайты правильно перекрывали друг друга)
    Я использую sprite.Draw() каждый раз когда отрисовываю на клетке спрайт, Тоесть этои есть 1 DIP?? допустим мне нада на клетке рарисовать землю, кустарник и дерево, каждый из которых является отдельным спрайтом. Тоесть это 3 ДИПА. Получается максимум что я могу в своей 2Д игре это запомнить эту композицию и потом отрисовывать ее за раз используя сохоаненую заготовку.

    Сразу извеняюсь я с Директом на ВЫ и это моя первая игра. Про массив на 400 вершин несовсем понял. Как его можно отрисовать за 1 раз.

    Добавлено через 6 минут
    Если такое возможно в 2D то как это называется и где про ЭТО читать.

    Добавлено через 6 минут
    а еще что вы скажете по поводу Динамически собираемого атласа для отрисовки сцены. предпологается что обекты на сцене будут менятся только при ходьбе. Тоесть в худшем случае (при беге) атлас нужно будет переделать раза 3 в секенду. Дат ли это прирост FPS ( с учетом что при необходимости в атласе будут перекрашиваться только отдельные фрагменты)?

    Static batching в Unity 3D

    Static batching — специальная фича Unity, которая способна сэкономить много циклов CPU. Всегда, когда объект рендерится, происходит Draw Call — речь идет о команде для CPU/GPU о том, что объект должен отрендериться. Движок Unity запускает несколько вызовов отрисовки, накладывая их друг на друга, что и формирует сцену. При этом каждый Draw Call потребует ресурсов CPU, следовательно, возникает закономерное желание минимизировать потребление этих ресурсов. В результате и надо использовать Batching. Он необходим, чтобы не делать лишние Draw Calls.

    maxresdefault_1-1801-e463fa.jpg

    Batching может быть 2-х видов: динамический и статический. Статический обеспечивает лучшую производительность, поэтому рекомендуется использовать его.

    Идем дальше. Для того чтобы эффективно использовать Static Batching, применяйте как можно меньше разных материалов. Чтобы это реализовать на практике, скомбинируйте, к примеру, все материалы в одну большую текстуру.

    unity_development_tools_playstation_developers_995x498_1-1801-480823.jpg

    Последним шагом будет добавление Lightmap к сцене. Так как мы почти не применяем память для текстуры объектов, мы можем сделать подробную Lightmap, в результате чего проблем с памятью не возникнет.

    Чтобы использовать Static Batching, поставьте в свойствах объекта флажок Static. Однако помните, что его можно применять лишь для объектов, которые не вращаются, не перемещаются и не масштабируются в сцене.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *