Войти
ПрограммированиеФорумОбщее

Строковые идентификаторы в движке. string pools. (комментарии)

Страницы: 1 2 3 Следующая »
#0
(Правка: 8 ноя 2022, 8:33) 21:30, 6 мая 2022

Строковые идентификаторы в движке. string pools. (комментарии)

Это сообщение сгенерировано автоматически.

#1
22:11, 6 мая 2022

FourGen
> Если к чему-то типа ресурсов обращаться по имени, это приведет рано или поздно
> к багам, будут проблемы с именованием ресурсов, особенно если они будут
> называться одинаково. Появятся жесткие ограничения и прочие неудобные навороты.
Это проблема ААА проектов. В инди игре такое редко встречается.
А для решения проблемы 2 ассетов с одинаковым именем додумались включать в имя ещё и путь к ассету. Но это опятьже про движки в которых полноценная система ассетов.

Как думаешь в анреале ссылки на ассеты выглядят?

+ Показать

FourGen
> Мне бы было бы очень интересно понять, как узнать какие ресурсы надо подгружать
> или выгружать, находясь в такой-то точке на заданном растоянии от него В
> смысле, как связать точку, с требуемыми ресурсами на заданной дистанции так,
> что бы минимизировать количество проверок?
В ECS я бы это сделал с помощью эммиттера и сетки ускорения. Быстро и эффективно. Если игра в 3д то сетку 2-3 уровневую, чтобы 100x100x100 не проходить каждый фрейм.

FourGen
> А по именованию можно уже как угодно делать
> 1 - 8 бит тип предмета
> 1 - 4 следующего байта класс, если 5-8й 0 то недоступен и тд. - получаем
> идентификатор предмета. Извращений на придумывание сколько хочешь по
> именованию, а обращаться к этому идентификатору, так же можно как угодно, то
> есть как умеешь.
Ага и теперь для каждого ассета в игре надо настроить битики. Чёт "charachter_male.asset" выглядит лучше чем 0x000021C4.

FourGen
> В любом случае, я бы хеши использовал какие-то, не знаю от каждого файла или
> от, что там еще есть префаба. По крайней мере это гарантированно будет
> уникально.
"Хеши" и "уникально" вещи несовместимые. Да и какое будет тогда отличие от варианта 4?

Да и известно к чему это приведёт. Можешь в унижайне посмотреть что из этого вышло.

#2
5:45, 7 мая 2022


вопрос - а нафега такой изврат?

Почему не сделать проще:

Local sound:TSound=TSound.Load( "mysound.ogg" )
Local image:TImage=TImage.Load( "myimage.jpg" )

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

#3
9:56, 7 мая 2022

mingw
> Почему не сделать проще:
Потому что тебе придётся

Local image1:TImage=TImage.Load( "myimage1.jpg" )
Local image2:TImage=TImage.Load( "myimage2.jpg" )
Local image3:TImage=TImage.Load( "myimage3.jpg" )

И такое прокатит разве что только для ГК, где ресурсов всего штук 20-30.

#4
(Правка: 10:41) 10:34, 7 мая 2022

и я так понимаю речь про случай

Local image1:TImage=TImage.Load( "myimage1.jpg" ) 
Local image2:TImage=TImage.Load( "myimage1.jpg" )

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

ну т.е. при реальной загрузке ресурсов пул запросто может быть вытеснен

#5
10:46, 7 мая 2022

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

Смысла в бенчмарках невижу. Проверять на сравнение всю строку и хешировать её явно дольше чем делать то-же с указателем или индексом.

#6
12:46, 7 мая 2022

Вариант 3 выглядит как преждевременная оптимизация варианта 2. На мой взгляд, так заморачиваться стоит только если будут реальные проблемы с производительностью в этом месте. Плюс надо делать не фиксированный буфер, а связный список "страниц" — когда заканчивается место в текущей странице, выделяем следующую. В варианте 4 непонятно, почему _mapId — это мапа, а не вектор.

Кстати, насколько я знаю, начинающиеся с _ идентификаторы использовать по стандарту запрещено.

samrrr
> "Хеши" и "уникально" вещи несовместимые.
Совместимые, называется "криптографический хеш". Есть даже файловые системы, основанные на них. Но, в данном случае, это слабо применимо, ибо хеши часто будут длиннее исходных строк.

#7
13:06, 7 мая 2022

}:+()___ [Smile]
> Вариант 3 выглядит как преждевременная оптимизация варианта 2.
Это статья о пуулах и вариантах реализации, а не об оптимизации.

}:+()___ [Smile]
> Плюс надо делать не фиксированный буфер, а связный список "страниц"
Надо делать vvector просто.

}:+()___ [Smile]
> В варианте 4 непонятно, почему _mapId — это мапа, а не вектор.
Ну так поставь вектор и посмотри что произойдёт.

#8
13:13, 7 мая 2022

}:+()___ [Smile]
> Кстати, насколько я знаю, начинающиеся с _ идентификаторы использовать по
> стандарту запрещено.

END Microsoft Specific

The first character of an identifier must be an alphabetic character, either uppercase or lowercase, or an underscore ( _ ). Because C++ identifiers are case sensitive, fileName is different from FileName.

Identifiers cannot be exactly the same spelling and case as keywords. Identifiers that contain keywords are legal. For example, Pint is a legal identifier, even though it contains int, which is a keyword.

Use of two sequential underscore characters ( __ ) in an identifier, or a single leading underscore followed by a capital letter, is reserved for C++ implementations in all scopes. You should avoid using one leading underscore followed by a lowercase letter for names with file scope because of possible conflicts with current or future reserved identifiers.

