Создание World of Tanks Blitz на базе собственного движка DAVA

Создание World of Tanks Blitz на базе собственного движка DAVA World of Tanks
Содержание
  1. Балансировщик на основе имитации отжига
  2. Почему я ненавижу world of tanks blitz?
  3. World of tanks blitz выдает ошибку об отсутствии dll-файла. решение
  4. World of tanks blitz зависает. картинка застывает. решение
  5. World of tanks blitz не запускается. ошибка при запуске. решение
  6. World of tanks blitz тормозит. низкий fps. просадки частоты кадров. решение
  7. World of tanks blitz, скачанная с торрента не работает. решение
  8. Wot blitz
  9. Балансировщик формирующий пары игроков
  10. Больше танков с рангами! | новости wot blitz | black wot blitz
  11. В wot blitz не работает управление. world of tanks blitz не видит мышь, клавиатуру или геймпад. решение
  12. Всем доброго времени суток!
  13. Гайд по премиумному танку somua sm в world of tanks blitz. обзор характеристик, преимуществ и тактик игры | bluestacks
  14. Комбинирование компонентного и data-driven-подхода
  15. Новая архитектура
  16. Первые шаги по улучшению ситуации
  17. Подвисания при попаданиях, засветах, рикошетах
  18. Пролог
  19. Реализация радиального отображения прогресса
  20. Рейтинговая система
  21. Требования

Балансировщик на основе имитации отжига

В конечном варианте мы остановились на балансировщике, который работает по следующему алгоритму. Все игроки, которые нажимают кнопку «В бой», попадают в общую очередь. Балансировщик в бесконечном цикле делает следующее:

Для формирования команд из списка подходящих игроков используется метод имитации отжига. Подробнее про сам метод можно почитать

Создание World of Tanks Blitz на базе собственного движка DAVA
Поиск глобального максимума методом имитации отжига

В контексте применения к формированию команд алгоритм следующий:

Основное преимущество данного подхода: для добавления новых требований достаточно модифицировать оценочную функцию. Нет необходимости писать код, который будет описывать, как именно получить то, что мы хотим. Достаточно добавить правило, которое смотрит на сформированную команду и говорит, хорошо ли она сбалансирована или нет.

Хороший пример добавления таких правил — рейтинговые бои. В рейтинговых боях в матчмейкере появилось сразу несколько новых правил:

Создание World of Tanks Blitz на базе собственного движка DAVAПример профиля игрока из бриллиантовой лиги

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

Недостаток данного подхода — медленная скорость работы. По сравнению с предыдущим вариантом, текущий стал работать приблизительно в 10 раз медленней, даже несмотря на ряд оптимизаций. Кстати, про оптимизации. Большая часть сервера (кроме сети и физики) для игры написана на Python.

Балансировщик был переписан на C и распараллелен на много потоков. Из Python в плюсовый код прилетает запрос на формирования команды. Далее каждый из потоков независимо стартует метод отжига. Как только какой-то поток находит решение, остальные потоки останавливают процесс поиска, и найденное решение возвращается в Python.

Создание World of Tanks Blitz на базе собственного движка DAVA
Время ожидания и размер очереди на RU сервере (5 секунд в обычных боях и 10 в рейтинговых)

По мере роста онлайна росла и нагрузка на балансировщик. Этой осенью, когда онлайн на RU сервере добрался до 120 тысяч (во время ивента Mad Games), балансировщик перестал справляться. В качестве временной меры мы отключили часть правил, это позволило уменьшить нагрузку. Чтобы избежать подобных проблем в будущем мы сделали матчмейкер распределённым.

Почему я ненавижу world of tanks blitz?

Доброго времени суток всем мимо проходящим. В этом посте я хотел бы затронуть такую тему,как вы могли понять из названия,почему я ненавижу Wot Blitz. Помимо меня у этой игры огромное количество хейтеров,не без основательно разумеется. Но у всех людей взгляд на картошку разный,и причины по которым они могут не любить картофель тоже разные. В этом же посте я приведу свои доводы и объясню,почему именно я ненавижу картофан. Начну с блица,далее сделаю пост и про ББ. И хотя там проблемы во многих аспектах идентичные,все же есть то,что эти игры различает с точки зрения проблем. Ладно,не буду более тянуть кота за хвост,поехали.

И первая причина по которой я презираю эту игру является нерф песка в целом и песочных премов. Да-да,вы не ослышались,нерф премов. Если вспомнить,что говорили варгеи косательно политики нерфа-то про премы они говорили всегда так:”мы не нерфим премы и можем их только апать,так как нерф противоречит логике и не имеет на то оснований,т.к они всегда по характеристикам немного хуже чем прокачиваемые аналоги. Независимо от того,какого уровня прем,мы его никогда нерфить не будем. Что произошло по итогу? Взяли и превратили премы песочного уровня в коллекционные,все,без исключения. Что здесь такого? Спросите вы. А то,что все эти коллекционные танки получили убогие,порезанные характеристики и стали похожи друг на друга как две капли воды. Приведу вам пример. У меня в ангаре был и есть по сей день песочный танк тетрарх,ранее достаточно имбовый на своём уровне. Вытаскивал благодаря своему хорошему дпму на уровне,неплохой точностью и пробитием. КД у него была до нерфа 3.8 секунд,после того как картофельные уроды дали ему статус коллекционного у него КД стала 4.6 при альфе в 40 едениц. Разницу чувствуете? И такое они провернули со всеми песочными ПРЕМИУМНЫМИ танками. Теперь в песке совершенно нечего ловить и нагибать там теперь некого. А все потому,что варгеи сделали абсолютно все танки одинаковыми,не отличающиеся друг от друга ничем. О чем это говорит? Первое-о лицемерии картофана касательно политики нерфа премов. Второе-о неуважении к своей аудитории,в том числе и той,которую они кормят внося деньги в их убогую игру. А знаете в чем еще кроется их наглость? В том,что эти зажравшиеся,лицемерные ублюдки имеют наглость продавать этот занерфленный коллекционный шлак за деньги,при этом имея возможность нерфить их. Почему? Потому что как они сами говорили,коллекционная техника может как и апаться,так и спокойно нерфиться. Однако,в свете последних лет,я никаких апов этой техники не замечал,а вот нерфы да,и еще как.

