VVWVV
10.08.2022, 13:33
Мотивация
Все текущие реализации довольно медленные. Во-первых, все они используют функцию SA-MP `CallLocalFunction`, которая сама по себе медленная O(log N) и имеет множество багов, вызывающих краш сервера. Во-вторых, нет возможности проверки имени во время компиляции. В-третьих, все из них хранят названия функций обратного вызова для каждого игрока, что составляет 1000 (MAX_PLAYERS) на 32 байта (максимальный размер имени функции).
Решение
В Pawn есть автоматы, которые решают все проблемы прошлых реализаций, связанных с поиском, проверкой имени функции и их хранением. Нам лишь нужно хранить состояние для каждого игрока. С помощью автоматов нам не нужно искать обработчик по названию O(1), а нужно лишь хранить индекс (4 байта) на 1000 (MAX_PLAYERS).
Скачать
Посмотреть на Pastebin (https://pastebin.com/xQHjfj7t)
Зависимости
Для работы реализации нужны: модифицированный компилятор (https://github.com/pawn-lang/compiler), стандартная библиотека SA-MP (https://github.com/pawn-lang/samp-stdlib) и сервер SA-MP.
Пример
DIALOG:PlayerSignUp(playerid, response, listitem, const inputtext[]) {
if (!response)
return;
// ...
}
public OnGameModeInit() {
Dialog_Init();
}
public OnPlayerConnect(playerid) {
Dialog_Show(playerid, PlayerSignUp, DIALOG_STYLE_MSGBOX, !"Sign Up", !"You are new", !"Start", !"Cancel");
}
Все текущие реализации довольно медленные. Во-первых, все они используют функцию SA-MP `CallLocalFunction`, которая сама по себе медленная O(log N) и имеет множество багов, вызывающих краш сервера. Во-вторых, нет возможности проверки имени во время компиляции. В-третьих, все из них хранят названия функций обратного вызова для каждого игрока, что составляет 1000 (MAX_PLAYERS) на 32 байта (максимальный размер имени функции).
Решение
В Pawn есть автоматы, которые решают все проблемы прошлых реализаций, связанных с поиском, проверкой имени функции и их хранением. Нам лишь нужно хранить состояние для каждого игрока. С помощью автоматов нам не нужно искать обработчик по названию O(1), а нужно лишь хранить индекс (4 байта) на 1000 (MAX_PLAYERS).
Скачать
Посмотреть на Pastebin (https://pastebin.com/xQHjfj7t)
Зависимости
Для работы реализации нужны: модифицированный компилятор (https://github.com/pawn-lang/compiler), стандартная библиотека SA-MP (https://github.com/pawn-lang/samp-stdlib) и сервер SA-MP.
Пример
DIALOG:PlayerSignUp(playerid, response, listitem, const inputtext[]) {
if (!response)
return;
// ...
}
public OnGameModeInit() {
Dialog_Init();
}
public OnPlayerConnect(playerid) {
Dialog_Show(playerid, PlayerSignUp, DIALOG_STYLE_MSGBOX, !"Sign Up", !"You are new", !"Start", !"Cancel");
}