Этот путь занял у меня полгода.
Начнём с технологии шейпкеев или блендшейпов, чтобы было понятно о чём я вообще говорю.
Игровая зд-модель называется мешем. Всё, что вы видите в играх - это меши с текстурами.Что такое меш? Меш содержит в себе информацию в всех вершинах, о том, какие вершины соединяются в полигоны, о 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 будущего у русских нет.
ЗЫ. Забавно было видеть рожу Зеленского, когда Трамп сказал, что ему самому надо договариваться с Путиным)) С другой стороны я думал Зеленский пророссийский засланец, а он просто ничтожество. Кто ж начинает торги за неньку словами "договоримся посередине?". Торги начинают с "своей земли вершка не отдадим". Тогда был бы шанс на границу по Днепру))
September 26 2019, 16:14:11 UTC 2 days ago Edited: September 26 2019, 16:19:27 UTC
2. Компанию, в которой работал сынишка, расследовали. Бухгалтера вздрючили. Налоги доплатили. Претензий к ней нет - хотя какое отношение член совета директоров может иметь к недоплаченным налогам, я хуйзнает.
3. Будет ли президентом Уоррен, хуоррен, байден, шмайден - сланцевая нефть это навсегда. Нету у ПОТУСа методов против фракинга. В худшем случае - потребует улучшить изоляцию стволов в водоносных горизонтах, что подымет цену нефти, может, на доллар. Все остальное - дурные конспираси теории.
September 26 2019, 16:47:51 UTC 2 days ago Edited: September 26 2019, 17:21:16 UTC
В принципе согласен, деньги всегда побеждают, а это даже не деньги, это прибыль))
Остаётся вопрос, почему сланец только в США выстрелил.
September 26 2019, 20:23:08 UTC 2 days ago
Сланцевая нефть успешно добывается только в Пермиан.
И больше нигде во всём мире этот успех повторить не могут.
А Пермиан не бездонен.
2 days ago
1 day ago
1 day ago
1 day ago
September 26 2019, 17:29:42 UTC 2 days ago
September 26 2019, 17:40:09 UTC 2 days ago Edited: September 26 2019, 17:40:30 UTC
Многовато, но модели Мейкхуман весьма качественные для своего веса. Да и для персонажа это нормально.
А 100 Мб - потому что в нём 200 форм.
Обычный 700 килобайт весит.
Именно за это и шла борьба всё это время, как своместить возможности иметь любую форму и весить при этом 700 килобайт.
2 days ago
2 days ago
2 days ago
2 days ago
2 days ago
September 26 2019, 18:10:24 UTC 2 days ago
Ну а "воевать за Родину" сейчас для украинского государства-дело бесперспективное.На каких условиях команда Зеленского готова останавливать этот конфликт-вот что интересно.И удастся ли им это вообще.
September 26 2019, 18:33:51 UTC 2 days ago
Не вижу от Путина энтузиазма. Сейчас время работает на него, Зеленский поездил по европам, по америкам, соснул хуйца с поддержкой и приедет без козырей. Сопротивляться своими силами он не готов. Так что Путин может смело начинать торг с середины. Потому он и не торопится. Никуда теперь клиент не денется.
По сути Зеленский примет любые условия. Всё зависит от того, не вызовет ли это майданутых волнений. Но я сомневаюсь. Майданы денежек требуют, а Порошенко Коломойский разденет и добьёт))
2 days ago
2 days ago
2 days ago
2 days ago
1 day ago
1 day ago
1 day ago
1 day ago
1 day ago
1 day ago
1 day ago
1 day ago
September 26 2019, 19:41:13 UTC 2 days ago
2 days ago
September 27 2019, 02:58:19 UTC 1 day ago Edited: September 27 2019, 03:08:04 UTC
...
Теперь одна форма у меня применяется за 20 мс (0.02 секунды)
Напомнило "Операция колибри", по мотивам книги "Flash Boys" и эпопеи бывшего программиста Goldman Sachs Алейникова с ФБР
Про комментарий на youtube, там у них наверняка стоит фильтр на определённые кейворды. Зачастую пишешь комментарий с матерными словами, заходишь с другого аккаунта, а этого коммента нет (со своего акка он попрежнему виден).
Удаляешь этот коммент, пишешь заново такой же, но без мата или заменяя часть букв латиницей, постишь и тот же самый комментарий уже появляется "для всех"
September 27 2019, 04:57:35 UTC 1 day ago
А вообще для игр производительность всегда была критичной.
September 27 2019, 06:02:30 UTC 1 day ago Edited: September 27 2019, 06:27:11 UTC
И, глядя на фантастическую, не поддающуюся никакому рациональному объяснению, везуху плешивого ублюдка, скорее всего так и будет.
----------------------------------------
Тоже давно над этим думаю. Фортуна ему усмехается. И сколько бы преступлений и афёр не совершил-как с гуся вода. Сатана ему помогает, не иначе.
По Донбассу. Боевые действия надо пробовать остановить, а конфликт замораживать. Реинтегрировать ни на каких условиях (и без условий тоже) никого никуда не надо-себе дороже. С 2015 года продолжаю утверждать, что Минские соглашения в существующем путинско-сурковском варианте (а других и нет) мы выполнять не будем.
September 27 2019, 09:16:26 UTC 1 day ago
1 day ago
1 day ago
September 27 2019, 10:24:20 UTC 1 day ago
September 27 2019, 12:57:29 UTC 1 day ago
September 27 2019, 14:13:46 UTC 1 day ago