Переходим ко второму пункту. Он опять же касается песка. Вывод танков первого уровня,участвовавших в Первой Мировой войне,таких как:МС-1,Т1,LTracktor,FT-17 и.т.д.

Как они говорили сами про эти танки,цитирую:рухлядь в нашей игре не нужна,мы ее выводим на современный уровень. После того,как я услышал это из их познанных ртов,я офигел от них еще больше,чем от первого приведенного мною пункта. Мало того что эти уроды не уважают своих игроков,так они еще и не уважают историю,эти танки-это мировая история,а эти простите,у*бки прямо называют эти танки рухлядью. Я не понимаю,кто вообще воспитывал этих людей,чтобы так относится к старым танкам,воюя на которых,люди пролили не мало крови,точно так же как и во Второй Мировой. Кто вас вообще воспитывал? Вы конченные уроды. Этих уродов самих бы отправить на поле Первой Мировой войны и посадить бы за эту “рухлядь” тогда бы я посмотрел,на то,как запели бы эти никого не уважающие животные.

Третий пункт ко которой я ненавижу эту игру-это введение несуществовавших никогда танков:Хельсинг,Дракула,Виндикатор,Предатор,Могильщик. Вот уважения к истории у них ноль,но зато никогда не существовавшее го*но они активно засовывают в игру. Так еще и эти “танки” в рандоме превосходят все остальные танки имея неимоверно заоблачные ТТХ на фоне всех остальных машин.

Четвертый пункт-продажа коробок из которых не выпадает ничего кроме убогих бустеров. И хотя заявлено-что из них могут и выпасть танки,они не выпадают никогда. Сделано это специально по принципу казино. Чтобы вы бесконечно вливали деньги в эти коробки,и вам постоянно выпадало различное дерьмо в виде бустеров,либо незначительного количества кредитов. Да,формально вероятность выпадения танка присутствует. Но она настолько мала,что я скорее больше поверю в то,что белоголовый орлан сможет стать президентом Америки.

Пятый пункт-продажа танков за баснословные деньги. Эх,помню те времена,когда танк 6 уровня можно было купить за 500 рублей,так еще и плюс ко всему это оказывался очень неплохой,вполне могущий в боях агрегат. Сейчас минимальная цена на подобного рода танки составляет около 1500 рублей,не говоря уже о танках более высокого уровня,там цены могут переваливать и за 3000. Если бы варгеи хоть как-то бы думали о игроках,я бы без проблем им заплатил бы за подобного рода цену танк. Но поскольку они все больше и больше загоняют игру в бездну,больше себя доить им я не позволю.

Шестой пункт-однообразие карт. Играя в эту игру в современных реалиях,будьте готовы к тому,что вам будет выпадать одна и та же карта на протяжении боев 5. Я не знаю,какая пьянь у них сидит в отделе баланса карт,но сам факт в том что и такой косяк за варгеями замечен. Однако года 3-4 назад такого и близко не замечалось.

Седьмой пункт-баланс команд. С этого наверное и следовало начинать. Будьте готовы к тому, что вас будет кидать к очень очень слабым игрокам,которые будут сливать бои быстрее,чем скорость звука,в то время как в противоположенной команде будут играть статисты и нормально играющие игроки. Ранее этого не замечалось,так как хорошо играющих игроков было больше,поскольку тогда руководство игры было другим. Прежнее руководство думало об игроках. Им никогда бы не пришла в голову мысль превращать премиумные песочные танки в занерфленные коллекционные,пихать в ящики убогие бустеры и аватары и уж тем более называть танки первой мирровой “рухлядью”

Ну и восьмой пункт по которому я ненавижу эту игру-это то,что она затягивает. Да,в нее невозможно играть не испортив себе настроение. Но когда появляется желание пострелять,пофармить и надежда  понагибать ты идёшь в нее,поскольку других годных аналогов конкурентов на данный момент нет. Хотя в последнее время я стараюсь не играть в эту помойку. А если вдруг и захожу-то тут же выхожу обратно,ибо пердак от вышеописанных пунктов сгорает и меня хватает всего лишь на 2-3 боя.

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

P.s ахахахах,какие же вы тупые) мне от ваших минусов не горячо,ни холодно. Наоборот,вы мне настроение поднимете. Давайте,бомбите еще,защитнички варгеев)🤣🤣🤣

World of tanks blitz выдает ошибку об отсутствии dll-файла. решение

Как правило, проблемы, связанные с отсутствием DLL-библиотек, возникают при запуске WOT Blitz, однако иногда игра может обращаться к определенным DLL в процессе и, не найдя их, вылетать самым наглым образом.

Чтобы исправить эту ошибку, нужно найти необходимую библиотеку DLL и установить ее в систему. Проще всего сделать это с помощью программы DLL-fixer, которая сканирует систему и помогает быстро найти недостающие библиотеки.

Если ваша проблема оказалась более специфической или же способ, изложенный в данной статье, не помог, то вы можете спросить у других пользователей в нашей рубрике «Вопросы и ответы». Они оперативно помогут вам!

Благодарим за внимание!

World of tanks blitz зависает. картинка застывает. решение

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

Так что если картинка в World of Tanks Blitz застывает, то воспользуйтесь программами для вывода статистики по загрузке комплектующих. Быть может, ваша видеокарта уже давно исчерпала свой рабочий ресурс или процессор греется до опасных температур?Проверить загрузку и температуры для видеокарты и процессоров проще всего в программе

