⚙️
Workshop Guide
  • Workshop
    • 💳Использование Workshop
    • ⬇️Установка модификации
  • Моды
    • 🌎Редактирование файлов локализации
    • 🎨Форматы цветов
    • ⁉️Проблемы с модификациями
    • 🔧MagicByteSharedLibrary
    • 🗑️DayZShop
    • 😎DayZSetManager 1.0.0-1.1.3
    • 😎DayZSetManager 2.0.0 +
    • 🥳NotPicksarAnims
    • 👬DayZPartyManager
    • 💵Magic Bank
    • 🎁MagicBattlePass
    • 🖌️MagicSkins
  • Документация MagicByteSharedLibrary
    • 🖥️UI
      • Система уведомлений
      • Система локализации
      • Группа виджетов
    • Модели вызова функций
      • Асинхронное выполнение задач
      • Строго типизированные функции
        • Привязка аргументов строго типизированных функций
        • Строго типизированные события
      • Promise (обещание значения)
        • Цепочки Promise
    • Работа с сетью
      • RPC (Remote Procedure Call)
      • RFC (Remote Function Call)
    • 💽Файловая система
    • Коллекции
Powered by GitBook
On this page
  • Класс задачи
  • Диспетчер задач
  • Принцип работы диспетчера
  1. Документация MagicByteSharedLibrary
  2. Модели вызова функций

Асинхронное выполнение задач

Так как DayZ - практически полностью однопоточная игра, выполнение длительной задачи (например, чтение файла, парсинг json-файла и т.п.) приводит к блокировке выполнения всего процесса. На клиенте это выражается в зависании приложения и, при достаточно долгой задаче, выходом с сервера. На сервере это выражается в лагах и отключении игроков от сервера. Для решения данной проблемы в MBSL реализован механизм асинхронного выполнения задач, основная идея которого в разделении задачи на мелкие подзадачи и выполнении их не за раз, а на каждом вызове Update.

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

Класс задачи

Для создания асинхронной задачи необходимо реализовать выполняющий её класс. Базовым классом для таких классов служит MBSL_AsyncTaskBase, исходный код которого приведён ниже:

enum MBSL_AsyncTaskStepResult
{
	TaskInProgess,
	TaskWaiting,
	TaskFinished
}

class MBSL_AsyncTaskBase : Managed
{
	MBSL_AsyncTaskStepResult Step(float timeslice);
}

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

Функция возвращает одной из значений enum'а MBSL_AsyncTaskStepResult:

  • TaskInProgress - задача выполняла работу на этом вызове Step и ещё не завершила выполнение.

  • TaskWaiting - задача не выполняла работу на этом вызове (например, она ждёт чего-то), но ещё не завершила выполнение. Устаревшее значение, которое более не используется, но оставлено для обратной совместимости.

  • TaskFinished - задача завершила выполнение работы.

Диспетчер задач

Диспетчер (MBSL_Dispatcher) - это класс, отвечающий за ведение очереди задач и вызов метода Step на задаче для выполнения. Для его использования требуется всего один метод:

static void QueueTask(MBSL_AsyncTaskBase task)

Данный метод принимает два аргумента:

  • task - экземпляр выполняемой задачи.

Принцип работы диспетчера

Текущая версия диспетчера построена на идее бюджета времени выполнения.

Сервер имеет целевую частоту тиков (TPS - ticks per second) для поддержания стабильной работы. На основе этого значения определяется бюджет времени выполнения для каждого тика (например, при TPS = 60 это значение равно 1/60 = 16 мс). Каждый тик диспетчер определяет уже затраченное игрой время на обработку тика и вычисляется оставшийся бюджет времени.

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

PreviousМодели вызова функцийNextСтрого типизированные функции

Last updated 3 days ago