lexpexkex (lexpexkex) wrote,
lexpexkex
lexpexkex

Categories:

Обо всём.

1. О генераторе персонажей.
Этот путь занял у меня полгода.
Начнём с технологии шейпкеев или блендшейпов, чтобы было понятно о чём я вообще говорю.
Игровая зд-модель называется мешем. Всё, что вы видите в играх - это меши с текстурами.Что такое меш? Меш содержит в себе информацию в всех вершинах, о том, какие вершины соединяются в полигоны, о UV - развёртке меша, о направлении нормалей в каждой вершине. По этой информации движок строит 3д-модель м накладывает текстуры. Блендшейп - это идея о том, что в меше можно хранить не один набор вершин, а например, два. Вся остальная информация остаётся общей. Для того, чтобы это было возможным, каждая вершина каждой формы должна соответствовать определённой вершине другой формы. То есть основное ограничение - количество вершин должно быть одинаковым. Добиваются его 3д-художники таким способом - просто передвигают вершины на изначальной форме, получая другую. Ничего не добавляя и ничего не убирая. Например, один набор вершин соответствует толстому персонажу, а другой худому. Тогда появляется возможность получить разницу между этими вершинами в виде вектора. А это значит, что мы имеем направление и длину этого вектора. И можем по нему смещаться не на всю его длину, а наполовину, например. Это позволяет легко получить промежуточные формы. То есть мы имеем уже не просто толстого и худого персонажа, а ещё и нормального и полного между этими крайними значениями, просто вводя коэффициент умножения между 0 и 1 (его и можно считать шейпкеем, именно это число задаёт конкретную форму). Если мы умножаем разницу на 1 - получим максимальное значение вектора - самого толстого персонажа. Если мы умножаем разницу на 0 - значение не изменится, персонаж останется худым. Храним мы всего две формы. Худого и толстого. А получаем кучу промежуточных вариантов. А если таких форм много, то возможности настройки неизмеримо возрастают. В чём вы можете убедиться потыков мою демку. Фактически, имея всего один меш с блендшейпами, мы получаем множество вариаций. Так работают все персонажи в Скайриме, Фоллауте 3-4, Симсах и во многих других ААА-играх, где этих персонажей неисчислимое количество. Не верьте глазам своим - говорите вы с монахом или королевой в Скайриме или даже с вампиром - перед вами одна и та же 3д-модель. Кстати, именно это позволяет сделать в Фоллауте выбор внешности родителей и получить похожего на них главного героя.
Изначально я задумывал напрямую использовать блендшейпы. Потому что это удобно и функционал уже заложен в движок. Но всё имеет свою цену. Не сложилось.

Одновременное использование одной и той же модели не получается, так как если на экране два персонажа, то они оба отображаются близнецами, то и дело переключаясь между друг другом. Потому что модель одна и к ней применяются то одни то другие настройки. Хорошее и естественное решение - чтобы у каждого была своя 3д-модель. И тут мы упираемся в недостатки блендшейпов, вытекающие из их структуры. Блендшейп хранит в меше все вершины для каждой формы. У меня таких форм около 200, следовательно меш весит почти в 200 раз больше.
И фиг бы с ним, если бы речь шла об обычной памяти, но меш занимает именно видеопамять! А видеопамяти не густо. Видеокарты с 1 Гб видеопамяти не редкость. А меш весит 100 МБ. То есть в видеопамять влезет только 10 персонажей. И это даже без текстур и уровня. И всё, видеопамять закончилась, начинается постоянное бессмысленное копирование в из обычной памяти в видео и обратно (загрузка\выгрузка мешей) и падение производительности. 40 ФПС с 25 персонажами на моей 2х-гиговой видюхе. А ещё добавьте такую особенность годота, что он грузит сразу все меши на сцене в видеопамять, даже если они не видны и не используются (отключена видимость и тд).
Выхода я не видел. Работу с вершинами я откровенно боялся трогать. Совершенно не мой уровень ведь мне и просто логика скриптов даётся отнюдь не просто. А тут прям высокие материи. Поэтому я решил, что для меня будет этого достаточно. Например. для квеста или файтинга вполне хватит пары-тройки персонажей на сцене. И я отложил это на полгода. Вопросы на профильных форумах оставались без ответа.
Однако, месяц-два назад в твиттере годота открыли специально ветку для предложений по движку. И я туда запилил свой фич-реквест. Типа, есть ли способ получить из меша с блендшейпами меш без блендшейпов, но нужного вида. Ведь на самом деле движок эту работу делает, когда выводит модель на экран. И там меня вдохновили попробовать поработать с вершинами и покопаться с мешем. Попробовал. Не так уж это и сложно. Получилось легко.
Был рад и горд собой, пока не попробовал замерить скорость. Я-то одну форму для примера рассчитывал, а в персонаже их 200... В итоге оказалось, что скорость никуда не годится. С оптимизациями 200 форм считались 33 секунды. Одна форма - 0.2 секунды. А изначальный план был таков - при добавлении на сцену персонаж генерится на лету в маленький меш без блендшейпов. Но если при добавлении на сцену персонаж считается 33 секунды, то сколько будут считаться 10? Да и все просто вырубят игру с такими загрузками.
Так что я полез искать другие варианты и меня вдохновили там же на гитхабе использовать подход в Симс4, где разницу между формами записывали в текстуру. А текстуры можно обрабатывать на видеокарте в шейдере! Я научился генерировать нужные текстуры. Научился их применять и загружать. Перешёл было к изучению шейдеров, но...
В процессе я пробовал крутить эти простенькие циклы и так и этак. Обычно условия цикла пишешь в виде функции, вроде
for i in range (len(array)). Я же начал писать:
var end = len(array)
for i in range (end)