. При желании можно даже выводить эти и многие другие параметры поверх картинки World of Tanks Blitz.Какие температуры опасны? Процессоры и видеокарты имеют разные рабочие температуры. У видеокарт они обычно составляют 60-80 градусов по Цельсию. У процессоров немного ниже — 40-70 градусов.

Про WoT:  Статистика по клану , WOT Blitz Stats

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

World of tanks blitz не запускается. ошибка при запуске. решение

World of Tanks Blitz установилась, но попросту отказывается работать. Как быть?

Выдает ли World of Tanks Blitz какую-нибудь ошибку после вылета? Если да, то какой у нее текст? Возможно, она не поддерживает вашу видеокарту или какое-то другое оборудование? Или ей не хватает оперативной памяти?

Помните, что разработчики сами заинтересованы в том, чтобы встроить в игры систему описания ошибки при сбое. Им это нужно, чтобы понять, почему их проект не запускается при тестировании.

Обязательно запишите текст ошибки. Если вы не владеете иностранным языком, то обратитесь на официальный форум разработчиков World of Tanks Blitz. Также будет полезно заглянуть в крупные игровые сообщества и, конечно, в наш FAQ.

Если World of Tanks Blitz не запускается, мы рекомендуем вам попробовать отключить ваш антивирус или поставить игру в исключения антивируса, а также еще раз проверить соответствие системным требованиям и если что-то из вашей сборки не соответствует, то по возможности улучшить свой ПК, докупив более мощные комплектующие.

World of tanks blitz тормозит. низкий fps. просадки частоты кадров. решение

При тормозах и низкой частоте кадров в WOT Blitz первым делом стоит снизить настройки графики. Разумеется, их много, поэтому прежде чем снижать все подряд, стоит узнать, как именно те или иные настройки влияют на производительность.

Разрешение экрана

. Если кратко, то это количество точек, из которого складывается картинка игры. Чем больше разрешение, тем выше нагрузка на видеокарту. Впрочем, повышение нагрузки незначительное, поэтому снижать разрешение экрана следует только в самую последнюю очередь, когда все остальное уже не помогает.

Качество текстур

. Как правило, этот параметр определяет разрешение файлов текстур. Снизить качество текстур следует в случае если видеокарта обладает небольшим запасом видеопамяти (меньше 4 ГБ) или если используется очень старый жесткий диск, скорость оборотов шпинделя у которого меньше 7200.

Качество моделей

(иногда просто детализация). Эта настройка определяет, какой набор 3D-моделей будет использоваться в игре. Чем выше качество, тем больше полигонов. Соответственно, высокополигональные модели требуют большей вычислительной мощности видекарты (не путать с объемом видеопамяти!), а значит снижать этот параметр следует на видеокартах с низкой частотой ядра или памяти.

Тени

. Бывают реализованы по-разному. В одних играх тени создаются динамически, то есть они просчитываются в реальном времени в каждую секунду игры. Такие динамические тени загружают и процессор, и видеокарту. В целях оптимизации разработчики часто отказываются от полноценного рендера и добавляют в игру пре-рендер теней.

  • Разрешение теней — определяет, насколько детальной будет тень, отбрасываемая объектом. Если в игре динамические тени, то загружает ядро видеокарты, а если используется заранее созданный рендер, то «ест» видеопамять.
  • Мягкие тени — сглаживание неровностей на самих тенях, обычно эта опция дается вместе с динамическими тенями. Вне зависимости от типа теней нагружает видеокарту в реальном времени.

Сглаживание

. Позволяет избавиться от некрасивых углов на краях объектов за счет использования специального алгоритма, суть которого обычно сводится к тому, чтобы генерировать сразу несколько изображений и сопоставлять их, высчитывая наиболее «гладкую» картинку.

Существует много разных алгоритмов сглаживания, которые отличаются по уровню влияния на быстродействие World of Tanks Blitz.Например, MSAA работает «в лоб», создавая сразу 2, 4 или 8 рендеров, поэтому частота кадров снижается соответственно в 2, 4 или 8 раз.

Освещение

. Как и в случае со сглаживанием, существуют разные алгоритмы эффектов освещения: SSAO, HBAO, HDAO. Все они используют ресурсы видеокарты, но делают это по-разному в зависимости от самой видеокарты. Дело в том, что алгоритм HBAO продвигался в основном на видеокартах от Nvidia (линейка GeForce), поэтому лучше всего работает именно на «зеленых».

HDAO же, наоборот, оптимизирован под видеокарты от AMD. SSAO — это наиболее простой тип освещения, он потребляет меньше всего ресурсов, поэтому в случае тормозов в WOT Blitz стоит переключиться него.Что снижать в первую очередь? Как правило, наибольшую нагрузку вызывают тени, сглаживание и эффекты освещения, так что лучше начать именно с них.

Один из них —

. Она сделана специально для тех, кто не хочет вручную вычищать компьютер от разных временных файлов, удалять ненужные записи реестра и редактировать список автозагрузки. Advanced System Optimizer сама сделает это, а также проанализирует компьютер, чтобы выявить, как можно улучшить производительность в приложениях и играх.

World of tanks blitz, скачанная с торрента не работает. решение

Если дистрибутив игры был загружен через торрент, то никаких гарантий работы быть в принципе не может. Торренты и репаки практически никогда не обновляются через официальные приложения и не работают по сети, потому что по ходу взлома хакеры вырезают из игр все сетевые функции, которые часто используются для проверки лицензии.

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

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

, дающий доступ к компьютеру третьим лицам. Тут никаких гарантий нет и быть не может.К тому же использование пиратских версий — это, по мнению нашего издания, воровство. Разработчики потратили много времени на создание игры, вкладывали свои собственные средства в надежде на то, что их детище окупится.

