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

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

Страницы: 1 2 3 4 58 Следующая »
#30
17:35, 12 янв. 2019

Ух, сколько непонятной магии в коде. Интересненько


#31
(Правка: 18:51) 18:15, 12 янв. 2019

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

stupid bot
> без него будет на много хуже?
Фиг знает. Пока это все не точно, возможно переделаю на другой вариант.

stupid bot
>unity 5.4.1f1
Очень странно я тестировал все работает. Ты в WebGL или другую платформу не пытался скомпилировать?

Mira
https://habr.com/post/435422/#comment_19598190

alexzzzz
Видимо какая то несостыковочка.

Assets/XDrawUnsafe/UnsafeBuffer.cs(7,21): error CS1644: Feature `expression bodied members' cannot be used because it is not part of the C# 4.0 language specification

Итого у тебя сейчас в обычном примере 4.48 mc у меня пока 8.5 мс

Добавил два материала и пример текстур (Wrap = Mirror), координаты генерируются автоматически по ширине линий (высота текстуры: центр - низ текстуры, края - верх текстуры), по длине 0. Залил новый пакет V0004 и добавил новые шейдеры в первый пост.

#32
18:40, 12 янв. 2019

foxes
> Видимо какая то несостыковочка.
Конечно нестыковочка. 2018.3 поддерживает C# 7.3. В других версиях Unity unsafe-вариант всё равно может не работать из-за использования рефлексии.

#33
(Правка: 22:35) 21:42, 12 янв. 2019

Кубик из 7803 линий.

+ Профайлер

Слева старый простой вариант:
- вызов DrawLine сразу добавляет данные в буферы вершин, индексов и т.п.;
- в конце кадра буферы присваиваются мешу и он отдаётся на рисование.

+ Профайлер

Справа обновлённый unsafe-вариант с рефлексией, unity.math, burst (ни в чём себя не ограничивал):
- вызов DrawLine добавляет стуктуру-линую в список на рисование;
- в конце кадра внутри джобов по очереди заполняются буферы вершин, индексов и т.п.;
- пока одни буферы в фоне заполняются, уже готовые параллельно присваиваются мешу;
- меш отдаётся на рисование.

Код конечно выглядит дико. С другой стороны 2x ускорение.

--
Архив с полным проектом для Unity 2018.3 - XDraw

#34
(Правка: 23:57) 23:30, 12 янв. 2019

alexzzzz
> Код конечно выглядит дико. С другой стороны 2x ускорение.
В WebGL работает?

У меня передавался Color вместо Color32 просадка в два раза. Есть мысль передавать не отрицательное направление, а отрицательную толщину. Переделывать ни чего не надо.

        tangents.Add(tangent);
        tangents.Add(tangent);

        tangent.w = -tangent.w;

        tangents.Add(tangent);
        tangents.Add(tangent);
#35
(Правка: 23:59) 23:56, 12 янв. 2019

foxes
> В WebGL работает?
Сомневаюсь. Не предлагаю unsafe-вариант к использованию. Он чисто для эксперимента, понять, во что упрётся скорость. Упирается она главным образом в присвоение мешу буферов с атрибутами, которое никак не ускорить. Медленнее всего присвоение вершин и присвоение индексов. Цвета и тангенты в разы быстрее.

#36
(Правка: 13 янв. 2019, 2:48) 23:58, 12 янв. 2019

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

Сделал по твоему примеру но у меня просадка, на 1 mc больше. Толи я у тебя не все посчитал то ли магия какая то. Притом что глобальные статические буферы или в структуре роли не играет.

Все таки шейдер пришлось немного поправить. Остается только придумать как текстурировать линии по длине без передачи лишних параметров (уже). А пока положил все в V0005 + примитив Box.

#37
(Правка: 2:44) 2:32, 13 янв. 2019

что будет если вершин будет > 65000 ? в юнити лимит 65000
нет, в настройках стоит windows mac
я еще даже не компилировал в программу, сама редактор юнити ругается, в консоле ошибка.
ну да ладно, это не критично. работает и окей ))

#38
(Правка: 2:39) 2:36, 13 янв. 2019

stupid bot
Пока это не предусмотрено, но у меня это предполагается будет решаться лишним вызовом draw. А вообще это зависит от битности индексов, для 16 это 65536, а для 32 это больше.

#39
2:48, 13 янв. 2019

foxes
> зависит от битности индексов
опаньки,  а это как? разве так можно было ? я вот сетку 128х128 по 4 вершины на квадрат не могу сделать - вершины не влазят, приходится 4 сетки 64х64 делать ((

#40
(Правка: 3:08) 2:53, 13 янв. 2019

stupid bot
Возможно ограничения в самом Mesh. если использовать вычислительные шейдеры или DrawProcedural то там этого нет.

Тут например, насколько я помню было больше 100к вершин до 163840 и это Unity 5.

+ Показать

stupid bot
> приходится 4 сетки 64х64 делать ((
Это даже лучше для бесшовного мира, чтобы маленькими порциями обновлять.

+ Показать
#41
(Правка: 4:03) 3:54, 13 янв. 2019

В unsafe-варианте XDraw используются меши с 32-битными индексами. Просто формат индексов задаётся и всё. Разницы в скорости не заметил. Поддерживается ли на любых платформах, не интересовался. Поддержка 32-битных индексов появилась не очень давно. В 2017 или 2018. Про Unity 5 сомневаюсь.

Кстати, может, с треугольников на квады перейти? ― меньше индексов заливать. Но не факт, что будет быстрее, может и наоборот.

#42
(Правка: 4:20) 4:12, 13 янв. 2019

alexzzzz
> Поддержка 32-битных индексов
Мне казалось что она всегда была только не полноценная. Обойти ограничения можно было всегда это точно. Mesh.indexFormat правда отсутствует.
alexzzzz
> на квады перейти?
Надо потом потестить будет. Всяко чуть меньше, но если какие грабли вылезут будет неприятно. Только вот для этого SetQuads понадобиться, а его нету.

#43
(Правка: 4:39) 4:37, 13 янв. 2019

Граблей быть не должно. Unity эти квады всё равно сразу или потом преобразует в треугольники. Разница только в количестве индексов, которые надо заливать в Mesh.

> SetQuads
Mesh.SetIndices

Оказывается, есть прикол ― SetIndices принимает только массивы. Про списки забыли.

#44
(Правка: 12:46) 12:01, 13 янв. 2019

alexzzzz
> Про списки забыли.
Вот тебе и грабли.

Тестирую пунктир. Работает на старом варианте алгоритма.
linerender_006 | [Unity3D] Делаем нормальный инструментарий для линий без трололо и бесплатно.

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