Короче, заниматься совсем уж дебильными оптимизациями. Сразу скажу, что приведённая выше "оптимизация" - хуета.
Но из-за таких дебильных оптимизаций я натолкнулся на то, что действительно подняло скорость раз так в 50 (нехило, а?)
Если мы гоняем в цикле двухмерный массив, доступ к нему гдскрипт (подозреваю, что и питон) вычисляет довольно долго.
Но если мы сделаем временную переменную на строку массива и будем гонять уже одномерный массив, то всё станет значительно веселей. А если это был не массив, а словарь, то сделав временную переменную мы получим ещё больший выигрыш в скорости.
Этот код медленный:
var array = [][]
for i in range(len (array)):
.....for j in range (len (array[i])):
..........array[i][j] = func()
Этот код быстрый:
var array = [][]
for i in range (len (array)):
....var temp = array[i]
....for j in range(len (temp)):
........temp[j]= func()

Теперь одна форма у меня применяется за 20 мс (0.02 секунды), хотя иногда при тестах видел даже 5 мс. А все 200 применяются за 0.7 секунды. Вот такая дебильная, но эффективная оптимизация. Делай массивы одномерными, вытаскивай массивы из словарей. Ожидал ли я, что это даст такой эффект? Конечно, нет. Я в шоке.
Даже если загрузка уровня из-за 30 персонажей будет 30 секунд - это уже приемлемо.
Получив такое ускорение я уже не захотел парится с текстурами и шейдерами (там есть проблема с точностью). Пока пусть будет так.

Дальнейшие планы:
Интегрировать одежду и глаза с челюстью. Для них тоже нужны шейпкеи.
Продумать немножко архитектуру, чтобы было просто встроить в игру.
Попытаться запустить это в режиме Gles2. В самом редакторе работает, но в экспортированном исполняемом файле ошибки. Вообще GLES2 не поддерживает технологию шейпкеев, но я-то её и не использую. Я использую только работу с вершинами в ручном режиме.

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

Так-то сейчас один персонаж жрёт 700 кб видеопамяти, что более чем. 50 разных персонажей на экране потребляют 35 метров видеопамяти и просадок фпс ниже 60 нет. ЗомбиРаш!

2. О залёте с ФСБ.
Выяснилась причина блокировки аккаунта.
Есть у нас для работы одной программы удалённый сервер. Типа, заходишь через удалённый рабочий стол и работаешь там. Сделано, чтобы не нагружать старые Pentium3 на работе. Но локальная версия программы тоже есть. Вот только она иногда выпадает из домена. И приходится лезть, если дело срочное, за удалёнкой.
В общем, последний раз я этой удалёнкой пользовался год назад, если не больше. Она тогда зависла, звонить в Симферополь админам и просить ребутнуть мне было в лом и я просто забил на это дело. Осталось висеть.
Ну так вот, она очухалась. И давай спамить под старым паролем. Из-за чего меня и заблокировало. И блокировало ещё неделю (что забавно, в 10 часов вечера), пока админы не рубанули её. Теперь прекратилось. Скорее всего DameWare Remote Control - это как раз админы на мой комп заходили.
Остаётся невыясненным почему мне не удавалось добавить комментарии на ютуб. И да, как-то уж слишком совпало всё.

