PDA

Просмотр полной версии : [Вопрос] ASendMes и SendMes



Bady
22.08.2015, 20:35
Есть ли какая то нагрузка или вред от ASendMes и SendMes.
Или лучше использовать по старинке в форматах.
Разъясните по подробнее желательно.
Так же сталкивался с крашем сервера из за ASendMes и SendMes.


stock ASendMes(alevel, color, fstringg[], {Float, _}:...)
{
static const
STATIC_ARGS = 3;
new
n = (numargs() - STATIC_ARGS) * BYTES_PER_CELL;
if (n)
{
new
message[128],
arg_start,
arg_end;
#emit CONST.alt fstringg
#emit LCTRL 5
#emit ADD
#emit STOR.S.pri arg_start

#emit LOAD.S.alt n
#emit ADD
#emit STOR.S.pri arg_end
do
{
#emit LOAD.I
#emit PUSH.pri
arg_end -= BYTES_PER_CELL;
#emit LOAD.S.pri arg_end
}
while (arg_end > arg_start);

// Push the static format parameters.
#emit PUSH.S fstringg
#emit PUSH.C 128
#emit PUSH.ADR message

n += BYTES_PER_CELL * 3;
#emit PUSH.S n
#emit SYSREQ.C format

n += BYTES_PER_CELL;
#emit LCTRL 4
#emit LOAD.S.alt n
#emit ADD
#emit SCTRL 4
return ABroadCast(color,message,alevel);
}
else return ABroadCast(color,fstringg,alevel);
}
stock SendMes(playerid, color, fstringg[], {Float, _}:...)
{
static const
STATIC_ARGS = 3;
new
n = (numargs() - STATIC_ARGS) * BYTES_PER_CELL;
if (n)
{
new
message[128],
arg_start,
arg_end;
#emit CONST.alt fstringg
#emit LCTRL 5
#emit ADD
#emit STOR.S.pri arg_start

#emit LOAD.S.alt n
#emit ADD
#emit STOR.S.pri arg_end
do
{
#emit LOAD.I
#emit PUSH.pri
arg_end -= BYTES_PER_CELL;
#emit LOAD.S.pri arg_end
}
while (arg_end > arg_start);

// Push the static format parameters.
#emit PUSH.S fstringg
#emit PUSH.C 128
#emit PUSH.ADR message

n += BYTES_PER_CELL * 3;
#emit PUSH.S n
#emit SYSREQ.C format

n += BYTES_PER_CELL;
#emit LCTRL 4
#emit LOAD.S.alt n
#emit ADD
#emit SCTRL 4
//SendClientMessagef(playerid, -1, "a SendMes %s", message);
//if(message[0] != ' ') strins(message, " ", 0, 1);
//SendClientMessagef(playerid, -1, "p SendMes %s symbol '%s'", message);
return SendClientMessage(playerid, color, message);
}
else
{
//if(fstringg[0] != ' ') strins(fstringg, " ", 0, 1);
return SendClientMessage(playerid, color, fstringg);
}
}

Desulaid
23.08.2015, 00:38
Я уже подобное спрашивал =3 (http://pro-pawn.ru/showthread.php?12209)

Потом мне кто-то говорил, что при одновременном вызове этого формата несколькими игроками, ASM выигрывает по скорости, нежели формат. Правда, я не тестил это :to_take_umbrage:

Bady
23.08.2015, 02:10
Я уже подобное спрашивал =3 (http://pro-pawn.ru/showthread.php?12209)

Потом мне кто-то говорил, что при одновременном вызове этого формата несколькими игроками, ASM выигрывает по скорости, нежели формат. Правда, я не тестил это :to_take_umbrage:
Спасибо, может услышу еще новые мнения.

Daniel_Cortez
23.08.2015, 08:48
Потом мне кто-то говорил, что при одновременном вызове этого формата несколькими игроками, ASM выигрывает по скорости, нежели формат. Правда, я не тестил это :to_take_umbrage:
Лишнее копирование аргументов в стеке, лишний вызов функции - не может это всё работать быстрее, чем стандартный метод с форматированием и отправкой сообщений по отдельности.


Так же сталкивался с крашем сервера из за ASendMes и SendMes.

Тогда ответ должен быть очевиден. Между прочим, я тоже недавно пробовал сделать несколько функций с похожим принципом работы и выложить их здесь.
Когда я их тестировал, они работали нормально, пока я не попробовал вызвать одну из них с помощью CallLocalFunction. Как оказалось, любой вызов таких функций не из функций на Pawn, а из нативного кода (CallLocalFunction/CallRemoteFunction/SetTimer/SetTimerEx), приводил к падению сервера.

$continue$
23.08.2015, 09:47
Когда я их тестировал, они работали нормально, пока я не попробовал вызвать одну из них с помощью CallLocalFunction. Как оказалось, любой вызов таких функций не из функций на Pawn, а из нативного кода (CallLocalFunction/CallRemoteFunction/SetTimer/SetTimerEx), приводил к падению сервера.
Куй в деле.
http://i.imgur.com/NrkHArZ.png
Тут просто я заржал во весь голос :sarcastic:

Daniel_Cortez
23.08.2015, 10:05
Куй в деле.
http://i.imgur.com/NrkHArZ.png
Тут просто я заржал во весь голос :sarcastic:
Куй как-то говорил на sa-mp.com, что фиксит только самые критические баги, которые угрожат безопасности или крашат сервер. Но, похоже, он и тут "переоценил" себя, раз до сих пор не может исправить краш при установке пустого ника.

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