лицензионную копию игры. Это не только убережет от сомнительного ПО, но и позволит скачивать обновления для игры и получать официальную поддержку от ее создателей.

Wot blitz

А вот тут уже полный порядок. Бои 7 на 7, карты по размеру небольшие, но для 7 танков — то что нужно. И, что примечательно — всего 3 карты из оригинальной игры, остальные — новые! Всего карт 16, но вариативность игры на них присутствует. Никогда не знаешь, куда поедут союзники, да и ты сам волен выбирать свое направление. Все карты очень сбалансированы, для каждой карты есть свои «рыбные» места. В общем — полная свобода.

Самое важное — в Blitz нет артиллерии как класса, и это самое большое преимущество перед оригинальной игрой. Оставшиеся 4 класса были перебалансированы и играются в полной гармонии, но об этом ниже. 

Из особенностей геймплея — очень удобный прицел с показателем брони врага, перезарядка (90с) всех расходников вов ремя боя, специальные слоты для доп. расходников типа доппайка (снаряжение) и для амуниции. Очень порадовала новая система с экипажем: для всех танкой он общий. Купил новый танк — учишь экипаж на нем кататься, а навыки не теряются.

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

Сам геймплей можно оценить как активный, вариативный и интересный. И потанковать можно, и покрутить ТТ и ПТ, и издали пострелять. В общем я оцениваю геймплей в 4.5 из 5 баллов. Минус сделал за то, что (по какой-то причине) прицел в снайперском режиме какой-то ватный немного, и ощущение будто башня едва вращается, и еще неудобство — это интерфейс в ангаре. Не все нравится, надеюсь, что оптимизируют.

Балансировщик формирующий пары игроков

Изначально в мобильных танках использовался балансировщик, доставшийся ему от большого брата — танков десктопных. В целом он работал довольно хорошо, но у него было несколько проблем: во-первых, он не давал чётких гарантий по удовлетворению поставленных требований; во-вторых, добавить новые требования было довольно сложно.

Создание World of Tanks Blitz на базе собственного движка DAVA
Начало боя

Поэтому был написан другой балансировщик, который работал по следующему алгоритму:


Получившийся балансировщик работал быстрее прошлой версии в 5-10 раз и изначально собирал команды, которые соответствовали всем имеющимся на тот момент требованиям. Новые правила добавлялись путём написания дополнительных проходов перебалансировки.

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

Создание World of Tanks Blitz на базе собственного движка DAVA
Баг в матчмейкере — собралась команда 9 на 9

Больше танков с рангами! | новости wot blitz | black wot blitz

Создание World of Tanks Blitz на базе собственного движка DAVA

Ещё на восьми танках можно качать ранги. Узнай, на каких!

Возможность прокачивать ранг открылась ещё на нескольких машинах! Теперь с помощью рангов продемонстрировать свой богатый опыт игры можно на:

VIIICaernarvon Action X
VIIICaernarvon
VIIIT34*
VIIIT34 (1776)*

VIIIT26E5
VIIIChieftain/T95
VIIIT54E2
VIIIVK 45.02 (P) Ausf. A

Уже сейчас при выборе этих танков в карусели ты увидишь уведомление, что на них доступны ранги.

Создание World of Tanks Blitz на базе собственного движка DAVA

Переходи в меню, получай первый ранг и повышай его дальше!

Сегодня ранги открываются для танков, которые появились в игре уже достаточно давно. Это значит, что у многих игроков на них проведены десятки или даже сотни боёв. Но качать ранг с нуля на таких танках не придётся!

При открытии доступа к рангам «старый» танк получит прогресс, который будет рассчитан путём умножения среднего опыта этого танка на количество боёв на нём. Полученный результат будет дополнительно умножен на специальный коэффициент 1,8.

Этот коэффициент нужен, чтобы засчитать танку различные бонусы к опыту и игру во временных режимах, которые не учитываются в статистике. Таким образом машина получит прогресс ранга, максимально близкий к реальному, однако из-за технических ограничений окончательный подсчёт будет приблизительным.

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

Прокачивай ранг на любимом танке. И пусть все видят, что ты знаешь этот танк лучше, чем свои пять пальцев!


В wot blitz не работает управление. world of tanks blitz не видит мышь, клавиатуру или геймпад. решение

Как играть, если невозможно управлять процессом? Проблемы поддержки специфических устройств тут неуместны, ведь речь идет о привычных девайсах — клавиатуре, мыши и контроллере.Таким образом, ошибки в самой игре практически исключены, почти всегда проблема на стороне пользователя.

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

Таким образом, нужно узнать точную модель устройства и постараться найти именно ее драйвер. Часто с устройствами от известных геймерских брендов идут собственные комплекты ПО, так как стандартный драйвер Windows банально не может обеспечить правильную работу всех функций того или иного устройства.Если искать драйверы для всех устройств по отдельности не хочется, то можно воспользоваться программой

Про WoT:  “Ваш аккаунт заблокирован” Причина: использование запрещенных модификаций как разблокировать?

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

. Антивирус зарекомендовал себя с наилучшей стороны и получили одобрение миллионов пользователей по всему миру. ZoneAlarm подходит как для личного использования, так и для малого бизнеса, способен защитить компьютер с операционной системой Windows 10, Windows 8, Windows 7, Windows Vista и Windows XP от любых атак: фишинговых, вирусов, вредоносных программ, шпионских программ и других кибер угроз. Новым пользователям предоставляется

.Nod32 — анитивирус от компании ESET, которая была удостоена многих наград за вклад в развитие безопасности. На сайте разработчика доступны версии анивирусных программ как для ПК, так и для мобильных устройств, предоставляется

. Есть специальные условия для бизнеса.

Всем доброго времени суток!

В связи с недавней радостной новостью о том, что WoT Blitz вышла на ПК (правда, только для Win10), я решил провести наглядное сравнение нашей классической версии игры WoT с Blitz’ом, а так же обсудить обе игры и их игровые проблеми. Для начала выскажу свое мнение об обоих играх.

