• Надо ли добавлять сессию в каждый пакет UDP?

    Армянское Радио, эти мифические действия работают всегда и у всех. Говорю об этом как разработчик уже трех ММО проектов с сетью на базе TCP протокола (кастомы RO, Minecraft и проект Skylore) и разработчик сетевого уровня таких проектов, как Quake Champions и WWZ, сеть в которых строится поверх UDP.
    Мы решали разные проблемы трафика для iOs, Android, PS4, XBox, ПК и Switch. И всегда добивались нужного результата. И я сразу сказал что с UDP проблем фрагментации значительно больше.

    Статей в открытом доступе нет, есть только за деньги и за участие в игровой индустрии. Но это не беда, ведь есть документация сокетов Беркли. Там все хорошо описано, при ее изучении можно до всего дойти самостоятельно.
  • Надо ли добавлять сессию в каждый пакет UDP?

    Армянское Радио,
    потому что пакеты UDP быстрее проскакивают через маршрутизаторы, не встречая на своем пути интересные алгоритмы управления потоком, которые применяются к пакетам TCP

    Это не так. Для сетей маршрутизации пакет все равно представлен IP датаграммой, будь это TCP- или UDP-пакет.
    Правила роутинга по протоколам транспортного уровня имеются, но не являются страшными.

    TCP не используют в связи с тем, что чаще всего не знают как по каналу передавать свои данные. Зачастую я в сетевом коде проектов наблюдаю полнейший бедлам без структуры и какого-то намека на здравый смысл. Люди в датаграмму UDP пишут как будто в файл со своей строго определенной тематикой и отсылают десятки и сотни таких датаграмм за один такт симуляции.
    Отдельные люди, кому посчастливилось читать Гленна Фидлера, пробуют реализовать свой сеансовый уровень поверх UDP тоже не изобилуя структурностью данных в пакете.
    А по TCP обычно вижу передачу json-ов и xml-ек а-ля SOAP и такое прочее. За голову хвататься в пору с таких зрелищ. :)

    Талян
    TCP можно использовать и его используют. Просто считается, не без эффекта весомости мнения Гленна, что TCP увеличивает латентность передачи данных. Слухи молвят что TCP безусловно буферизирует исходящий трафик до заполнения всего кадра отправки. И что это может привести к латентности в сотни миллисекунд, что недопустимо для игр.
    Это тоже неправда, задержку от буферизации TCP можно нивелировать техническими приемами и настройками протокола.

    При этом у UDP есть другая, куда более серьезная, проблема, связанная с MTU, фрагментацией и алгоритмами этой самой фрагментации в роутерах разных производителей.
    MTU (Maximum Transmission Unit) определяет максимальный размер пакета, который не подвергнется фрагментации при передаче по определенному маршруту.
    Алгоритмы фрагментации бывают разные, но основных - два: Traffic Shaping и Traffic Control.
    Шейпинг просто режет датаграмму "под орбу". Все что больше MTU отсекается, остальное отправляется дальше по маршруту. Множество дешевых домашних роутеров занимаются именно этим при маршрутизации.
    Контроль организует фрагментацию датаграммы до размера MTU и отправляет уже как цепочку фрагментированных датаграмм.
    Оба этих алгоритма резко повышают шансы большой датаграммы стать потерянной. И если при контроле датаграмма может быть только частично потеряна, то в результате шейпинга датаграмма вообще всегда считается потерянной, даже если доставлена. Такие датаграммы на обработку могут поступить только если были отправлены с соответствующими флагами.
    И вот еще вишенка на этом торте: по разным маршрутам могут встречаться разные устройства с разными алгоритмами фрагментации. Тут пакет законтроллили, а там - уже зашейпили и всё.
    Многие протоколы сегодня из-за этого боятся слать датаграммы больше 500Б. При этом, таких датаграмм отсылается в избытке, что создает значительную сервисную нагрузку на сетевой канал. Ведь каждая датаграмма будет нести в себе один и тот же IP заголовок (28/48Б в зависимости от версии протокола IP), а это до 10% трафика при датаграммах по 500Б.

    В этом плане TCP значительно выгоднее за счет только того, что берет на себя весь этот сервис с пакетами.
    Профиль современной игры (на дистанции уже 12 лет) требует канал от 512КБит/сек до 2.5МБит/сек, что складывается из 30, 60 или 96 операций приема-передачи трафика около 1-2КБ за одну операцию приема-передачи.
  • Как проверить если ли буква в массиве?

    @MarkusD Куратор тега C++
    JavaSscriptNoob, в таком случае тебе стоит отметить ответ как решение.
  • Как проверить если ли буква в массиве?

    @MarkusD Куратор тега C++
    KIberWarriorJs, как твои успехи в решении вопроса?
  • Как создать новый экземпляр класса переменной?

    @MarkusD Куратор тега C++
    Mercury13,
    Нет второй части мерлезонского балета

    Правда нету? А если присмотреться?
  • Стоит ли учить C++, если нет возможности использовать Unreal Engine?

    RabraBabr, ну погорячился немного. Исправляю ситуацию как могу. :)
    Я думаю, он пока еще не в курсе реальности игровой индустрии.
  • Стоит ли учить C++, если нет возможности использовать Unreal Engine?

    OcToF, да не беспокойся ты так. Ты задал вопрос и у тебя будут соответствующие уровню твоего вопроса ответы.
    От меня ответа не стоит ждать, у тебя вопрос не ко мне.
  • Как создать новый экземпляр класса переменной?

    @MarkusD Куратор тега C++
    Mercury13, второй вариант - это не миксин. Я, кстати, не совсем понимают терминологию рекурсивного шаблона.
    Второй вариант крайне редко реализуем на практике.

    А вот миксин реализуется всегда. Суть миксиа ведь не в том чтобы встроиться в цепочку родства, а в том, чтобы примешать функциональность.
    template< typename TImplementation >
    class Cloneable
    {
    public:
      std::unique_ptr<TImplementation> Clone() const;
    // ...
    };
    
    class MyClass : public BaseClass, public Cloneable<MyClass>
    {
      friend class Cloneable<MyClass>;
      // ...
    };

    Виртуальность в миксине не нужна, в цепочку наследования он не встраивается, функциональность подмешивает через свой интерфейс и использование внутреннего интерфейса класса реализации.
    Начиная с C++20 такие примеси не будут занимать места в памяти экземпляра.
    Проблемы в static_cast лично я никакой не вижу. Приведение типа времени трансляции с полной проверкой на соответствие. Никаких проблем нет.
    Макросы в этом коде совершенно не нужны.
  • Стоит ли учить C++, если нет возможности использовать Unreal Engine?

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

    @MarkusD Куратор тега C++
    Mercury13, не в моем понимании, а в понимании всех специалистов миксин - это миксин.
  • Как создать новый экземпляр класса переменной?

    @MarkusD Куратор тега C++
    Mercury13, я многое могу понять, но вот наличие в примере макросов понять не могу.
    Почему не миксином?
  • Стоит ли учить C++, если нет возможности использовать Unreal Engine?

    OcToF, вот почему я спрашиваю.
    Разработка ПО связана со строгим соблюдением большого ряда требований, стандартов, нормативов и регламентов.
    Работа с инструментом C++ вообще от человека требует предельной педантичности и буквально догматизма в отношении стандарта языка.

    Тебе не до соблюдения правил и правильного построения текста, это я вижу. Тебе ничего не мешало, но ты не стал читать правила и просто пошел нарушать их (П3.1, П3.2, П3.5, П3.6). Ты не стал утруждать себя формулировками и подачей текста в вопросе чтобы другие люди могли лучше тебя понять.
    Тебе не нужен ответ на твой вопрос, ты не прикладываешь усилий для получения этого ответа.
    Тебе незачем идти в гймдев, а особенно туда, где используют C++. Код ты будешь писать ровно так же, как текст своего вопроса, а значит ты не сможешь работать с C++.
  • Стоит ли учить C++, если нет возможности использовать Unreal Engine?

    OcToF, я задам тебе довольно простой и прямой вопрос. В моем вопросе нет подтекстов и тайных смыслов.
    Тебе что-то мешало весь этот текст написать с соблюдением правил Русского языка?
  • Как подключить библиотеку Vosk-api?

    Zupand, замечательно. Это пакет .NET C#. Ссылка на него приведена в том же руководстве по установке.
    Это не то что тебе надо. Тебе нужен код из гитхаба, тебе нужно оформить этот код в проект студии, подключить этот проект в свое целевое решение, настроить зависимости между твоим проектом и добавленным проектом vosk. И только после этого у тебя должно все заработать.
    Или не заработать если ты что-то сделал неправильно. В любом случае, план для тебя таков: тебе нужно научиться добавлять сторонний код в виде проектов в свое решение. Тебе нужно разобраться в типах проектов студии и выбрать правильный тип для библиотеки vosk. Тебе нужно разобраться в зависимостях между проектами студии.
    Это все есть в документации MSDN.
  • Как подключить библиотеку Vosk-api?

    Zupand, давай для начала посмотрим, по какому адресу ты скачивал nuget пакет vosk.
  • Инициализация объединения из двух энумераций?

    @MarkusD Куратор тега C++
    Вадим Ушаков, не делается :)
    Давай я тебе подскажу тогда по поводу std::variant[?].
    Это, в общем смысле, то что тебе нужно. Он позволит тебе инициализацию так как ты привел в вопросе. Лишь с небольшими исправлениями.
    Designated Initializer тебе здесь не нужен. union - тоже не нужен гарантированно. Из варианта ты всегда можешь достать индекс текущего активного типа. Это тебе может сильно упростить логику.
  • Как подключить библиотеку Vosk-api?

    Zupand, это потому что вся необходимая тебе информация относится не к vosk, а к студии.
    Поэтому я и пишу о том, что сперва нужно описать твои шаги по самостоятельной интеграции библиотеки.

    Ты не написал сейчас о том, добавил ли ты проект vosk в зависимости своего кода и добавил ли ты вообще проект vosk в свое решение.
    LNK2019 прямо говорит тебе о том, что у тебя в коде используются объявления, а определений твой код не предоставляет.
    Это означает что у тебя зависимости не настроены. И чтобы решить твою проблему, тебе нужно настроить зависимости в своих проектах.
  • Как подключить библиотеку Vosk-api?

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

    Я не знаком с этой библиотекой, но могу сразу сказать что проблем с ее интеграцией у тебя быть не должно.
    Насколько я смог понять, ты пользуешься студией. У тебя не должно составить особого труда перенести сборку из mingw в проект студии используя раздел "Compilation from source" руководства.
  • Как подключить библиотеку Vosk-api?

    Zupand , я правильно ведь понимаю что ты впервые сел за язык C++?
  • Инициализация объединения из двух энумераций?

    @MarkusD Куратор тега C++
    Вадим Ушаков, так все-таки, как ты сейчас планируешь определять какое из полей перечисления ты инициализировал?