[Anticheat]___Invisible Fly Hack
[Anticheat]____Weapon/Ammo Hack
[Function]______ResetPlayerWeaponSlot
[Function]_______FIX_SetPlayerAmmo
[ServerMod]______TDM | Zombie Apokalypse
Имеется такой "чудо" код:
Так вот, дело в том что компилятор отказывается "жевать" ссылаясь на использование params[0] в switch'e. Как можно решить ситуацию? Собственно использую sscanf. И быть может есть у кого-то вариант антирекламы которые будет работать еще шустрее, то есть будет лучше в плане оптимизации. Заранее благодарен.PHP код:
new i, AR;
for(i = strlen(params[0]) - 1; i != -1; i--)
{
switch(params[0][i])
{
case '0'..'9': AR++;
default: continue;
}
}
if(AR > кол-во цифр) наказываем...
Элементарно ведь, как-то я...
А сам код нормальный? Если вызывать при использовании обычного чата того же не будет сильно грузить?
- - - Добавлено - - -
И еще, у меня у каждого игрока свой индивидуальный таймер, не циклический, то есть я вызываю его при коннекте игрока БЕЗ повторения а в самом конце выполнения public'а самого таймера запускаю таймер по новой, то есть тот же цикл только стартует после окончания проработки кода машиной. Так вот проблема в том что указанные 1000 мс даже и близко нет, я знаю что для таймеров это нормально, но ладно если бы погрешность была +-200 мс, а так погрешность выходит у меня до 500-600 мс, то есть код таймера должен выполниться через 1000 мс а выполняется в итоге через 300-600 мс - огромная погрешность. Как быть? Не хотелось бы делать таймер циклический (с параметром true после коннекта игрока) так как код может не успеть "выполниться" а следующий таймер уже на подходе и этот код нужно читать опять и в итоге получаем лаги.
В принципе можно запускать таймер не на 1000 мс а допустим на 250, там уже думаю погрешность будет минимальная? Сделать счётчик срабатываний и на 4-ый раз выполнять уже код, то есть примерно раз в секунду как и надо. Это варварский вариант и есть какое-нибудь решение получше или)?
Эмм, ну предложу такую реализацию
PHP код:
SetTimerEx("Deimos", 250, 0, "ii", playerid, 0);
forward Deimos(playerid, number_iteration);
public Deimos(playerid, number_iteration)
{
if(number_iteration == 0) return SetTimerEx("Deimos", 250, 0, "ii", playerid, 1);
else if(number_iteration == 1) return SetTimerEx("Deimos", 250, 0, "ii", playerid, 2);
else if(number_iteration == 2) return SetTimerEx("Deimos", 250, 0, "ii", playerid, 3);
else if(number_iteration == 3)
{
//Нужный код таймера
SetTimerEx("Deimos", 250, 0, "ii", playerid, 0);
}
return 1;
}
Эмм, то есть, такой?
Если да, то только в том случае, когда тебе вдруг не нужно, чтоб таймер сработал (то бишь, убить его до его срабатывания). В остальных же случаях он сработает и удалится из памяти сервера (вроде, в этой теме я давал код, где таймером запускал сразу кучу таймеров и пытался посмотреть, есть ли в SA-MP ограничение на ID таймера)PHP код:
SetTimerEx("Deimos", 250, 0, "ii", playerid, 1);
Связаться со мной в VK можно через личные сообщения этой группы
Заказы не принимаю
Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
Великих идей полно, на них нет спроса.
Воплощение идеи в законченную игру требует долгой работы,
таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
Предложить идею просто, воплотить – вот в чём проблема
Steve Pavlina
Ну, если верить ^_^, сервер начнёт виснуть, если код функции не успеет обработаться, но время для повторного вызова таймера опять наступит (хотя такое возможно только если сервер считает вызов таймерной функции своей первостепенной задачей и все прочие команды отодвигает на второй план).
То бишь, примерно так выглядит "очередь" в серверной машине
Действия (1,2 и т.п.) никак не связаны с таймером, который мы описываем.Таймер на 1 секунду -> Действие 1 -> Действие 2 -> Действие 3 -> Прошла секунда и вызываемая таймером функция начинает обрабатываться + стартует новый таймер на 1 секунду -> действие 5 ->...
И вот что случается, если сервер не успевает обработать код функции (описываю на той же схеме)
Это пример полного зависания сервера. А лаги, как я понимаю, получаются когда функция обрабатывается за время, близкое к одной секунде и сервер успевает сделать всего пару-тройку других действий, прежде чем его опять заставляют выполнять код таймера.Таймер на 1 секунду -> Действие 1 -> Действие 2 -> Действие 3 -> Прошла секунда и вызываемая таймером функция начинает обрабатываться + стартует новый таймер на 1 секунду -> функция обрабатывалась ровно или больше секунды и подошло время для повторного вызова этой функции, следовательно, сервер опять вставил её в очередь -> и опять -> и опять -> и так пока функция не выполнится за меньшее время, чем указано в таймере -> действие 5 ->...
Если же вызов таймера сделать внутри самого таймера, то сервер не начнёт отсчёт для повторного вызова функции пока не закончит обработку всего кода, вызываемого таймером => после обработки кода у сервера появится, в случае с секундным таймером, целая секунда для того, чтоб дальше обрабатывать другие данные и только потом он опять начнёт обрабатывать функцию таймера. Как-то так
Связаться со мной в VK можно через личные сообщения этой группы
Заказы не принимаю
Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
Великих идей полно, на них нет спроса.
Воплощение идеи в законченную игру требует долгой работы,
таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
Предложить идею просто, воплотить – вот в чём проблема
Steve Pavlina
На самом деле отличный ответ, многим бы пригодилась данная информация. Благодарю.
Попробую тогда для начала "разбить" секундный таймер по 500 мс.
Спрошу еще разок по поводу антирекламы простенькой:
Есть какой-нибудь вариант побыстрее или это оптимальный?PHP код:
new i, AR;
for(i = strlen(...) - 1; i != -1; i--)
{
switch(...)
{
case '0'..'9': AR++;
default: continue;
}
}
if(AR > кол-во цифр) наказываем...
Собственно я нашёл в чем у меня была проблема и погрешность была настолько велика, но тем не менее погрешность в ~100 мс чувствуется, за час система может "опаздывать" уже на 3-4 минуты. Так вот, можно ведь поставить интервал не 1000 а 950, золотая середина с небольшой погрешностью. Меня интересует стоит ли вот так делить таймер на 4 вызова или лучше оставить систему в покое но с небольшой погрешностью, то есть стоит ли оно того? Да всего пару проверок, нагрузке взяться неоткуда, но а если онлайн будет там с 500 человек, допустим, это каждые 250 мс будет вызываться...
Последний раз редактировалось DeimoS; 13.03.2016 в 10:38.
Эту тему просматривают: 10 (пользователей: 0 , гостей: 10)