Обычные «картошечные» танки мне не нравятся. Эта игра портит нервы и не приносит удовольствия. Поскольку мне невмоготу самому исследовать и покупать все танки в игре (по причине отсутствия баланса и наличия таких кактусов в ветках исследований, что плакать хочется), я играл на тесте версии 9.15.

Эта версия — небольшой прорыв в хорошую сторону, ибо изменения в нем все положительны (за исключением нерва обл.54), и я надеюсь, что дальнейшие патчи будут только лучше. Но, что печально — основные игровые проблемы 9.15 не решает. Где обещанный нерф арты? Где ап кактусных танков типа М5 Стюарт, М7, АМХ40?

После прогона на тесте тех танков, к которым у меня лежала душа (вроде STB-1, T-62A, RU251, jdPzE100), я понял, что лучше я забуду про эту игру до лучших времен. 

Теперь по поводу порта Wot Blitz на ПК — это просто превосходно! 

Мне в этой игре нравится абсолютно все. Есть мелочи, которые раздражают, но в основном игра просто зачуденная! И баланс есть, и стартовый бонус, и новые карты. Расхваливать игру я могу очень долго, но словами сыт не будешь. Так что если у вас стоит Win10, заходите в магазин и бесплатно качайте WoT Blitz. Не пожалеете.

Сравнение игр будет по всем критериям, несмотря на то, что WoT Blitz — это порт мобильной игры на ПК. Оценивать каждую игру по критериям я буду по свой 5ти балльной шкале, после чего я составлю таблицу плюсои и минусов для каждой игры. 

Гайд по премиумному танку somua sm в world of tanks blitz. обзор характеристик, преимуществ и тактик игры | bluestacks

Комбинирование компонентного и data-driven-подхода

Решением этой проблемы стал компонентный подход, комбинированный c data-driven подходом. Дальше по тексту я буду употреблять data-driven-подход, так как не нашел удачного перевода.

Вообще понимание компонентного подхода у многих людей самое разное. То же — и с data-driven.

В моем понимании, компонентный подход — это когда некая необходимая функциональность строится на основе независимых компонентов. Самый простой пример — это электроника. Есть чипы, у каждого чипа есть входы и выходы. Если чипы подходят друг к другу, их можно соединить.

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

Что же такое data-driven. В моем понимании, это подход к проектированию программного обеспечения, когда за основу потока выполнения программы берутся данные, а не логика.

На нашем примере представим следующую иерархию классов:

class SceneNode
{
     // Данные отвечающие за иерархические трансформации
     Matrix4 localTransform;
     Matrix4 worldTransform; 
     
     virtual void Update();
     virtual void Draw();     

     Vector<SceneNode*> children;
}

class LodNode
{
     // Данные cпецифичные для вычисления лодов
     LodDistance lods[4];

     virtual void Update(); // переопределен метод Update, для того чтобы в момент переключения лодов, включать или выключать какие-то из его чайлдов
     virtual void Draw(); // рисуем только текущий активный лод
};

class MeshNode
{
     RenderMesh * mesh; 

     virtual void Draw(); // рисуем меш
};

Код обхода этой иерархии иерархически выглядит так:

Main Loop:
rootNode->Update();
rootNode->Draw(); 

В данной иерархии C наследования мы имеем три различных независимых потока данных:

Ноды лишь объединяют их в иерархию, однако важно понимать, что обработку каждого потока данных лучше производить последовательно. Практическая необходимость обработки по иерархии нужна только трансформациям.

Давайте представим, как это должно выглядеть в data-driven подходе. Напишу на псевдокоде, чтобы была понятна идея:

// Transform Data Loop:
for (each localTransform in localTransformArray)
{
     worldTransform = parent->worldTransform * localTransform;
}

// Lod Data Loop:
for (each lod in lodArray)
{
     // calculate lod distance and find nearest lod
     nearestRenderObject = GetNearestRenderObject(lod);
     renderObjectIndex = GetLodObjectRenderObjectIndex(lod);
     renderObjectArray[renderObjectIndex] = renderObject;
}

// Mesh Render Data Loop:
for (each renderObject in renderObjectArray)
{
     RenderMesh(renderObject);
}

По сути, мы развернули циклы работы программы, сделав это таким образом, чтобы все отталкивалось от данных.

Данные в data-driven подходе являются ключевым элементом программы. Логика — лишь механизмы обработки данных.

Новая архитектура

В какой-то момент стало понятно, что надо идти в сторону Entity-based подхода к организации сцены, где Entity являлась сущностью, состоящей из многих независимых компонентов. Хотелось, чтобы компоненты были полностью произвольными и легко комбинировались между собой.

Читая информацию по этой теме, я наткнулся на блог T-Machine.

Он мне дал множество ответов, на мои вопросы, однако основным ответом было следующее:

• Entity не содержит никакой логики, это просто ID (или указатель).• Entity знает только ID компоненты, которые ей принадлежат (или указатель).• Компонент — это только данные, то есть. компонент не содержит никакой логики.• Система — это код, который умеет обрабатывать определенный набор данных и выдавать на выходе другой набор данных.

Когда я понял это, в процессе дальнейшего изучения различной информации наткнулся на Artemis Framework и увидел хорошую реализацию этого подхода.

Если вы разрабатываете на Java, то очень рекомендую посмотреть на него. Очень простой и концептуально правильный Framework. На сегодняшний день он спортирован на кучу языков.

То, чем является Artemis, сегодня называют ECS (Entity, Component, System). Вариантов организации сцены на базе Entity, компонентов и data-driven достаточно много, однако мы по итогу пришли к архитектуре ECS. Сложно сказать, насколько это общепринятый термин, однако ECS значит, что есть следующие сущности: Entity, Component, System.