И ничего про то, как я поименовал переменную.

И заметь, это чисто компилятор так сказал а не стандарт.

#9
19:01, 7 мая 2022

Ага и теперь для каждого ассета в игре надо настроить битики. Чёт "charachter_male.asset" выглядит лучше чем 0x000021C4

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

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

В ECS я бы это сделал с помощью эммиттера и сетки ускорения. Быстро и эффективно. Если игра в 3д то сетку 2-3 уровневую, чтобы 100x100x100 не проходить каждый фрейм.

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

Как думаешь в анреале ссылки на ассеты выглядят?

+ Показать

Вот это похоже, на то что я имею в виду, да как-то так вполне нормально, чем это плохо?
И это не похоже на парсинг индекса из строки. Я бы согласился бы с парсингом, если там значение char читалось бы, но парсинг стринга не согласен, что стабильно, хоть и можно конечно.

"Хеши" и "уникально" вещи несовместимые

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

>}:+()___ [Smile]

хеши часто будут длиннее исходных строк

В UE и С++ проблема с несколькими десятками байт, что бы туда добавить вообще все данные * 1000 ресурсов? Я может и ошибась, но пока то что вижу в unity одна загруженная модель с материалом и текстурой, занимает памяти больше, чем, все мои кривые переменные вместе взятые включая всю текстовую информацию, причем на порядки больше. Не понимаю проблемы.

Кроме того про хеш, я имел в виду немного другое:
Вот мне делали проект на С, там 38 папок разной версионности, в одной папке есть одно, но нет другого, во второй что-то красное в другой это же но зеленое. В третьей эта же зеленая текустура, но натянутая на другой меш. Я имел в виду сначала все ресурсы автоматом рассортировать так, что бы были все варианты и не надо было париться с тем что что-то есть чего-то нет и эта куча папок не была бы проблемой, что бы автоматом исключить исключить вопрос версионности файлов как-то.

#10
19:31, 7 мая 2022

FourGen
> Вот это похоже, на то что я имею в виду, да как-то так вполне нормально, чем
> это плохо?
Этот вопрос не ко мне, а к тому кто написал это:
> Если к чему-то типа ресурсов обращаться по имени, это приведет рано или поздно
> к багам, будут проблемы с именованием ресурсов, особенно если они будут
> называться одинаково. Появятся жесткие ограничения и прочие неудобные навороты.

FourGen
> как бы сказать имя сделать так, что бы можно было сразу и понять, где это
> находится на карте, и что это и когда это грузить
Mission impossible. Даже не пытайся, это путь вникуда. Представь 1 объект в 3 разных местах.

FourGen
> Первое, что я попробовал, взял штуку от системы навигации, какую писал, она
> делает 2х мерный массив массивов, где записаны объекты в точке (квадрате) то
> есть все от низа и до верха (в области заданного шага). Карта объеков у меня
> есть, но все равно получается погрузка квадратами, просто маленькими и нет
> возможности разом обратиться ко всем, все равно в цикле надо проходить массив
> 2х мерный по заданному радиусу и его внутрянку с объектами. Это не вариант,
> работает, но слишком много проходов и не быстро.
Ну так и сделать. Только пусть сами объекты свои ресурсы в сетку пишут. И счегобы это медленно? Обойти 100-200 квадратов так трудно?

#11
19:32, 7 мая 2022

FourGen
> все равно в цикле надо проходить массив 2х мерный по заданному радиусу и его
> внутрянку с объектами.
Существует такая штука называется ивенты, это чтоб не проходиться каждый фрейм отслеживая состояние.

#12
19:46, 7 мая 2022

FourGen
> Вот мне делали проект на С, там 38 папок разной версионности, в одной папке
> есть одно, но нет другого, во второй что-то красное в другой это же но зеленое.
НАСТАЛО ВРЕМЯ ИСТОРИЙ | Строковые идентификаторы в движке. string pools. (комментарии)

Надеюсь за это хотя бы нормально платят.

Сохранить всё отдельно, а в проекте все папки кроме последней удалить. Проблема на этом будет решена. Другие решения создадут больше проблем, чем толку.

#13
20:40, 7 мая 2022

>samrrr

Существует такая штука называется ивенты

Не хочу ивенты ) это не интересно. Ну суть кажется понял, грузить по зонам использовать стандарные инструменты и не париться.

Представь 1 объект в 3 разных местах.

Да как раз с этим то проблем нет.

Пока еще попробую, не получится буду делать, как проще.
Спасибо за разъяснения и помощь.

P. S.

Этот вопрос не ко мне, а к тому кто написал это

Там кроме имени есть все остальные данные...

#14
1:44, 8 мая 2022

>u960
Ресурсы, разной версионности и прогресса ну и код сам.

звучит ужасно

Нет это обычное явление при написании софта (если не пользоваться контроллером версий).
Я лично то же не пользуюсь, я предпочитаю копировать проект целиком. (Что бы не было вопросов, откатывать мне никогда ничего не нужно, все что сделано - сделано на готово, все видимые баги устранены во всех мыслимых и не мыслимых комбинациях действий (да вылезают, но в большинстве не критичные, типа координат съехавших или тому подобная мелочь). Больше не дорабатывается если не нужен доп. функционал, хотя попробовал, удобно, но не на столько, как простое копирование) (так же код который у меня был и что я там поменял, мне без разницы, если я его поменял значит старый не нужен.)
(я не контролировал тот процесс на столько глубоко, что бы организовать адекватное именование и хранение контента, надо было, но уже поздно, что-то думать. Что есть то есть. У меня лично контент в 1й папке весь, весь проверен и проименован адекватно)

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