Войти
ПрограммированиеФорумГрафика

[Unity3D] Делаем нормальный инструментарий для линий без трололо и бесплатно. (2 стр)

Страницы: 1 2 3 48 Следующая »
#15
(Правка: 3:51) 3:39, 11 янв. 2019

Замени классы LineContainer, CircleContainer и PolygonContainer на структуры и одну общую очередь на три типизированных. Одним махом избавишься от львиной доли аллокаций. Три примитива достаточно, больше вряд ли добавится, они покрываю 95% потребностей. Если Circle заменить на Arc, то 99,9% потребностей.

Меши ещё создаются в диких количествах. Их можно переиспользовать.

Вместо присваивания мешам атрибутов в виде массивов, можно использовать методы mesh.SetVertices и аналоги, принимающие List<T>. А поскольку у списков длина нефиксированная, их потом можно очищать и переиспользовать, не аллоцируя постоянно заново.


#16
(Правка: 4:07) 3:54, 11 янв. 2019

alexzzzz
> Замени классы LineContainer
Я давно попробовал да, но не все так просто. Там не стыковка какая-то в компиляторе Unity на Monodevelop стал ругаться.
alexzzzz
> принимающие List<T>
Листы может не аллоцируются, но заполняются дольше чем массив.
alexzzzz
> Вместо присваивания мешам атрибутов в виде массивов,
Вот представь сделал ты несколько отрисовок с разными линиями и тд и каждый меш для этих целей разного размера, где я это все буду хранить и как? MeshTmp возможно можно переиспользовать.
Но дело не в этом, все эти аллокации тратят не больше 0.01 мс.
Посмотри последний пример с LineTest.

#17
(Правка: 15:18) 4:25, 11 янв. 2019

1. Всё что надо нарисовать, по ходу кадра запоминается в очередях рисования (как в LineTest). Нет смысла моментально делать Graphics.DrawMesh. Всё равно оно нарисуется не сразу, а потом в конце кадра.
2. В конце кадра по данным из очередей перегенерируются общие списки вершин, индексов и т.д. Каждый примитив по очереди просто добавляет информацию о своей геометрии к существующим в списках данным.
3. Берётся существующий меш, очищается. В него заливаются списки.
4. Меш отдаётся на рендеринг.
5. Очереди рисования и списки атрибутов очищаются и готовы к переиспользованию.

#18
(Правка: 5:05) 4:40, 11 янв. 2019

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

То есть ты можешь конечно просто GLine.Draw(); один раз поставить куда-нибудь и будет тоже самое. Одного меша на кадр хватит за глаза.

Ты последний пример не загрузил.

#19
11:56, 11 янв. 2019

это просто супер,  очень нужно было линии рисовать, но стандартный linerenderer не удобный
много линий - много гейм обжектов.
кстати что такое  [MethodImpl(256)] ?
у меня юнити ругается и не компилирует

#20
(Правка: 18:15) 12:36, 11 янв. 2019

stupid bot
Ты старую версию скачал, там два пакета в нулевом посте. Но это странно, потому что я специально написал [MethodImpl(256)], это даже в 4 версии unity работает - аналог inline.
Там должна быть сточка:
using System.Runtime.CompilerServices;

alexzzzz
Сегодня протестировал нормально со структурами, там очень много копирования (даже ref-ы не спасают) и производительность упала в два раза. Потестировал оба варианта вместе производительность поднялась в два раза. Очень странно как то все.
GC.Collect почему то вызывается исключительно в варианте со структурами.

По памяти конечно структуры выигрывают, но такое поведение очень странное. Тут на каждый тест 100 линий (GLine.Line).
linerender_test0001 | [Unity3D] Делаем нормальный инструментарий для линий без трололо и бесплатно.
Нашел утечку.

Еще я протестировал DrawPolygon на моем железе с 15000 точек, он показывает 23mc на 2017. С Vectrosity сравнить не могу, у меня его нет он платный.

#21
18:54, 11 янв. 2019

Убрал утечку и на структурах получилось медленнее чем с кучей аллоков.

linerender_test0002 | [Unity3D] Делаем нормальный инструментарий для линий без трололо и бесплатно.
#22
19:22, 11 янв. 2019

foxes
покажи код как сделал

#23
(Правка: 19:37) 19:25, 11 янв. 2019

Mira
Так как кода уже много я выкладываю в нулевом посте пакет. Последний с небольшой утечкой V0002. Сейчас на структуры нормально перевел чтобы выигрыш был. в течении 10 минут последний вариант положу V0003. Базовые функции я не менял все во втором посте.

