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

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

  • автор:

Батчинг вызовов отрисовки (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.

    Что такое Bitcoin (BTC) батчинг?

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

    Таким образом, объединение нескольких транзакций в одну создает более низкие комиссии в сети. В то время как плата за транзакцию никогда не превышала 31 цента в среднем за неделю с января 2014 года по январь 2017 года, из-за явного спроса на сеть батчинг стал популярной концепцией, когда эти комиссии достигли почти $50 к концу 2017 года.

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

    Биткоин использует модель “выхода неизрасходованных транзакций” (Unspent Transaction Output – UTXO). По словам Hasufly в блоге Medium “в Биткоине у пользователя нет балансов, только UTXO, которые они контролируют. Если пользователь хочет перевести деньги кому-то другому, его кошелек выбирает один или несколько UTXO в качестве входа (input), которые должны составить желаемую сумму перевода. Желаемая сумма затем идет к получателю и называется выход (output), а разница возвращается к отправителю и называется изменённым выходом (change output).”

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

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

    Для аналогии, можно представить батчинг в виде почтового грузовика, полного коробок. Грузовик, представляющий собой транзакцию, содержит коробки (outputs). В каждой коробке содержится определённое количество писем (сатоши). Анализ количества транзакций для оценки эффективности Биткоина на рынке похож на подсчет почтовых грузовиков для определения количества отправленных писем, даже если количество писем может значительно измениться.

    Укрощение батчинга за счет оптимизации масок UI

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

    В какой-то момент мы в War Robots столкнулись с необходимостью оптимизировать экран акций: обнаружилось, что для отрисовки этого экрана Unity совершала более 300 батчей. Для сравнения: куда более сложный экран ангара, содержащий 3D-сцену, 3D- и 2D-интерфейсы, эффекты и анимации, рисовался примерно за 100 батчей.

    В этой статье я расскажу о том, как нам удалось починить динамический батчинг, упростить иерархию и поднять FPS в интерфейсе.

    Прежде всего, давайте разберемся, что же такое батч.

    Батч (batch) — это одна команда от ЦП, содержащая в себе данные и инструкцию, по которой GPU создает изображение на экране. Один кадр состоит из множества таких батчей — примерно как слои в любом графическом редакторе. Нельзя сказать, что в общем случае уменьшение количества батчей означает больше FPS, но нередко можно получить выигрыш производительности именно за счет такой оптимизации.

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

    Как было раньше

    Для показа товара по акции создается префаб такого вида:

    Как видно, довольно простой префаб сам по себе требует довольно много батчей для своей отрисовки — 26 (в статистике еще учтен один батч от камеры, которая обновляет фон). Но куда хуже картина становится при создании второго такого же префаба:

    Количество батчей удвоилось — а значит, у нас полностью сломан батчинг между одинаковыми сущностями! Так происходит из-за того, что мы используем стандартный компонент Unity — Mask. Здесь он нужен для диагональных полос на фоне:

    А вот как это выглядит в иерархии:

    Здесь выделены те объекты, к которым применяются маски:

    • new-back — ограничивает отрисовку изображения границами префаба,
    • angle-glow — за счет поворота трансформа создают косые ленты.

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

    Однако в этом же месте и возникает проблемность использования компонента маски: она полностью ломает батчинг. Более того, сам компонент добавляет два батча: до и после отрисовки спрайта, на который воздействует маска, со специальными настройками шейдера. Именно из-за такого поведения оказывается невозможно сбатчить спрайты внутри одного префаба и между соседними префабами.

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

    Что мы сделали

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

    Мы объединили вместе два объекта — границу маски и изображение. Идея в том, сразу рисовать изображение уже с примененной на него маской. Для этого нужно создать новый материал и написать для него шейдер, в котором и будет считаться форма маски:

    CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" #pragma multi_compile __ UNITY_UI_ALPHACLIP struct appdata_t < float4 vertex : POSITION; float4 color : COLOR; float2 texcoord : TEXCOORD0; >; struct v2f < float4 vertex : SV_POSITION; fixed4 color : COLOR; float2 uv : TEXCOORD0; >; fixed4 _Color; fixed4 _TextureSampleAdd; v2f vert(appdata_t IN) < v2f OUT; OUT.vertex = UnityObjectToClipPos(IN.vertex); OUT.color = IN.color * _Color; OUT.uv = IN.texcoord; return OUT; >sampler2D _MainTex; fixed4 _MainTex_ST; sampler2D _AlphaTex; fixed4 _AlphaTex_ST; fixed4 frag(v2f IN) : SV_Target < float4 color = (tex2D(_MainTex, IN.uv * _MainTex_ST.xy + _MainTex_ST.zw) + _TextureSampleAdd) * IN.color; const float mask_alpha = (tex2D(_AlphaTex, IN.uv * _AlphaTex_ST.xy + _AlphaTex_ST.zw) + _TextureSampleAdd).a; color.a *= mask_alpha; return color; >ENDCG 

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

    Поэтому мы начали искать решение дальше и нашли возможность задавать форму маски новым способом. Чтобы его описать, надо вспомнить, как Unity рисует изображение.

    Итак, Image — это компонент, который берет данные из RectTransform с того GameObject, на котором он находится. У RectTransform заданы четыре вершины-координаты, а также четыре стандартные UV-координаты — по одной на каждую вершину: [(0, 0), (1, 0), (0, 1), (1, 1)]. В коде мы можем менять координаты, а также использовать и другие наборы UV-координат: для обычных мешей доступны восемь наборов UV-координат, но Unity UI поддерживает лишь до четырех наборов. Тогда почему бы нам не использовать другие координаты для определения формы маски? Сказано — сделано.

    В первую очередь надо убедиться, что в нашем Canvas включен дополнительный UV-канал:

    Теперь, нужно расширить функционал Image так, чтобы он умел читать данные из этого канала и передавать его в меш, откуда будет читать уже шейдер:

    public class ImageWithCustomUV2 : Image < [SerializeField] private Vector2[] _uvs2; protected override void Start() < base.Start(); if (!canvas.additionalShaderChannels.HasFlag(AdditionalCanvasShaderChannels.TexCoord1)) < canvas.additionalShaderChannels |= AdditionalCanvasShaderChannels.TexCoord1; >> protected override void OnPopulateMesh(VertexHelper vh) < base.OnPopulateMesh(vh); if (_uvs2?.Length != 4) < return; >var vertex = new UIVertex(); for (var i = 0; i < 4; ++i) < vh.PopulateUIVertex(ref vertex, i); vertex.uv1 = _uvs2[i]; vh.SetUIVertex(vertex, i); >>

    Для упрощения настройки координат мы написали кастомный инспектор:

    [CustomEditor(typeof(ImageWithCustomUV2))] public class ImageWithCustomUV2Inspector : ImageEditor < private readonly string[] _options = ; private readonly GUIContent _blLabel = new GUIContent("Bottom left"); private readonly GUIContent _brLabel = new GUIContent("Bottom right"); private readonly GUIContent _tlLabel = new GUIContent("Top left"); private readonly GUIContent _trLabel = new GUIContent("Top right"); private bool _foldout = true; private int _selectedOption = -1; public override void OnInspectorGUI() < base.OnInspectorGUI(); var prop = serializedObject.FindProperty("_uvs2"); if (prop.arraySize != 4) < ResetUVs(prop); >_foldout = EditorDrawUtilities.DrawFoldout(_foldout, "UV2"); if (_foldout) < EditorGUI.indentLevel++; DrawUVs(prop); EditorGUI.indentLevel--; >serializedObject.ApplyModifiedProperties(); > private void DrawUVs(SerializedProperty prop) < if (_selectedOption < 0) < CheckSelectedOption(prop); >_selectedOption = GUILayout.Toolbar(_selectedOption, _options); switch (_selectedOption) < case 1: // rect DrawRectOption(prop); break; default: // custom DrawCustomOption(prop); break; >> private void CheckSelectedOption(SerializedProperty prop) < var bl = prop.GetArrayElementAtIndex(0).vector2Value; var br = prop.GetArrayElementAtIndex(3).vector2Value; var tl = prop.GetArrayElementAtIndex(1).vector2Value; var tr = prop.GetArrayElementAtIndex(2).vector2Value; if (bl.x == tl.x && bl.y == br.y && tr.x == br.x && tr.y == tl.y) < _selectedOption = 1; >else < _selectedOption = 0; >> private void DrawCustomOption(SerializedProperty prop) < var w = EditorGUIUtility.labelWidth; EditorGUIUtility.labelWidth = 100; EditorGUILayout.BeginHorizontal(); DrawVector2Element(prop, 1, _tlLabel); DrawVector2Element(prop, 2, _trLabel); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); DrawVector2Element(prop, 0, _blLabel); DrawVector2Element(prop, 3, _brLabel); EditorGUILayout.EndHorizontal(); EditorGUIUtility.labelWidth = w; >private void DrawRectOption(SerializedProperty prop) < var w = EditorGUIUtility.labelWidth; EditorGUIUtility.labelWidth = 100; var bl = prop.GetArrayElementAtIndex(0).vector2Value; var tr = prop.GetArrayElementAtIndex(2).vector2Value; var min = bl; var max = tr; EditorGUILayout.BeginHorizontal(); min = EditorGUILayout.Vector2Field("min", min); max = EditorGUILayout.Vector2Field("max", max); EditorGUILayout.EndHorizontal(); if (min != bl || max != tr) < prop.ClearArray(); AddVector2(prop, min); AddVector2(prop, new Vector2(min.x, max.y)); AddVector2(prop, max); AddVector2(prop, new Vector2(max.x, min.y)); >EditorGUIUtility.labelWidth = w; > private void DrawVector2Element(SerializedProperty array, int index, GUIContent label) < var prop = array.GetArrayElementAtIndex(index); EditorGUILayout.PropertyField(prop, label); >private void ResetUVs(SerializedProperty prop) < prop.ClearArray(); AddVector2(prop, Vector2.zero); AddVector2(prop, Vector2.up); AddVector2(prop, Vector2.one); AddVector2(prop, Vector2.right); >private void AddVector2(SerializedProperty array, Vector2 value) < var array.InsertArrayElementAtIndex(id); var prop = array.GetArrayElementAtIndex(id); prop.vector2Value = value; >>

    Сам код шейдера: в нем изменился только расчет UV для текстуры, по которой берется маска:

    CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" #pragma multi_compile __ UNITY_UI_ALPHACLIP struct appdata_t < float4 vertex : POSITION; float4 color : COLOR; float2 texcoord : TEXCOORD0; float2 texcoord1 : TEXCOORD1; >; struct v2f < float4 vertex : SV_POSITION; fixed4 color : COLOR; float2 uv : TEXCOORD0; float2 uv1 : TEXCOORD1; >; fixed4 _Color; fixed4 _TextureSampleAdd; v2f vert(appdata_t IN) < v2f OUT; OUT.vertex = UnityObjectToClipPos(IN.vertex); OUT.color = IN.color * _Color; OUT.uv = IN.texcoord; OUT.uv1 = IN.texcoord1; return OUT; >sampler2D _MainTex; fixed4 _MainTex_ST; sampler2D _AlphaTex; fixed4 _AlphaTex_ST; fixed4 frag(v2f IN) : SV_Target < float4 color = (tex2D(_MainTex, IN.uv * _MainTex_ST.xy + _MainTex_ST.zw) + _TextureSampleAdd) * IN.color; const float mask_alpha = (tex2D(_AlphaTex, IN.uv1 * _AlphaTex_ST.xy + _AlphaTex_ST.zw) + _TextureSampleAdd).a; color.a *= mask_alpha; return color; >ENDCG

    В качестве маски теперь можно использовать довольно простую текстуру:

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

    Теперь, после настройки форм масок получается сохранить визуал, упростив иерархию, не ломая батчинг и используя минимальные дополнительные данные: текстуру для маски в формате Alpha8 размером 256×256 занимает в памяти всего 64 КБ.

    И самое главное — сохранился батчинг между разными префабами:

    Итоги

    После всех произведенных действий нам удалось упростить иерархию объектов в Unity и в несколько раз сократить количество батчей: с 300+ до ~70. Значение FPS в экране увеличилось примерно на 5-10%. Платой за это стала чуть более сложная настройка компонентов.

    В итоге нам удалось реализовать задуманное: производительность экрана увеличилась, при этом верстка не изменилась, а иерархия объектов упростилась и стала понятнее. Удалось создать универсальный инструмент, который можно использовать в других экранах и элементах интерфейса.

    Дополнительные ресурсы оказались минимальными и, опять же, универсальными. Из неприятного — настройка конкретной маски стала немного сложнее, но когда понимаешь, как работает механизм, она уже не составляет труда.

    • динамический батчинг
    • оптимизация интерфейсов
    • разработка игр
    • unity
    • Блог компании Pixonic
    • Разработка игр
    • Интерфейсы
    • Unity

    Что такое батчинг биткоина и как он позволяет экономить?

    Технология распределенного реестра DLT за рамками блокчейна

    Рекордный уровень транзакций, обработанных в сети биткоина за один день, составил 490 тысяч переводов. При этом стоимость в долларах оценивается миллиардами.

    Что такое батчинг биткоина и как он позволяет экономить?

    Средняя комиссия сети в первый пик, который состоялся в мае 2017 года, вырос до доллара. И их стоимость продолжает подниматься: к началу июня средние сборы пробили уровень в 5,5 долларов. Это уже было шоком, потому что за три года до этого комиссия не поднималась выше 31 цента. В этот момент появилось решение, которое смогло сократить количество транзакций.

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

    Таким образом, появляется батчинг.

    Батчинг — это объединение многих выходов в одну транзакцию.

    Дэвид А. Хардинг, автор биткоин-документации, опубликовал сообщение в блоге: экономии средств на батчинге достигает 80%.

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

    По сути, пакетная обработка, батчинг — это один из способов собрать как можно больше транзакций в ограниченное пространство блоков, доступное на блокчейне биткоина.

    Когда начала расти популярность криптовалют в середине 2017 года, пользователи начали более тщательно изучать, насколько эффективно они используют пространство блоков. В целом, 2 Мб места использовалось неэффективно. Началась неформальная кампания: объединять переводы и экономить пространство. Некоторые биржи проводили такую политику в течение многих лет, другие внедрили ее. Вопрос был исчерпан из-за того, что цена BTC упала в первом квартале 2018 года, а транзакционная нагрузка и, следовательно, средняя комиссия, снизилась.

    Сейчас пакетные платежи все еще используются, несмотря на низкое количество транзакций.

    Где искать статистику

    Есть некоторые сайты, например, transactionfee.info и outputs.today.

    Что такое батчинг биткоина и как он позволяет экономить?

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

    Матчасть

    Биткоин использует модель UTXO, которая означает Unspent Transaction Output — выходы неизрасходованных транзакции. Для сравнения, Ripple и Ethereum используют модель «счет/баланс». В сети BTC пользователь не имеет баланса, а только UTXO, которыми управляет.

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

    Чтобы лучше понять, представьте бумажник с разными купюрами. Вам выставили счет за кофе в 250 рублей, вы подаете 300 и ожидаете сдачу. Ситуация в бумажнике меняется? Вы не отрезаете от сотни половину, а получаете возврат переплаты.

    Также нужно помнить, что нет жесткого ограничения на количество транзакций, которые могут вписываться в блок. Есть ограничение на размер в мегабайтах (пока 2 Мб). Большие транзакции (в размере, а не сумме перевода) будут платить более высокие комиссии, чтобы попасть в блок. Кроме того, каждая транзакция может иметь практически неограниченное количество входов или выходов.

    Каждая транзакция имеет хотя бы один вход и выход, но по факту больше. Большая часть этого пространства занята вводом (часто 60% и более из-за подписи, которая доказывает, что BTC принадлежат отправителю), в то время как выходные данные составляют 15-30%. Чтобы сохранить вес транзакции есть два основных варианта:

    • использовать меньше входов. Чтобы минимизировать затраты, вы можете периодически переотправлять весь свой баланс себе, если он состоит из множества мелких частей. Когда сборы очень низкие, получится дешево, а затем транзакция будет меньше весить. Это называется консолидация UTXO.
    • Пользователи, которые часто делают переводы (особенно в одном блоке), могут включать почти неограниченное количество выходов для разных людей в одной транзакции.

    Это преимущество BTC как платежной системы. Транзакция может объединить тысячи отдельных переводов.

    Пакетная транзакция в самом общем варианте определяется как «транзакция с тремя и более выходами». Как правило, батчинг осуществляется в основном пулами или биржами, которым важная такая эффективность. Редко, чтобы обычный пользователь занимался созданием пакетных транзакций, тем более, в кошельках часто нет такого интерфейса, а в повседневной жизни это нужно редко.

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

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

    Как Segwit, так и пакетные операции созданы для сжатия транзакций, чтобы поместить их в доступное пространство блока. Их используют Binance, Bitfinex и Shapeshift.

    Есть заблуждение, что количество транзакций упало из-за батчинга, но это не так. Он пока занимает не такую большую долю, хотя есть восходящий тренд. Но при этом в них передается до 70% всех BTC.

    Что такое батчинг биткоина и как он позволяет экономить?

    Количество платежей упало примерно настолько же, насколько и количество транзакций.

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

    Как совершать батчинг-транзакции

    В полной ноде Bitcoin Core или других узлах с аналогичным API вместо sendtoaddress, например:

    sendtoaddress 1FjdYJTkdmA2KYvGqRX3G3WJeTFABgUJsJ 1.23
    sendtoaddress 194hTHKyJchh6dV8a5Ce5Jd1ENEaxMyKUK 4.56

    Что такое батчинг биткоина и как он позволяет экономить?

    Собственно, в обычной жизни это можно использовать так: просто «накопить момент», когда нужно сделать сразу несколько переводов. Отложить несколько покупок, броню билетов и т.д. на один день.Это делается через кнопку Add Recipient.

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

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