Вот что я хотел отметить. Когда только-только начинаешь программировать - никаких проверок ни на что не делаешь. Ессно оно вылетает при каждом удобном случае. Когда ты уже набрался достаточно опыта - лепишь эти чёртовы проверки везде, даже там где по смыслу они не особо нужны. И тем самым просто загоняешь проблему еще глубже. Чтобы её потом было невозможно отдебажить. По хорошему код должен работать таким образом, чтобы не допускать появления невалидных данных в принципе.
А если допустил, значит это нештатная ситуация. Поэтому если где-то вылетает - не надо там ставить проверку. Надо разобраться как там вообще появились невалидные данные. Т.е. ошибка где-то вообще в другом месте.
Дядя Миша
Ты же сам понимаешь что не бывает идеальных алгоритмов. Везде приходится идти на уступки и компромисы. С теми же развертками, какой то метод работает в одних случаях лучше, а какой то в других лучше чем этот.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Government-Man писал: А как ты проверишь, что код не допускает появления невалидных данных?
в основном - прецендентным образом. 90% прецедентов находятс во время первичной имплементации, тестирования и отладки. Оставшиеся 10% можно ловить всю жизнь.
Цитата:
FiEctro писал: Ты же сам понимаешь что не бывает идеальных алгоритмов
это тут вообще не к месту. Я не про то, что результат устраивает пользователя, я про то, что при обработке данных не должно быть инвалидных значений. Если источник данных допускает появление таких значений, разумно это отловить при загрузке. Но в дальнейшем их ловить нет никакого смысла, ибо если они появились где-то дальше - надо искать ошибку в алгоритме, а не лепить проверки, не докапываясь до сути появления.
Government-Man в UE4 по прежнему | это DotProduct, а ^ CrossProduct?
В UE3 не было. Вообще за такое руки надо отрывать. Один из самых мерзких антипаттернов. Вообще в UE3 довольно много антипаттернов, навскидку.
Как в четвертом не знаю, сорцы не дают без регистрации.
Ну вот и встала в полный рост проблема. Я еще, когда над параноей работал, прекрасно это понимал, собсно куча одинаковых моделей на карте - это очень плохо во всех отношения. Это не только избыточные данные на диске, но и видеопамяти. Ну хорошо, на грасстесте от силы древеьев мало, ёлочи и той штук 30 не наберётся. А если я захочу ТЛез32? Сосны, поляно, медвед. 65 тысяч килоёлок. Сколько такая карта будет весить?
Одна ёлка занимает полтора мегабайта. Значит карта из уникальных ёлок будет весить 122 гигабайта. То есть вообще не вариант. И да, 65 тысяч килоёлок, это ТЛез16 всего-то навсего. Инстансинг, напомню хранить только то, что отличается. Матрица трансформации и освещение. С динамикой вопросов нет. Как быть со статикой? С лайтмапой на самом деле очень просто - надо завести в описании модели оффсет до реального места в атласе и номер страницы. А вот повертексное так уж не запишешь.
Но я так рассуждаю - если уж на модели есть лайтмапа, то и фиг с ним, с повертексным-то. К тому же возможность встроить модель внутрь карты, никуда не исчезнет, она тоже останется.
Но сделать инстансинг - полдела. Мне еще предстоит работать промежуточный бинарный формат кэшированных моделей. Объясню почему. Генерация лайтмапы, равно как и построение конвексного хулла - весьма небыстрое дело. Есть резон построить это один раз, сохранить в кэш, а в дальнейшем просто брать при компиляции эту модельку из кэша. Ну или вообще хранить снаружи, чтобы не усложнять. Или использовать оба варианта. Возможно что промежуточный бинарный формат станет одним из основных неанимированных форматов мешей для движка. Как оптимальнее - станет понятно уже по факт имплементации.
В принципе в параное есть зачатки такого кэша, она создаёт файлы .TBN и .CLIP видели наверное.
Добавлено 08-08-2020 в 00:11:
Вообще до смешного доходит. makebsp трудился над грасс-тестом две с половиной минуты. Знаете чем он занимался? Генерил текстурные координаты персонально для каждой одинаковой ёлки. В сумме 0.3-0.5 секунд, но и ёлочи тоже порядочно ведь на карте.
dolight строил KD-tree для эффективной трассировки 22 секунды.
А собственно рассчёт освещения длился 13 секунд. Лайтмапа, к слову немаленькая, 1024х1024. Чёрные треугольники - это не артефакты, они просто развернуты в сторону от солнца. Вообщем узкое место совсем не там, где его можно было-бы ожидать.
ЗЫ. лайтмапа пропорциональная, форум не пускает.
Добавлено 08-08-2020 в 00:16:
Вообще видно наглядно, как все старые "проверенные" технологии из 90-х отваливаются, когда речь заходит о получении боле-менее достойной картинки.
Поскольку разработка движка ведётся примерно так же, как выполняется программный код, это меня приводит порою к очень далёкому отклонению от изначальной цели. Ну скажем, решил я разработать новый формат шрифтов. А где шрифты - там и спрайты. Значит надо переписать худ и меню, чтобы оно использовало новые картинки. Вот и разработка рендерера (эксперименты с динамическим освещением). вполне логично пришла к тому, что неплохо бы иметь референс в качестве лайтмапы, а где лайтмаппер, там и новый формат уровней, а в новом формате уровней неплохо бы предусмотреть возможность embedded-моделей - ну это, чтобы не дублировать их, а хранить одну копию только. Но поскольку для этих моделей неплохо бы предусмотреть какой-то промежуточный кэш, потому что вычисление координат лайтмапы, сглаживание нормалей, рассчёт конвекс-меша, всё это, очевидно занимает какое-то время, лучше сделать кэш. Но какой смысл лепить для кэша какие-то искуственные форматы? Лучше уж сразу его сделать чем-то типа студиомодели, чтобы его можно было использовать и так и эдак. Но всё равно, поскольку этот формат встраивается в карту, логично обеспечить сходность структур, чтобы всё совпадало. И тут я прихожу к мысли, что разделение на уровни и модели - излишне. У них весьма много общего - коллизия, BSP-дерево, сурфейсы, вертексы (у вертексов хранится либо повертексное освещение, либо номера костей), сурфейсы. Ну вообщем отличия только в том, что у BSP есть виздата с порталами, а у моделек - кости. Вполне логично объединить всё это в общий формат с чанками. Получим доброкачественный комбинаторный взрыв, возможности которого по настоящему смогут раскрыть только будущие пользователи движка.
Опять же не придется городить разные просмотровщики для моделей и уровней. Но есть и еще один важный момент - у моделей, как известно есть анимации, а у брашей их нет. Но и тут всё довольно удачно складывается - дело в том, что хранить анимации в модели неудобно и сейчас так уже практически никто не делает. Вместо этого используется банк анимаций. Наделал человек персонажей, к примеру. Они все разные, но у них один и тот же скелет. Какой смысл вкомпиливать эти анимации в каждую модель заново, дублируя? Никакого. Банк анимаций будет строится автоматически, при компиляции каждой новой модельки, если конечно они в нее добавлены. Доступные анимации будут находиться тоже автоматически, по сравнению скелетов. У скелета должны совпасть кол-во костей, имена костей и их иерархия. Ну можно еще конечно позицию-вращение проверять, но это пусть Nemyax скажет, важно это или нет.
Добавлено 08-08-2020 в 15:00:
Мне тут кстати забавная мысль пришла в голову. Для таких объединённых форматов можно будет использовать именованные аттачменты на уровнях, в качестве каких-то точек-локаций, которые не будут жрать эдикты. Ведь очень же часто возникает ситуация, когда надо указать точку, под которую отводится целая энтить. Ну там спавн телепорта или инфо_плеер_старт.
А тут аттачменты. Можно будет сделать сквозной поиск через энтити и такие вот точки в особых случаях. Патч-корнеры всякие так можно хранить.
Или спавнеры тех же эмбеддед моделей, если мы не хотим, чтобы они занимали эдикт. Опять таки энтити в движке доступны весьма условно, а вот такие точки - всегда.
Дядя Миша писал:
Ну можно еще конечно позицию-вращение проверять, но это пусть Nemyax скажет, важно это или нет.
Важно для чего? Если взять скелеты одинаковой топологии с разными трансформами костей, то анимация для первого конечно развалится на втором. Но это всё равно не повод искусственно запрещать такие переносы.
thambs писал: Интересно, несколько таких 'моделей' можно будет собрать в единый префаб/сущность/контейнер?
Так в том-то и соль! Эта схема идеально ложится на все мои задумки.
Можно такую модель использовать как карту. Можно в карту вкомпилить модели. Единственное условие - они все должны быть статические. Ну оно и понятно - встроенным моделям анимация ни к чему всё же. Нет, ну что-то такое процедурное типа ветра конечно можно будет сделать, но и только.
Через какие-то функции. Впрочем оно везде так, кроме разве что кризиса, где эти йолки реально можно было рубить.
Ничего не понял, но напомнило мне то что я описывал тут
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!