#24
21:27, 11 янв. 2019
xdraw | [Unity3D] Делаем нормальный инструментарий для линий без трололо и бесплатно.

XDraw.unitypackage

Функционал минимальный, только прямые линии, чисто для теста. Аллокаций ноль, код простой, работает быстро, ещё быстрее можно.

Пример использования:

XDraw.DrawLine(start, end, color, thickness)

Имя XDraw взято от фонаря, буквы X и D рядом на клавиатуре.

#25
(Правка: 23:59) 22:41, 11 янв. 2019

alexzzzz
Сейчас только аллокация буфера для меша осталась.

6.76-7.3 mc + 2.1-2.3 mc  (LateUpdate + Example.Update)  8.86-9.6 mc для 7803 линий (51*51*3)
У меня последний вариант дает 10.2 - 11.7 мс (то есть 1-2 мс уходит на аллокацию буферов меша)

Если у тебя при заполнении примитивов в Queue использовать просто массив XDraw.Line[], а значения заполнять прямо.

        XDrawManager.lines[XDrawManager.count].start = start;
        XDrawManager.lines[XDrawManager.count].end = end;
        XDrawManager.lines[XDrawManager.count].color = color;
        XDrawManager.lines[XDrawManager.count].thickness = t;
то Example.Update уже работает 1.98-2.1 mc

Странно, я обернул одинаковый цикл (казалось)

        for (int i = 0; i < 7803; i++)
            XDraw.DrawLine(Vector3.zero, Vector3.one, Color.red);

        for (int i = 0; i < 7803; i++)
            GLine.Line(Vector3.zero, Vector3.forward * 10.0f);
И у тебя эта часть 1.5 мс, а у меня 0.9 мс. Они в принципе одинаково работают при передаче цвета, у меня тоже 1.5 мс. То есть дополнительный параметр увеличивает время, но по сути это же тот же метод только обернутый. Должно быть то наоборот.

И вообще у тебя сразу можно в DrawLine AppendLine вызывать. это дает 6.26 - 6.5 + 1.5-1.6
=  7,76 - 8.1 mc

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

Жалко что нельзя устанавливать только часть вершин из массива в mesh он его весь глатает.
Не в курсе GetNativeVertexBufferPtr работает на всех платформах и можно через него обновлять если размер меша не менялся?

#26
(Правка: 4:21) 4:16, 12 янв. 2019
xdraw | [Unity3D] Делаем нормальный инструментарий для линий без трололо и бесплатно.

XDraw+XDrawUnsafe.unitypackage

Ускорил, плюс попробовал второй вариант с рефлексией и unsafe-кодом. В 2018.3 заработает, в остальных без гарантий.

Идей, как ещё принципиально ускорить у меня больше нет. Но несколько миллисекунд на 10 тысяч линий уже хорошо.

foxes
> И вообще у тебя сразу можно в DrawLine AppendLine вызывать
В простом варианте я так и сделал, но в unsafe оставил. Там заметное время тратилось на проверку наличия свободного места в коллекциях при добавлении данных для новой линии. Если же сначала все линии собрать вместе и узнать их количество, достаточно одной проверки.

> Жалко что нельзя устанавливать только часть вершин из массива в mesh он его
> весь глотает.
Сделал это в unsafe-варианте через рефлексию. В типе Mesh есть непубличные методы, которые принимают массивы и количество элементов. Соответственно, никаких гарантий, что не сломается после очередного обновления.

> Не в курсе GetNativeVertexBufferPtr работает на всех платформах и можно через
> него обновлять если размер меша не менялся?
Уже пробовал. GetNativeVertexBufferPtr даёт не буфер вершин, а какой-то абстрактный дискриптор.

foxes
Можешь добавить в шейдер расчёт UV? Можно натянуть на линии маленькую текстурку с полупрозрачными краями и получить сглаженные линии. Смотрелось бы получше.

#27
4:27, 12 янв. 2019

alexzzzz
Уже завтра сделаю и гляну.

#28
13:11, 12 янв. 2019

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

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

#29
(Правка: 18:20) 15:16, 12 янв. 2019

я так понял поворот полигонов лицом к камере происходит в шейдере?


[MethodImpl(256)] вот такая ошибка
Assets/LinesTool/Script/LineMeshFunctions.cs(50,14): error CS0647: Error during emitting `System.Runtime.CompilerServices.MethodImplAttribute' attribute. The reason is `Incorrect argument value.'

я его закоментил и всё заработало.
без него будет на много хуже?

unity 5.4.1f1

Страницы: 1 2 3 48 Следующая »
ПрограммированиеФорумГрафика