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

  • Ну, если москали уберутся, то хорошо.

    Что тут ещё сказать? Война не радует. Учения закончены, если начнут возвращаться в Каспий и Сибирь, то ОК. Непонятно, правда, зачем такой переход из…

  • Настала пора выполнять предвыборные обещания.

    Кандидат в президенты Украины, шоумен Владимир Зеленский, лидирующий в предвыборной гонке, в интервью телеканалу «1+1» объяснил свои слова о…

  • О ВСУ.

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

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

  • 45 comments

  • Ну, если москали уберутся, то хорошо.

    Что тут ещё сказать? Война не радует. Учения закончены, если начнут возвращаться в Каспий и Сибирь, то ОК. Непонятно, правда, зачем такой переход из…

  • Настала пора выполнять предвыборные обещания.

    Кандидат в президенты Украины, шоумен Владимир Зеленский, лидирующий в предвыборной гонке, в интервью телеканалу «1+1» объяснил свои слова о…

  • О ВСУ.

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