3. О везении Путина.
Сейчас мы наблюдаем, как демократы в очередной раз обосрались перед Трампом. Более того, это ударило по их же Байдену. Не сильно интересовался Байденом, однако сейчас нагуглил, что "дедушке из хорошей семьи" под 80 и он давно неоднократно уличён в старческом маразме. Добавьте к этому историю с шантажом Украины, чтобы прикрыть дела сынули. Короче, походу, история "с бабушкой из хорошей семьи" (старой клячей Клинтон) ничему демократов не научила. Но Байден пострадает от этого "импичмента" куда больше Трампа.

А теперь самое интересное. рейтинг Уоррен переплюнул Байдена. А Уоррен может и русофобка (сомневаюсь), но активно выступает за то, чтобы похоронить Пермиан и эту вашу сланцевую революцию. Она уже всем уши прожужала запретом фрекинга.
А теперь оцените везение Путина, если победит Уоррен.
1. В ближайшие годы, пока тема Украины и Крыма была актуальна, в США правил пророссийский Трамп, саботирующий реальные санкции.
2. Когда тема Крыма и Украины давно протухла (хохлы сами заявили о желании договориться посередине и отказались воевать за Родину, вот Трамп и послал Зеленского договариваться), к власти приходит Уоррен и делает нефть по 150. Заодно убирает американский газ и нефть из Европы (им самим без сланца мало будет). Многоходовочка!
И, глядя на фантастическую, не поддающуюся никакому рациональному объяснению, везуху плешивого ублюдка, скорее всего так и будет.

Так что я бы на месте русофобов болел бы за пророссийского Трампа. При нефти по 60 будущего у русских нет.

ЗЫ. Забавно было видеть рожу Зеленского, когда Трамп сказал, что ему самому надо договариваться с Путиным)) С другой стороны я думал Зеленский пророссийский засланец, а он просто ничтожество. Кто ж начинает торги за неньку словами "договоримся посередине?". Торги начинают с "своей земли вершка не отдадим". Тогда был бы шанс на границу по Днепру))
Subscribe

sergio_az

September 26 2019, 16:14:11 UTC 2 days ago Edited:  September 26 2019, 16:19:27 UTC

1. История с шантажом Украины присутствует только в твоем воображении. Уволить Шокина требовали все, работавшие тогда с Украиной.

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

3. Будет ли президентом Уоррен, хуоррен, байден, шмайден - сланцевая нефть это навсегда. Нету у ПОТУСа методов против фракинга. В худшем случае - потребует улучшить изоляцию стволов в водоносных горизонтах, что подымет цену нефти, может, на доллар. Все остальное - дурные конспираси теории.

lexpexkex

September 26 2019, 16:47:51 UTC 2 days ago Edited:  September 26 2019, 17:21:16 UTC

сланцевая нефть это навсегда.
В принципе согласен, деньги всегда побеждают, а это даже не деньги, это прибыль))
Остаётся вопрос, почему сланец только в США выстрелил.
сланцевая нефть это навсегда
Сланцевая нефть успешно добывается только в Пермиан.
И больше нигде во всём мире этот успех повторить не могут.
А Пермиан не бездонен.

sergio_az

2 days ago

lexpexkex

1 day ago

sergio_az

1 day ago

lexpexkex

1 day ago

меш в 100 Мб это сколько вершин/треугольников?

lexpexkex

September 26 2019, 17:40:09 UTC 2 days ago Edited:  September 26 2019, 17:40:30 UTC

16 тыщ.
Многовато, но модели Мейкхуман весьма качественные для своего веса. Да и для персонажа это нормально.
А 100 Мб - потому что в нём 200 форм.
Обычный 700 килобайт весит.
Именно за это и шла борьба всё это время, как своместить возможности иметь любую форму и весить при этом 700 килобайт.