Самое главное отличие от других подходов это: Обязательное отсутствие логики поведения в компонентах, и отделение кода в системы.

Этот пункт очень важен в “православном” компонентном подходе. Если нарушить первый принцип, появится очень много соблазнов. Один из первых — сделать наследование компонентов.

Несмотря на гибкость, заканчивается обычно макаронами.

Изначально кажется, что при таком подходе можно будет сделать множество компонентов, которые ведут себя похожим образом, но чуть-чуть по-разному. Общие интерфейсы компонентов. В общем, можно опять свалиться в ловушку наследования. Да, это будет чуть лучше, чем классическое наследование, однако постарайтесь не попасть в эту ловушку.

ECS — более чистый подход, и решает больше проблем.

Чтобы посмотреть на примере, как это работает в Artemis, можете глянуть вот тут.

Я на примере покажу, как это работает у нас.

Главным классом контейнером является Entity. Это класс, который содержит массив компонентов.

Вторым классом является Component. В нашем случае, это просто данные.

Вот список компонентов, используемых у нас в движке, на сегодняшний день:

Первые шаги по улучшению ситуации


Для начала мы решили полечить проблемы с производительностью и сделать это быстро.

Собственно, сделали мы это, введя дополнительный флаг NEED_UPDATE в каждой ноде. Он определял, нужно ли такой ноде вызывать Update. Это действительно повысило производительность, но создало целый ворох проблем. Фактически код функции Update выглядел вот так:

void SceneNode::Update(float timeElapsed)
{
     if (!(flags & NEED_UPDATE))return; 
     
     // the rest of the update function

     // process children
}

Это вернуло нам часть производительности, однако началось много логических проблем там, где их не ждали.

LodNode, и SwitchNode — ноды, отвечающие, соответственно, за переключение лодов (по расстоянию) и переключение объектов (например, разрушенных и неразрушенных) — начали регулярно ломаться.

Периодически тот, кто пытался исправить поломки, делал следующее: отключал NEED_UPDATE в базовом классе (ведь это было простое решение), и совершенно незаметно FPS опять падал.

Когда код, проверяющий флаг NEED_UPDATE, был закомментирован раза три, мы, решились на радикальные перемены. Мы понимали, что сделать все сразу у нас не получится, поэтому решили действовать поэтапно.

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

Подвисания при попаданиях, засветах, рикошетах

Господа, на оффоруме в техразделе решения не нашел, памажите.
С месяц уже игра замирает на секунду-пол при выстрелах в моем поле видимости и еще при некоторых событиях, видимо, все отследить сложно.
Началось само по себе, новые моды не ставил. Разве что неосознанно. 🙂
Не одна дуэль уже так слита, да и вообще напрягает.
В соответствующей теме проблема описана не раз, но реакции от разработчиков нет — они там просто статистику собирают, видимо.

Проблемы с хардом (у мня нвоый ssd)?
С оперативкой (16ГБ)?
Виндой (8 про)?
С пингом (стабильно 30-40, плоттер не показывает проблем на нескольих минутах, а баг постоянный)?
Все-таки моды (не помню, чтобы ставил новые)?
Меня не любит Серб?

Upd: А вот flash точно обновлялся… там же весь интерфейс на нем написан.

Пролог

Эта история началась более трех лет назад. Наша небольшая компания DAVA стала частью Wargaming, и мы начали обдумывать, какие проекты делать дальше. Чтобы напомнить, каким был мобайл три года назад, скажу, что тогда не было ни Clash Of Clans, ни Puzzle &

Изначально всем казалось, что очень хорошей идеей будет сделать несколько мелких игр, которые бы привлекали новых пользователей в большие «танки». После ряда экспериментов оказалось, что это не работает. Несмотря на отличные конверсии в мобильных приложениях, переход от мобильного телефона к PC оказывался пропастью для пользователей.

Тогда в разработке у нас находилось несколько игр. Одна из них носила рабочее название «Sniper». Основной геймплей-идеей была стрельба в снайперском режиме из стоящего в обороне танка, по другим танкам, которыми управлял AI и которые могли атаковать в ответ.

В какой-то момент нам показалось, что стоящий танк — это очень скучно, и за неделю мы сделали прототип мультиплеера, где танки уже могли ездить и атаковать друг друга.

С этого все и началось!

Когда мы начинали разработку “Снайпера”, то рассматривали технологии, которые тогда были доступны для мобильных платформ. На тот момент Unity был еще на достаточно ранней стадии своего развития: по сути, необходимых нам технологий еще не было.

Про WoT:  Что делать, если World of Tanks не запускается

Основной вещью, которой нам не хватало, был рендеринг ландшафта c динамической детализацией, что является жизненно необходимым для создания игры с открытыми пространствами. Было несколько сторонних библиотек для Unity, однако их качество оставляло желать лучшего.

Также мы понимали, что на C# мы не сможем выжать максимум из устройств, под которые мы разрабатываем, и всегда будем ограничены. Unreal Engine 3 тоже не подходил по ряду похожих причин.

В итоге, мы решили дорабатывать свой движок! Он на тот момент уже использовался в наших предыдущих казуальных проектах. Движок имел достаточно хорошо написанный низкий уровень работы с платформами и поддерживал iOS, PC, Mac, плюс были начаты работы по Android.

Что у нас было в 3D-части движка:


В общем, если говорить о функциональности серьезного современного движка, в нем было очень мало.

Реализация радиального отображения прогресса

Иногда бывают ситуации, когда нужно показать радиальный прогресс, т.е. круг, который заполняется на 360 градусов, когда прогресс какой-либо операции завершился на 100%. В нашей игре World of Tanks Blitz такое используется, например, в отображении прогресса закачки DLC на андроидах.

Чтобы создать такую кнопку у нас уже есть часть готового функционала, а именно:

Чего не хватает, так это радиального раскрашивания определенного сектора с указанной дугой по принципу часовой стрелки. Для этого мы создали еще одну компоненту, которая хранит процент радиальной заливки как раз для таких случаев: RadialProgressComponent.

Теперь пойдем по шагам того, как такое можно реализовать.

Во-первых, мы берем картинку для прогресса:

Она белая и имеет прозрачный фон. Нам понадобится два контрола с этой же картинкой: один будет служить фоном, а второй мы зальем желтым цветом (саму картинку) и будем «резать» пропорционально нашему прогрессу. 

Мы создаем контрол и добавляем на него texture-компоненту с указанием данной картинки и белого цвета заливки.

Получилось так:

Далее мы добавляем еще один контрол сверху, ему добавляем такую же texture-компоненту с тем же путем к картинке, но желтым цветом.

Получилось вот так:

Теперь в ход вступает та самая компонента, на которой мы сейчас заострим внимание: RadialProgressComponent. Для начала добавим ее на второй контрол (который окрашен в желтый цвет) и выставим прогресс 0.5:

Получилось вот так:

А теперь, чтобы не томить, мы покажем, как это устроено в коде (система рисования радиального прогресса – RadialProgressSystem), а в конце покажем видео с тем, что у нас получилось. 

Чтобы систематизировать кастомный способ отрисовки текстур в контролах, ранее была создана компонента ClipPolygonComponent – она хранит в себе двухмерный полигон, по которому рендер-система отрисовывает обрезанную текстуру. Потому задача RadialProgress-системы сводится к правильной подготовке двухмерного полигона в зависимости от значения прогресса.

void RadialProgressSystem::RegisterControl(Control &control)
{
    auto *pieClippable = control.GetComponent<RadialProgressComponent>();
    if (pieClippable && control.GetComponent<TextureComponent>())
    {
        pieClippable->MarkAsDirty();
        this->registeredControls.insert(&control);
    }
}

Это колбэк, который вызывается, когда в сцене появляется контрол с TextureComponent и RadialProgressComponent. Тут запоминаются все контролы в контейнер внутри системы, чтобы обработать их в главной функции системы, в которой происходит работа – Process.

void RadialProgressSystem::UnregisterControl(Control &control)
{
    this->registeredControls.erase(&control);
}

Это колбэк, который вызывается при обратной операции, когда контрол с указанными компонентами исчезает из сцены.

Далее функция Progress обрабатывает все контролы, которые не были обработаны. Для хранения статуса «обработан» есть поле dirty в RadialProgressComponent. Обработке будут «подвергаться» только те контролы, которые имеют RadialProgressComponent с флагом dirty равным true, который после обработки будет выставляться в false.

void RadialProgressSystem::Process(float elapsedTime)
{
    for (Control *control : this->registeredControls)
    {
        auto *pieClippable = control->GetComponent<UIRadialProgressComponent>();
        if (!pieClippable->IsDirty())
        {
            continue;
        }

        auto *polygon = control->GetComponent<ClipPolygonComponent>();
        if (!polygon)
        {
            ReportError(control, "You need UIClipPolygonComponent for UIRadialProgressComponent");
            continue;
        }

        auto *textureComponent = control->GetComponent<TextureComponent>();
        if (textureComponent != nullptr && textureComponent->GetSprite() != nullptr)
        {
            Polygon2 &polygonData = polygon->GetPolygon();
            polygonData.Clear();

            const Vector2 imageSize = textureComponent->GetSprite()->GetSize();
            const Vector2 pivot = CalcPivot(pieClippable);
            const Vector2 center = imageSize * pivot;

            const float progress = pieClippable->GetProgress();

            float startAngle = pieClippable->GetNormalizedStartAngle();
            float endAngle = pieClippable->GetNormalizedEndAngle();

            const float currentAngle = Interpolation::Linear(startAngle, endAngle, 0, progress, 1);

            const float width = pivot.x > 0 ? center.x : imageSize.x;
            const float height = pivot.y > 0 ? center.y : imageSize.y;
            const float initAngle = std::atan(width / height);

            polygonData.AddPoint(center);
            polygonData.AddPoint(CalcPointOnRectangle(startAngle, center, imageSize));

            int direction = startAngle < endAngle ? 1 : -1;
            float startOffset = direction > 0 ? 0 : PI_2   pieClippable->GetAngleBias();

            float squareAngle = startOffset   direction * initAngle;

            const float directedStartAngle = direction * startAngle;
            const float directedEndAngle = direction * endAngle;
            const float directedCurrentAngle = direction * currentAngle;
            float directedSqureAngle = direction * squareAngle;
            const float doubledInitAngle = initAngle * 2.f;

            Vector<Vector2> squares {
                Vector2(imageSize.x, 0),
                Vector2(imageSize.x, imageSize.y),
                Vector2(0.f, imageSize.y),
                Vector2(0.f, 0.f)
            };

            int i = 0;
            while (directedSqureAngle < directedEndAngle)
            {
                if (directedSqureAngle < directedCurrentAngle && directedSqureAngle > directedStartAngle)
                {
                    int squareIndex = direction > 0 ? i % 4 : 3 - i % 4;
                    polygonData.AddPoint(squares[squareIndex]);
                }
                i  ;
                int switcher = i % 2;
                squareAngle  = direction * (PI * switcher - Sign(switcher - 0.5f) * doubledInitAngle);
                directedSqureAngle = direction * squareAngle;
            }

            polygonData.AddPoint(CalcPointOnRectangle(currentAngle, center, imageSize));

            pieClippable->ResetDirty();
        }
    }
}

Теперь, когда мы указываем прогресс в RadialProgress-компоненте, то получаем именно то, что мы хотели – радиальный прогресс с тем значением, которое мы указали. Визуально это выглядит вот так:

Рейтинговая система

Создание World of Tanks Blitz на базе собственного движка DAVAЛучшие игроки в бриллиантовой лиге, 21 апреля 2022

