То есть если я юзаю такую функцию много раз подряд то лучше true поставить?
И как потом очистить то что в кэше остаётся или не чего страшного что в кэше мусор будет висеть?
Вид для печати
Имеется такой "чудо" код:
Так вот, дело в том что компилятор отказывается "жевать" ссылаясь на использование 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-ый раз выполнять уже код, то есть примерно раз в секунду как и надо. Это варварский вариант и есть какое-нибудь решение получше или)?
А правда, что и таймер без повтора SetTimerEx надо останавливать через KillTimer?
Эмм, ну предложу такую реализацию
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);
Ну, если верить ^_^, сервер начнёт виснуть, если код функции не успеет обработаться, но время для повторного вызова таймера опять наступит (хотя такое возможно только если сервер считает вызов таймерной функции своей первостепенной задачей и все прочие команды отодвигает на второй план).
То бишь, примерно так выглядит "очередь" в серверной машине
Действия (1,2 и т.п.) никак не связаны с таймером, который мы описываем.Цитата:
Таймер на 1 секунду -> Действие 1 -> Действие 2 -> Действие 3 -> Прошла секунда и вызываемая таймером функция начинает обрабатываться + стартует новый таймер на 1 секунду -> действие 5 ->...
И вот что случается, если сервер не успевает обработать код функции (описываю на той же схеме)
Это пример полного зависания сервера. А лаги, как я понимаю, получаются когда функция обрабатывается за время, близкое к одной секунде и сервер успевает сделать всего пару-тройку других действий, прежде чем его опять заставляют выполнять код таймера.Цитата:
Таймер на 1 секунду -> Действие 1 -> Действие 2 -> Действие 3 -> Прошла секунда и вызываемая таймером функция начинает обрабатываться + стартует новый таймер на 1 секунду -> функция обрабатывалась ровно или больше секунды и подошло время для повторного вызова этой функции, следовательно, сервер опять вставил её в очередь -> и опять -> и опять -> и так пока функция не выполнится за меньшее время, чем указано в таймере -> действие 5 ->...
Если же вызов таймера сделать внутри самого таймера, то сервер не начнёт отсчёт для повторного вызова функции пока не закончит обработку всего кода, вызываемого таймером => после обработки кода у сервера появится, в случае с секундным таймером, целая секунда для того, чтоб дальше обрабатывать другие данные и только потом он опять начнёт обрабатывать функцию таймера. Как-то так
На самом деле отличный ответ, многим бы пригодилась данная информация. Благодарю.
Попробую тогда для начала "разбить" секундный таймер по 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 мс будет вызываться...