Size: a a a

Unity Floodилка

2021 March 09

P

Phantom in Unity Floodилка
Хорошо тогда
источник

GD

Grygory Dyadichenko in Unity Floodилка
Всё грузится) И работает в VR) Просто оптимизировал парсер и кастомные шейдеры) Суть в том, что модель грузится за 8 минут, что как бы адекватно)
источник

GD

Grygory Dyadichenko in Unity Floodилка
Быстрее, чем даже редактор, да ещё и асинхронно и многопоточно) Красота) Ну и собственно через итератор выше. Вообще в шарпе очень много прикольных заготовленных итераторов)
источник

GD

Grygory Dyadichenko in Unity Floodилка
Думаю можно свести до 4-5 минут, но это надо пару недель с парсером копаться, чтобы как раз-таки загрузить модель вообще без единой лишней аллокации)
источник

GD

Grygory Dyadichenko in Unity Floodилка
Там как раз читать байты, то так как obj - это у нас строковый формат, а не байтовый, то основной гемор - это восстановление чисел без аллокаций. Так как нужно высчитывать флот значения
источник

GD

Grygory Dyadichenko in Unity Floodилка
Но в целом это тоже делается за линию в один проход алгоритмически. Просто вот это уже дрочево)
источник

GD

Grygory Dyadichenko in Unity Floodилка
Нужен условный буффер длинной в число значимых символов или точности и при движении каретки, натыкаясь на команду - запоминать её, натыкаясь на пробел обнулять буферы и т.п. Плюс запоминать положение точки. И по сути дальше в цикле по буфферу восстанавливать число, где будет формула типа buf[i] * pow(10, k), где k равно будет положению точки в числе минус индекс массива. И вот по сути полный парсер, через некоторый конечный автомат без лишних аллокаций (ну только буффер по размеру значимых символов в числе)
источник

GD

Grygory Dyadichenko in Unity Floodилка
Но со строками тоже нормально работает)
источник

P

Phantom in Unity Floodилка
Grygory Dyadichenko
Нужен условный буффер длинной в число значимых символов или точности и при движении каретки, натыкаясь на команду - запоминать её, натыкаясь на пробел обнулять буферы и т.п. Плюс запоминать положение точки. И по сути дальше в цикле по буфферу восстанавливать число, где будет формула типа buf[i] * pow(10, k), где k равно будет положению точки в числе минус индекс массива. И вот по сути полный парсер, через некоторый конечный автомат без лишних аллокаций (ну только буффер по размеру значимых символов в числе)
Чем тебе не нравится float.parse?
источник

GD

Grygory Dyadichenko in Unity Floodилка
строку тебе в него подать надо
источник

GD

Grygory Dyadichenko in Unity Floodилка
Для этого её надо аллоцировать
источник

P

Phantom in Unity Floodилка
Убедил
источник

P

Phantom in Unity Floodилка
Хотя
источник

GD

Grygory Dyadichenko in Unity Floodилка
Просто с чтением файла через стрим байт без аллокаций особо (чисто через пару буфферов) нужно долго думать) Поэтому нафиг)
источник

GD

Grygory Dyadichenko in Unity Floodилка
Ну смотри) Стандартный парсер допустим csv) readline (аллокация большой строки) + split - аллокации кучи мелких строк)
источник

GD

Grygory Dyadichenko in Unity Floodилка
И вот ты читая файл в 1 гб срёшь в память на все бабки (точнее на всю оперативку)
источник

P

Phantom in Unity Floodилка
Чекни ReadOnlySpan
источник

P

Phantom in Unity Floodилка
Grygory Dyadichenko
И вот ты читая файл в 1 гб срёшь в память на все бабки (точнее на всю оперативку)
Так, ты попробуй через стэк делать
источник

GD

Grygory Dyadichenko in Unity Floodилка
Ну это тот же буффер только на стеке. Float.parse ты по нему по идее не сделаешь)
источник

P

Phantom in Unity Floodилка
Grygory Dyadichenko
Ну это тот же буффер только на стеке. Float.parse ты по нему по идее не сделаешь)
Ну, есть ReadOnlySpan
источник