jabelyipushisty

2 days ago

lexpexkex

2 days ago

jabelyipushisty

2 days ago

lexpexkex

2 days ago

jabelyipushisty

2 days ago

Всё-таки до выборов ещё больше года,многое может поменяться,к тому же кандидат демократов ещё не определён.
Ну а "воевать за Родину" сейчас для украинского государства-дело бесперспективное.На каких условиях команда Зеленского готова останавливать этот конфликт-вот что интересно.И удастся ли им это вообще.
Да вроде никто Зеленского спрашивать не собирается.
Не вижу от Путина энтузиазма. Сейчас время работает на него, Зеленский поездил по европам, по америкам, соснул хуйца с поддержкой и приедет без козырей. Сопротивляться своими силами он не готов. Так что Путин может смело начинать торг с середины. Потому он и не торопится. Никуда теперь клиент не денется.
По сути Зеленский примет любые условия. Всё зависит от того, не вызовет ли это майданутых волнений. Но я сомневаюсь. Майданы денежек требуют, а Порошенко Коломойский разденет и добьёт))

the_thing_2

2 days ago

lexpexkex

2 days ago

the_thing_2

2 days ago

lexpexkex

2 days ago

narzan18

1 day ago

narzan18

1 day ago

lexpexkex

1 day ago

lexpexkex

1 day ago

narzan18

1 day ago

lexpexkex

1 day ago

narzan18

1 day ago

lexpexkex

1 day ago

Никто этот конфликт останавливать не намерен - сказали же: будет второе "Приднестровье". Это было понятно ещё в 2016-м, когда КПВВ с украинской стороны начали переоборудовать под полноценные таможенные пункты. Раньше там были "вагончики", а сейчас полноценные таможенные пункты со всеми атрибутами и функциями. Так "времянки" не оборудуют, поэтому и выводы о заморозке - "надолго".

lexpexkex

2 days ago

flibusta_is

September 27 2019, 02:58:19 UTC 1 day ago Edited:  September 27 2019, 03:08:04 UTC

В итоге оказалось, что скорость никуда не годится. С оптимизациями 200 форм считались 33 секунды. Одна форма - 0.2 секунды.
...
Теперь одна форма у меня применяется за 20 мс (0.02 секунды)


Напомнило "Операция колибри", по мотивам книги "Flash Boys" и эпопеи бывшего программиста Goldman Sachs Алейникова с ФБР



Про комментарий на youtube, там у них наверняка стоит фильтр на определённые кейворды. Зачастую пишешь комментарий с матерными словами, заходишь с другого аккаунта, а этого коммента нет (со своего акка он попрежнему виден).
Удаляешь этот коммент, пишешь заново такой же, но без мата или заменяя часть букв латиницей, постишь и тот же самый комментарий уже появляется "для всех"
О, спасибо за наводку, надо будет посмотреть это кинцо.
А вообще для игр производительность всегда была критичной.

zapadenetz

September 27 2019, 06:02:30 UTC 1 day ago Edited:  September 27 2019, 06:27:11 UTC

lexpexkex
И, глядя на фантастическую, не поддающуюся никакому рациональному объяснению, везуху плешивого ублюдка, скорее всего так и будет.
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
Тоже давно над этим думаю. Фортуна ему усмехается. И сколько бы преступлений и афёр не совершил-как с гуся вода. Сатана ему помогает, не иначе.
По Донбассу. Боевые действия надо пробовать остановить, а конфликт замораживать. Реинтегрировать ни на каких условиях (и без условий тоже) никого никуда не надо-себе дороже. С 2015 года продолжаю утверждать, что Минские соглашения в существующем путинско-сурковском варианте (а других и нет) мы выполнять не будем.
Да, невероятно. Любого бы другого похоронила история с боингом. Зеленского на мировой арене похоронил мелкий скандал с Трампом. А этому всё пофиг. Даже пенсионная реформа сильно по рейтингу не ударила. Раньше путиноиды приуныли и больше молчали, а теперь снова лезут во все щели.

zapadenetz

1 day ago

lexpexkex

1 day ago

Альтернативы нынешнему мироустройству нет))
Русским вредны такие мультики. Надо забанить автора.
They liked it 0