Во многих ММО играх, кроме случайных боёв, существуют также и рейтинговые / ранговые / etc. Основная идея данного режима: противники ищутся не случайные, а подходящие по скилу. Если ты скиловый игрок, ты будешь играть с такими-же скиловыми игроками, и наоборот, если ты не умеешь играть, ты будешь попадаться против таких же новичков.

В начале сезона игрок проходит серию калибровочных боёв по результатам которых определяется его стартовая позиция. Затем, в зависимости от дальнейшей успешности игры, игрок либо поднимается, либо опускается в рейтинге. Рейтинговая система в Блице создавалась, в первую очередь, для правильной балансировки. Она заточена на скилл игроков и практически не зависит от количества сыгранных игр.

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

Основное требование к рейтинговой системе — возможность максимально точно определить уровень игрока. Чтобы оценить, насколько точно работает та или иная рейтинговая система, был создан симулятор, на вход которому подавали историю боёв и выбранную рейтинговую систему, а на выходе получали точность работы системы.

Точность считалась следующим образом:

Наиболее популярные системы расчёта рейтинга: winrate, Elo, Glicko, TrueSkill. Winrate — обычный процент побед. Elo — система подсчёта рейтинга, изначально созданная для игр с участием двух человек (шахматы, etc).

В этой системе игроку за победу / поражение даётся / отнимается некоторое количество очков в зависимости от рейтинга противника. Glicko в целом похожа на Elo, но кроме этого учитывает, сколько времени игрок был не активен. TrueSkill — запатентованная рейтинговая система от Microsoft, в которой у каждого игрока есть два параметра: рейтинг и уверенность системы в этом рейтинге.

Во время разработки первой версии рейтинговых боёв мы рассматривали winrate и Elo (несколько вариантов, адаптированных к командной игре), а также простую систему Score (в которой игрокам всегда давалось фиксированное количество очков рейтинга за победу и отнималось за поражение).

Наилучшие результаты показала система Elo, в которой Ra — рейтинг игрока, а Rb — разница между суммарным рейтингом команды противника и суммарным рейтингом команды игрока за исключением самого игрока.

Основные трудности, с которыми мы столкнулись после запуска:

Первую проблему полностью решить не удалось из-за того, что скиловых игроков слишком мало, им приходится долго ждать, пока начнётся бой, и очень часто видеть в своих командах игроков послабее. Для смягчения эффекта мы сделали доступными рейтинговые бои только в прайм-тайм (то есть в то время, когда на серверах играет максимальное количество людей).

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

Также мы пробовали различными способами улучшить качество рейтинговой системы. В первых версиях для изменения рейтинга мы использовали только информацию о победе / поражении. Но у нас командная игра, и не всегда хорошие действия одного конкретного игрока приводят к победе всю команду.

Для этих целей мы пробовали применить машинное обучение: собрали различные факторы и пытались обучить модель предсказывать победу / поражение команды по действиям игрока в бою, чтобы потом использовать эту модель для определения коэффициента бонуса к рейтингу (то есть если команда проиграла, но поведение игрока было похоже на поведение игроков-победителей, давать таким игрокам дополнительный бонус).

Создание World of Tanks Blitz на базе собственного движка DAVA
Игрок из победившей команды который сыграл хорошо получил 40 к рейтингу. А который плохо всего 10

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

В итоге мы отказались от ML-модели и взяли более простую ручную формулу. Эта формула учитывает только боевой опыт без учёта бонусов за победу, x2 и прочих. Она даёт весьма достойный результат, хоть он и слегка ниже, чем у ML модели.

Требования

Список требований к балансировщику был сформирован на основе фидбека от игрового сообщества и периодически обновляется по сей день.

На момент написания статьи для обычных боёв список состоял из следующих пунктов:

Список требований к балансировщику
  • Разница между максимальным и минимальным уровнем танка не должна превышать единицу, за исключением взводов (то есть если в бою встречаются 10-ки, то там не должно быть 5-ок или 7-ок, только 9-ки и 10-ки);
  • Команды должны быть 7×7, за исключением низкого онлайна (в этом случае можно создавать бои меньшего размера, например 5×5 или 3×3);
  • Команды должны быть зеркально сбалансированы по уровню техники (если в одной команде 3 танка десятого уровня и 4 девятого, то и в другой тоже должно быть 3 десятки и 4 девятки);
  • В обоих командах уровень техники взводов должен быть одинаковым;
  • В командах должно быть не больше 3 танков каждого типа (например, не более 3 тяжей, не более 3 ПТ). Правило работает, начиная с 5-го уровня и выше;
  • Различие числа танков одинакового типа у двух команд не должно быть больше единицы (например, если в одной команде 1 ПТ, то во второй может быть максимум 2 ПТ);
  • Команды должны быть сбалансированы по количеству одинаковых танков, с разницей не более чем в один танк (если в одной команде 1 ИС-7, то в другой — не более 2 ИС-7);
  • Игроки должны попадать только в выбранные ими режимы боя (если игрок включил только «Встречный бой», то он не должен попадать в «Превосходство»);
  • Если игрок купил новый танк, то в первых N боях на новом танке уровни других танков не превышают уровня нового танка игрока (то есть, если у игрока танк 5-го уровня, то в бою не должно встречаться танков 6-го уровня);
  • Игрок должен попадать на те карты, которые у него уже загружены. Часть контента у нас загружается уже после установки игры;
  • Если игрок включил опцию «Единый тип управления» то он должен играть только с игроками, у которых такой же тип управления как у него (если он играет на планшете / телефоне, то он не должен попадать к игрокам с мышками, и наоборот).


Разработать матчмейкер, особенно с учётом такого количества ограничений, — очень интересная задача. И подходов к её решению может быть довольно много.

Оцените статью
TankMod's
Добавить комментарий