https://news.1rj.ru/str/madcsharp
@alexmtq создал канал про оптимизации и unsafe приколдэсы на шарпе и в дотнете.
Сейчас пилю либу для унификации ансефа по всем рантаймам. Будет работать как в Mono/IL2CPP, так и в настоящем дотнете, т.е когда юнитеки завезут .NET Core всё продолжит работать.
Основные фичи:
1. вызов методов без .Invoke (т.е без аллокаций), вызов нативных методов без обёртки через нэйтив.
2, Изменение длины и типа массивов — это полезно для бинарной сериализации, рентерпретации данных без дополнительных аллокаций итд
3. Изменение типа размера листов + thread-safe способ для добавления элементов, в том числе через Burst, без дополнительной аллокации NativeList<T>
4. Изменение стрингов без переаллокации
И много всякого другого.
@alexmtq создал канал про оптимизации и unsafe приколдэсы на шарпе и в дотнете.
Сейчас пилю либу для унификации ансефа по всем рантаймам. Будет работать как в Mono/IL2CPP, так и в настоящем дотнете, т.е когда юнитеки завезут .NET Core всё продолжит работать.
Основные фичи:
1. вызов методов без .Invoke (т.е без аллокаций), вызов нативных методов без обёртки через нэйтив.
2, Изменение длины и типа массивов — это полезно для бинарной сериализации, рентерпретации данных без дополнительных аллокаций итд
3. Изменение типа размера листов + thread-safe способ для добавления элементов, в том числе через Burst, без дополнительной аллокации NativeList<T>
4. Изменение стрингов без переаллокации
И много всякого другого.
Telegram
MadSharp: Unsafe
The channel is all about unobvious C#/Unity hacks and optimizations.
Blog: meetemq.com
Blog: meetemq.com
👍20🙈4
В Unity есть возможность Indirect рендеринга: Graphics.RenderMeshIndirect
Начну чуть издалека.
Что есть дроуколл?
Это запуск GPU пайплайна по неким параметрам.
Вот вспомните ту самую картинку, которую вы видели:
-переключатели на гпу для НЕпрограммируемых stages
-программы для программируемых
-забиндить буферы и прочие ресурсы
Основные буферы - это вертексный (позиции) и индексный (индексы вертексов).
Индексный буфер опционален, но важен для оптимизации, т.к. многие вертексы повторяются в разных треугольниках и для них нам не надо уже перевычислять позицию и вертексы можно упорядочить не по порядку как они в треугольнике располагаются, а оптимальным для производительности способом.
Что есть инстансинг?
это когда мы не делаем новые дроуколлы, а просто перезапускаем пайплайн X раз в рамках одного дк.
Для каждого перезапуска пайплайна мы просто меняем SV_InstanceID (видеокарта сама его меняет) - SV_InstanceID от 0 до X.
Мы не перебиндиваем ничего и не ждём команд от цпу - поэтому инстансинг очень быстрый.
Что есть индирект?
это когда количество запусков пайплайна, количество вертексов и индексы для них задаются не напрямую - с цпу, а так же рассчитываются на гпу - в компьют шейдере.
Но в рамках одного вызова, даже вызова индирект - мы не можем забиндить разные индексные оффсеты.
(p.s. схожим образом, кстати, работают Task и Mesh шейдера)
Что есть MDI?
Это когда гпу может сама решить сколько вызовов indirect ей нужно.
И не только запустить несколько вызовов пайплайна, но и индексные оффсеты сопоставить на разных вызовах самостоятельно.
Для этого гпу помимо номера инстанса - SV_InstanceID знает и номер текущей отрисовки.
MDI не на всех апи поддерживается, на некоторых реализации отличаются, на других делается фоллбэк, а на третьих вообще его нет.
Метод Graphics.RenderMeshIndirect позволяет рисовать MDI там где это поддерживается и делает серию обычных Indirect вызовов там, где MDI не поддерживается.
Однако, как показали тесты, семантика
Автор: @shiko_q
Источник: https://news.1rj.ru/str/unity_cg/48214
#rendering #graphics
Начну чуть издалека.
Что есть дроуколл?
Это запуск GPU пайплайна по неким параметрам.
Вот вспомните ту самую картинку, которую вы видели:
вертексный шейдер -> геометрический -> .... -> фрагментный
Для дроуколла надо выставить эти параметры: -переключатели на гпу для НЕпрограммируемых stages
-программы для программируемых
-забиндить буферы и прочие ресурсы
Основные буферы - это вертексный (позиции) и индексный (индексы вертексов).
Индексный буфер опционален, но важен для оптимизации, т.к. многие вертексы повторяются в разных треугольниках и для них нам не надо уже перевычислять позицию и вертексы можно упорядочить не по порядку как они в треугольнике располагаются, а оптимальным для производительности способом.
Что есть инстансинг?
это когда мы не делаем новые дроуколлы, а просто перезапускаем пайплайн X раз в рамках одного дк.
Для каждого перезапуска пайплайна мы просто меняем SV_InstanceID (видеокарта сама его меняет) - SV_InstanceID от 0 до X.
Мы не перебиндиваем ничего и не ждём команд от цпу - поэтому инстансинг очень быстрый.
Что есть индирект?
это когда количество запусков пайплайна, количество вертексов и индексы для них задаются не напрямую - с цпу, а так же рассчитываются на гпу - в компьют шейдере.
Но в рамках одного вызова, даже вызова индирект - мы не можем забиндить разные индексные оффсеты.
(p.s. схожим образом, кстати, работают Task и Mesh шейдера)
Что есть MDI?
Это когда гпу может сама решить сколько вызовов indirect ей нужно.
И не только запустить несколько вызовов пайплайна, но и индексные оффсеты сопоставить на разных вызовах самостоятельно.
Для этого гпу помимо номера инстанса - SV_InstanceID знает и номер текущей отрисовки.
MDI не на всех апи поддерживается, на некоторых реализации отличаются, на других делается фоллбэк, а на третьих вообще его нет.
Метод Graphics.RenderMeshIndirect позволяет рисовать MDI там где это поддерживается и делает серию обычных Indirect вызовов там, где MDI не поддерживается.
Однако, как показали тесты, семантика
SV_DrawID поддерживается не везде =(Автор: @shiko_q
Источник: https://news.1rj.ru/str/unity_cg/48214
#rendering #graphics
🔥28🗿4❤1👍1🤩1
Давно у нас не было никаких событий, надо исправляться 🙂
В эту субботу (c 16:00 по мск) пройдет событие на тему ME.BECS, я расскажу как она устроена, отвечу на ваши вопросы.
Регайтесь по ссылке:
https://unsafecsharp.timepad.ru/event/2583150/
#event #ecs
В эту субботу (c 16:00 по мск) пройдет событие на тему ME.BECS, я расскажу как она устроена, отвечу на ваши вопросы.
Регайтесь по ссылке:
https://unsafecsharp.timepad.ru/event/2583150/
#event #ecs
🔥23👍2
Параметры метода (params)
Есть такая штука, которая позволяет вызывать метод, когда мы не знаем сколько параметров хотим туда передать:
Но есть некоторые особенности, которые нужно понимать:
1. По-умолчанию такой вызов создает новый массив (т.е. триггерит GC, что плохо):
2. Если мы передадим точный тип массива, то это не будет создавать новый массив:
3. Любой вызов будет создавать новый массив:
Вывод: избегайте методов с params, особенно если это хот часть.
#gc #performance #params #basics
Есть такая штука, которая позволяет вызывать метод, когда мы не знаем сколько параметров хотим туда передать:
void Method(params object[] arr)
Но есть некоторые особенности, которые нужно понимать:
1. По-умолчанию такой вызов создает новый массив (т.е. триггерит GC, что плохо):
void Method1(params object[] arr)
void Method2(object[] arr)
var arr = new int[10];
Method1(arr); // будет создан массив object[1] и к первому элементу присвоен массив arr
Method2(arr); // будет ошибка компиляции, т.к. object[] не соотвествует типу int[]
2. Если мы передадим точный тип массива, то это не будет создавать новый массив:
void Method1(params int[] arr)
void Method2(int[] arr)
var arr = new int[10];
Method1(arr);
Method2(arr);
// Эти 2 вызова идентичны
3. Любой вызов будет создавать новый массив:
void Method(params int[] arr)
Method(1, 2, 3)
Method(1)
Вывод: избегайте методов с params, особенно если это хот часть.
#gc #performance #params #basics
👍17🤡4🔥1
Напоминаю, что сегодня будем разбирать ME.BECS. Кто еще не зарегался - велкам:
https://news.1rj.ru/str/unsafecsharp/187
#event
https://news.1rj.ru/str/unsafecsharp/187
#event
Telegram
Unity: Всё, что вы не знали о разработке
Давно у нас не было никаких событий, надо исправляться 🙂
В эту субботу (c 16:00 по мск) пройдет событие на тему ME.BECS, я расскажу как она устроена, отвечу на ваши вопросы.
Регайтесь по ссылке:
https://unsafecsharp.timepad.ru/event/2583150/
#event #ecs
В эту субботу (c 16:00 по мск) пройдет событие на тему ME.BECS, я расскажу как она устроена, отвечу на ваши вопросы.
Регайтесь по ссылке:
https://unsafecsharp.timepad.ru/event/2583150/
#event #ecs
🔥12😐1🍓1
В эту субботу пройдет евент на тему ME.BECS, я расскажу как ее использовать и отвечу на ваши вопросы. Формат немного поменяем и я сначала расскажу об API и отвечу на интересующие вопросы, а затем мы сможем посмотреть на ваш проект и решить конкретные вопросы.
ME.BECS скачать можно тут:
https://github.com/chromealex/ME.BECS
Регистрация на событие тут:
https://unsafecsharp.timepad.ru/event/2594690/
#event #ecs
ME.BECS скачать можно тут:
https://github.com/chromealex/ME.BECS
Регистрация на событие тут:
https://unsafecsharp.timepad.ru/event/2594690/
#event #ecs
🔥12👍3❤1
Есть на SkinMeshRenderer галка "Update when offscreen".
Что делает скинмеш? Он на цпу (на других потоках) или на гпу (компьют скиннинг) запускает апдейт позиций вертексов на меше.
Что значит оффскрин? Это относится к SkinMeshRenderer'ам чьи баунды не попали во фрустум камеры.
Мы не можем запустить рендер до скиннинга.
Мы не можем запустить скиннинг ДО куллинга.
А куллинг мы не можем запустить ДО окончания просчета игровой логики (вдруг у вас в LateUpdate камера куда-то перемещается).
В итоге:
Если вы галочку оставите - у вас могут просчитываться скинмеши, которые не видно сейчас. И из-за этого может дольше рендериться кадр.
Если вы галочку уберете - у вас может дольше рендериться кадр из-за того, что скиннинг не параллельно с игровой логикой шёл.
Автор: @shiko_q
Пост: https://news.1rj.ru/str/unity_cg/49798
#rendering #skinnedmeshrender
Что делает скинмеш? Он на цпу (на других потоках) или на гпу (компьют скиннинг) запускает апдейт позиций вертексов на меше.
Что значит оффскрин? Это относится к SkinMeshRenderer'ам чьи баунды не попали во фрустум камеры.
Мы не можем запустить рендер до скиннинга.
Мы не можем запустить скиннинг ДО куллинга.
А куллинг мы не можем запустить ДО окончания просчета игровой логики (вдруг у вас в LateUpdate камера куда-то перемещается).
В итоге:
Если вы галочку оставите - у вас могут просчитываться скинмеши, которые не видно сейчас. И из-за этого может дольше рендериться кадр.
Если вы галочку уберете - у вас может дольше рендериться кадр из-за того, что скиннинг не параллельно с игровой логикой шёл.
Автор: @shiko_q
Пост: https://news.1rj.ru/str/unity_cg/49798
#rendering #skinnedmeshrender
🔥16👍1
Итак, пришло время сказать что я думаю о будущем и юнити.
Что сделали юнити?
Глобально они хотят вылезти из задницы, в которую сами себя засунули. Это напоминает наш релиз Mushroom Wars 2, когда мы хотели выпустить стим-версию, платную, без внутренних платежей, рекламы и прочего ф2п говна. Но вскоре поняли, что выжить можно только в ф2п. Поэтому приоритет резко стал мобильным и бесплатным.
По сути юнити сейчас находится в большом минусе, они потратили кучу денег, чтобы стать монополистом на рынке, а теперь им приходится платить по счетам, чтобы хоть как-то вернуться в ноль.
Изначальная политика юнити была криком о помощи, нежели чем реальной возможностью поправить свои дела. То есть они ожидали, что их политика не сильно понравится, но они не ожидали что этим решением они убьют рынок ф2п.
Я уже много раз писал почему это убивает ф2п рынок, думаю, что вы и сами понимаете это, если нет - го в комменты.
Что делать дальше?
На самом деле ничего. В реальности если ваша компания вылезает за рамки 1млн - вам нужно добавить 4% к расходам магазина (ну представьте, что apple стали брать не 30%, а 34%). Больно? Да. Сильно? Ну нет. Вы же не откажитесь от рынка ios, только потому что комиссия увеличилась на 4%?
Но есть и обратная сторона. Особенно для тех компаний, которые закупались в ноль, то есть тратили условно 1млн, получали обратно этот же 1млн, но при этом платили комиссию стору. То есть глобально вы привлекаете юзеров, которые когда-нибудь что-нибудь да заплатят.
Возвращаясь к теме поста…
На самом деле мы имеем такую реальность:
1. Юнити - скорее всего (на 99%) подписки останутся, то есть при достижении каких-то ревенью, вы должны будете платить 4% от гросса. Чем это плохо? Глобально это вы к 30% комиссии стора добавляете еще 4%. Много это или мало - каждый решает сам с точки зрения бизнеса. Возможно, что будет отдельное решение для топовых студий, но что-то я сильно сомневаюсь.
2. UE - даже если забыть про проблемы с размером билда, что там не сильно парятся насчет мобилок в принципе (глобально для мидкора можно и пережить) - с вас хотят 5% гросс, что собственно чуть больше, чем хочет юнити, при этом имея лучший бэкграунд для мобильной разработки. Понимают ли это эпики? Думаю, что да. Будут ли они с этим что-то делать? Думаю, что нет. У них другие приоритеты, и если вы думаете, что в UE все намного лучше, то вы просто забыли историю.
3. Годот - движок, который сделан программистами для программистов. Там есть редактор, да. Удобный? Нет. Много вопросов в принципе к архитектуре, которые вряд ли будут решены. До юнити годот настолько далеко, что это только год минимум надо потратить только на редактор (это если самим движком не заниматься). В целом из плюсов только шарп и плюсы, но прикрутить шарп вообще не проблема сейчас к любому движку. Для простых проектов пойдет, для более сложных - ну скорее нет.
4. Cocos - тут все просто. Движок, который не умеет в плюсы, ну или хотя бы в шарп - не движок, а какая-то хрень для веб-разработчиков. Я сам когда-то писал на js (ts тогда не было), поэтому я понимаю, что возвращаться на js/ts - это деградация.
5. Остальные движки. В реальности они не готовы к продакшену, совсем. У некоторых есть неплохие редакторы (flax, stride), плохая поддержка, т.к. на них просто забили (собственно, зачем конкурировать с юнити?).
Что будем делать мы?
Для текущих проектов - очевидно, что юнити. Для следующих проектов - не знаю. Думаю, что юнити глобально выйдут в плюс и все будет у них хорошо. Мы еще раз вернемся к этому вопросу в следующем году и посмотрим что успели сделать другие движки, но пока остаемся на юнити.
Это все мое личное мнение на происходящее, которое не имеет отношения к мнению компаний Azur Games, Jet Whales и Zillion Whales.
#unity #future
Что сделали юнити?
Глобально они хотят вылезти из задницы, в которую сами себя засунули. Это напоминает наш релиз Mushroom Wars 2, когда мы хотели выпустить стим-версию, платную, без внутренних платежей, рекламы и прочего ф2п говна. Но вскоре поняли, что выжить можно только в ф2п. Поэтому приоритет резко стал мобильным и бесплатным.
По сути юнити сейчас находится в большом минусе, они потратили кучу денег, чтобы стать монополистом на рынке, а теперь им приходится платить по счетам, чтобы хоть как-то вернуться в ноль.
Изначальная политика юнити была криком о помощи, нежели чем реальной возможностью поправить свои дела. То есть они ожидали, что их политика не сильно понравится, но они не ожидали что этим решением они убьют рынок ф2п.
Я уже много раз писал почему это убивает ф2п рынок, думаю, что вы и сами понимаете это, если нет - го в комменты.
Что делать дальше?
На самом деле ничего. В реальности если ваша компания вылезает за рамки 1млн - вам нужно добавить 4% к расходам магазина (ну представьте, что apple стали брать не 30%, а 34%). Больно? Да. Сильно? Ну нет. Вы же не откажитесь от рынка ios, только потому что комиссия увеличилась на 4%?
Но есть и обратная сторона. Особенно для тех компаний, которые закупались в ноль, то есть тратили условно 1млн, получали обратно этот же 1млн, но при этом платили комиссию стору. То есть глобально вы привлекаете юзеров, которые когда-нибудь что-нибудь да заплатят.
Возвращаясь к теме поста…
На самом деле мы имеем такую реальность:
1. Юнити - скорее всего (на 99%) подписки останутся, то есть при достижении каких-то ревенью, вы должны будете платить 4% от гросса. Чем это плохо? Глобально это вы к 30% комиссии стора добавляете еще 4%. Много это или мало - каждый решает сам с точки зрения бизнеса. Возможно, что будет отдельное решение для топовых студий, но что-то я сильно сомневаюсь.
2. UE - даже если забыть про проблемы с размером билда, что там не сильно парятся насчет мобилок в принципе (глобально для мидкора можно и пережить) - с вас хотят 5% гросс, что собственно чуть больше, чем хочет юнити, при этом имея лучший бэкграунд для мобильной разработки. Понимают ли это эпики? Думаю, что да. Будут ли они с этим что-то делать? Думаю, что нет. У них другие приоритеты, и если вы думаете, что в UE все намного лучше, то вы просто забыли историю.
3. Годот - движок, который сделан программистами для программистов. Там есть редактор, да. Удобный? Нет. Много вопросов в принципе к архитектуре, которые вряд ли будут решены. До юнити годот настолько далеко, что это только год минимум надо потратить только на редактор (это если самим движком не заниматься). В целом из плюсов только шарп и плюсы, но прикрутить шарп вообще не проблема сейчас к любому движку. Для простых проектов пойдет, для более сложных - ну скорее нет.
4. Cocos - тут все просто. Движок, который не умеет в плюсы, ну или хотя бы в шарп - не движок, а какая-то хрень для веб-разработчиков. Я сам когда-то писал на js (ts тогда не было), поэтому я понимаю, что возвращаться на js/ts - это деградация.
5. Остальные движки. В реальности они не готовы к продакшену, совсем. У некоторых есть неплохие редакторы (flax, stride), плохая поддержка, т.к. на них просто забили (собственно, зачем конкурировать с юнити?).
Что будем делать мы?
Для текущих проектов - очевидно, что юнити. Для следующих проектов - не знаю. Думаю, что юнити глобально выйдут в плюс и все будет у них хорошо. Мы еще раз вернемся к этому вопросу в следующем году и посмотрим что успели сделать другие движки, но пока остаемся на юнити.
Это все мое личное мнение на происходящее, которое не имеет отношения к мнению компаний Azur Games, Jet Whales и Zillion Whales.
#unity #future
👍44❤7🥰2🤨2👏1👌1
Напоминаю, что сегодня в 16:00 по мск будем разбирать ME.BECS. Кто еще не регался - велкам:
https://news.1rj.ru/str/unsafecsharp/192
#event
https://news.1rj.ru/str/unsafecsharp/192
#event
Telegram
Unity: Всё, что вы не знали о разработке
В эту субботу пройдет евент на тему ME.BECS, я расскажу как ее использовать и отвечу на ваши вопросы. Формат немного поменяем и я сначала расскажу об API и отвечу на интересующие вопросы, а затем мы сможем посмотреть на ваш проект и решить конкретные вопросы.…
🔥5🤡1
Всем привет! Мне очень нужен ваш фидбэк для моего личного сайта. Можете написать все что считаете нужным:
https://docs.google.com/forms/d/e/1FAIpQLScgfoG3ayzhQcBnQM6IY-QnTzMk0-uIyKwks02x7lzEClnChQ/viewform?usp=sharing
Всем огромное спасибо;)
#feedback
https://docs.google.com/forms/d/e/1FAIpQLScgfoG3ayzhQcBnQM6IY-QnTzMk0-uIyKwks02x7lzEClnChQ/viewform?usp=sharing
Всем огромное спасибо;)
#feedback
🦄7🤡5👍2🥰1
Итак, я завел сайтик, где буду размещать все события, а также вести блог (сейчас там можно найти все темы, которые есть в этом канале, но в более удобном виде).
Канал в ТГ остается и я буду делать посты тут тоже.
Регайтесь на событие, которое пройдет в эту субботу в 4 часа по мск:
https://www.unsafecsharp.com/events/ugui-Рассказываю-про-uiwindows
#event
Канал в ТГ остается и я буду делать посты тут тоже.
Регайтесь на событие, которое пройдет в эту субботу в 4 часа по мск:
https://www.unsafecsharp.com/events/ugui-Рассказываю-про-uiwindows
#event
🔥22❤2
xmm vs ymm
Написал немного про векторизацию:
https://www.unsafecsharp.com/blog/xmm-vs-ymm
#burst #vectorization #performance
Написал немного про векторизацию:
https://www.unsafecsharp.com/blog/xmm-vs-ymm
#burst #vectorization #performance
🔥9👍2
Напоминаю, что сегодня в 4 часа по мск будем обсуждать UI.Windows:
https://www.unsafecsharp.com/events/ugui-Рассказываю-про-uiwindows
#event
https://www.unsafecsharp.com/events/ugui-Рассказываю-про-uiwindows
#event
@unsafecsharp
uGUI: Рассказываю про UI.Windows - @unsafecsharp
🔥12👍2❤1