Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 13 из 133 ПерваяПервая ... 3 11 12 13 14 15 23 63 113 ... ПоследняяПоследняя
Показано с 121 по 130 из 1325
  1. #121
    Аватар для vovandolg
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±
    Цитата Сообщение от [ForD] Посмотреть сообщение
    bool:кэширование
    То есть если я юзаю такую функцию много раз подряд то лучше true поставить?
    И как потом очистить то что в кэше остаётся или не чего страшного что в кэше мусор будет висеть?
    [Anticheat]___Invisible Fly Hack
    [Anticheat]____Weapon/Ammo Hack
    [Function]______ResetPlayerWeaponSlot
    [Function]_______FIX_SetPlayerAmmo
    [ServerMod]______TDM | Zombie Apokalypse

  2. #122
    Аватар для Kazoox
    Пользователь

    Статус
    Оффлайн
    Регистрация
    25.04.2014
    Сообщений
    121
    Репутация:
    3 ±
    Имеется такой "чудо" код:
    PHP код:
    new iAR;
        for(
    strlen(params[0]) - 1!= -1i--)
        {
            switch(
    params[0][i])
            {
                case 
    '0'..'9'AR++;
                default: continue;
            }
        }
        if(
    AR кол-во цифрнаказываем... 
    Так вот, дело в том что компилятор отказывается "жевать" ссылаясь на использование params[0] в switch'e. Как можно решить ситуацию? Собственно использую sscanf. И быть может есть у кого-то вариант антирекламы которые будет работать еще шустрее, то есть будет лучше в плане оптимизации. Заранее благодарен.

  3. #123
    Аватар для L0ndl3m
    Пользователь

    Статус
    Оффлайн
    Регистрация
    19.10.2013
    Адрес
    Ярославль
    Сообщений
    1,366
    Репутация:
    774 ±
    Цитата Сообщение от Kazoox Посмотреть сообщение
    Имеется такой "чудо" код:
    PHP код:
    new iAR;
        for(
    strlen(params[0]) - 1!= -1i--)
        {
            switch(
    params[0][i])
            {
                case 
    '0'..'9'AR++;
                default: continue;
            }
        }
        if(
    AR кол-во цифрнаказываем... 
    Так вот, дело в том что компилятор отказывается "жевать" ссылаясь на использование params[0] в switch'e. Как можно решить ситуацию? Собственно использую sscanf. И быть может есть у кого-то вариант антирекламы которые будет работать еще шустрее, то есть будет лучше в плане оптимизации. Заранее благодарен.
    Создать новый массив и уже обрабатывать его.

  4. #124
    Аватар для Kazoox
    Пользователь

    Статус
    Оффлайн
    Регистрация
    25.04.2014
    Сообщений
    121
    Репутация:
    3 ±
    Цитата Сообщение от Londlem Посмотреть сообщение
    Создать новый массив и уже обрабатывать его.
    Элементарно ведь, как-то я...
    А сам код нормальный? Если вызывать при использовании обычного чата того же не будет сильно грузить?

    - - - Добавлено - - -

    И еще, у меня у каждого игрока свой индивидуальный таймер, не циклический, то есть я вызываю его при коннекте игрока БЕЗ повторения а в самом конце выполнения public'а самого таймера запускаю таймер по новой, то есть тот же цикл только стартует после окончания проработки кода машиной. Так вот проблема в том что указанные 1000 мс даже и близко нет, я знаю что для таймеров это нормально, но ладно если бы погрешность была +-200 мс, а так погрешность выходит у меня до 500-600 мс, то есть код таймера должен выполниться через 1000 мс а выполняется в итоге через 300-600 мс - огромная погрешность. Как быть? Не хотелось бы делать таймер циклический (с параметром true после коннекта игрока) так как код может не успеть "выполниться" а следующий таймер уже на подходе и этот код нужно читать опять и в итоге получаем лаги.

  5. #125
    Аватар для Kazoox
    Пользователь

    Статус
    Оффлайн
    Регистрация
    25.04.2014
    Сообщений
    121
    Репутация:
    3 ±
    В принципе можно запускать таймер не на 1000 мс а допустим на 250, там уже думаю погрешность будет минимальная? Сделать счётчик срабатываний и на 4-ый раз выполнять уже код, то есть примерно раз в секунду как и надо. Это варварский вариант и есть какое-нибудь решение получше или)?

  6. #126
    Аватар для m1n1vv
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.09.2015
    Сообщений
    541
    Репутация:
    78 ±
    А правда, что и таймер без повтора SetTimerEx надо останавливать через KillTimer?

  7. #127
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Kazoox Посмотреть сообщение
    В принципе можно запускать таймер не на 1000 мс а допустим на 250, там уже думаю погрешность будет минимальная? Сделать счётчик срабатываний и на 4-ый раз выполнять уже код, то есть примерно раз в секунду как и надо. Это варварский вариант и есть какое-нибудь решение получше или)?
    Эмм, ну предложу такую реализацию
    PHP код:
    SetTimerEx("Deimos"2500"ii"playerid0);
    forward Deimos(playeridnumber_iteration);
    public 
    Deimos(playeridnumber_iteration)
    {
        if(
    number_iteration == 0) return SetTimerEx("Deimos"2500"ii"playerid1);
        else if(
    number_iteration == 1) return SetTimerEx("Deimos"2500"ii"playerid2);
        else if(
    number_iteration == 2) return SetTimerEx("Deimos"2500"ii"playerid3);
        else if(
    number_iteration == 3
        {
            
    //Нужный код таймера
            
    SetTimerEx("Deimos"2500"ii"playerid0);
        }
        return 
    1;



    Цитата Сообщение от m1n1vv Посмотреть сообщение
    А правда, что и таймер без повтора SetTimerEx надо останавливать через KillTimer?
    Эмм, то есть, такой?
    PHP код:
    SetTimerEx("Deimos"2500"ii"playerid1); 
    Если да, то только в том случае, когда тебе вдруг не нужно, чтоб таймер сработал (то бишь, убить его до его срабатывания). В остальных же случаях он сработает и удалится из памяти сервера (вроде, в этой теме я давал код, где таймером запускал сразу кучу таймеров и пытался посмотреть, есть ли в SA-MP ограничение на ID таймера)
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  8. #128
    Аватар для Kazoox
    Пользователь

    Статус
    Оффлайн
    Регистрация
    25.04.2014
    Сообщений
    121
    Репутация:
    3 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Эмм, ну предложу такую реализацию
    PHP код:
    SetTimerEx("Deimos"2500"ii"playerid0);
    forward Deimos(playeridnumber_iteration);
    public 
    Deimos(playeridnumber_iteration)
    {
        if(
    number_iteration == 0) return SetTimerEx("Deimos"2500"ii"playerid1);
        else if(
    number_iteration == 1) return SetTimerEx("Deimos"2500"ii"playerid2);
        else if(
    number_iteration == 2) return SetTimerEx("Deimos"2500"ii"playerid3);
        else if(
    number_iteration == 3
        {
            
    //Нужный код таймера
            
    SetTimerEx("Deimos"2500"ii"playerid0);
        }
        return 
    1;





    Эмм, то есть, такой?
    PHP код:
    SetTimerEx("Deimos"2500"ii"playerid1); 
    Если да, то только в том случае, когда тебе вдруг не нужно, чтоб таймер сработал (то бишь, убить его до его срабатывания). В остальных же случаях он сработает и удалится из памяти сервера (вроде, в этой теме я давал код, где таймером запускал сразу кучу таймеров и пытался посмотреть, есть ли в SA-MP ограничение на ID таймера)
    Это ведь лишний код. Не лучше тогда уже зациклить таймер? До меня ведь наверняка кто-то с такой же проблемой связывался.

    - - - Добавлено - - -

    Хотя, наверное даже такой вариант лучше чем цикл?

  9. #129
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Kazoox Посмотреть сообщение
    Это ведь лишний код. Не лучше тогда уже зациклить таймер? До меня ведь наверняка кто-то с такой же проблемой связывался.

    - - - Добавлено - - -

    Хотя, наверное даже такой вариант лучше чем цикл?
    Ну, если верить ^_^, сервер начнёт виснуть, если код функции не успеет обработаться, но время для повторного вызова таймера опять наступит (хотя такое возможно только если сервер считает вызов таймерной функции своей первостепенной задачей и все прочие команды отодвигает на второй план).
    То бишь, примерно так выглядит "очередь" в серверной машине
    Таймер на 1 секунду -> Действие 1 -> Действие 2 -> Действие 3 -> Прошла секунда и вызываемая таймером функция начинает обрабатываться + стартует новый таймер на 1 секунду -> действие 5 ->...
    Действия (1,2 и т.п.) никак не связаны с таймером, который мы описываем.
    И вот что случается, если сервер не успевает обработать код функции (описываю на той же схеме)
    Таймер на 1 секунду -> Действие 1 -> Действие 2 -> Действие 3 -> Прошла секунда и вызываемая таймером функция начинает обрабатываться + стартует новый таймер на 1 секунду -> функция обрабатывалась ровно или больше секунды и подошло время для повторного вызова этой функции, следовательно, сервер опять вставил её в очередь -> и опять -> и опять -> и так пока функция не выполнится за меньшее время, чем указано в таймере -> действие 5 ->...
    Это пример полного зависания сервера. А лаги, как я понимаю, получаются когда функция обрабатывается за время, близкое к одной секунде и сервер успевает сделать всего пару-тройку других действий, прежде чем его опять заставляют выполнять код таймера.

    Если же вызов таймера сделать внутри самого таймера, то сервер не начнёт отсчёт для повторного вызова функции пока не закончит обработку всего кода, вызываемого таймером => после обработки кода у сервера появится, в случае с секундным таймером, целая секунда для того, чтоб дальше обрабатывать другие данные и только потом он опять начнёт обрабатывать функцию таймера. Как-то так
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  10. #130
    Аватар для Kazoox
    Пользователь

    Статус
    Оффлайн
    Регистрация
    25.04.2014
    Сообщений
    121
    Репутация:
    3 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Ну, если верить ^_^, сервер начнёт виснуть, если код функции не успеет обработаться, но время для повторного вызова таймера опять наступит (хотя такое возможно только если сервер считает вызов таймерной функции своей первостепенной задачей и все прочие команды отодвигает на второй план).
    То бишь, примерно так выглядит "очередь" в серверной машине

    Действия (1,2 и т.п.) никак не связаны с таймером, который мы описываем.
    И вот что случается, если сервер не успевает обработать код функции (описываю на той же схеме)

    Это пример полного зависания сервера. А лаги, как я понимаю, получаются когда функция обрабатывается за время, близкое к одной секунде и сервер успевает сделать всего пару-тройку других действий, прежде чем его опять заставляют выполнять код таймера.

    Если же вызов таймера сделать внутри самого таймера, то сервер не начнёт отсчёт для повторного вызова функции пока не закончит обработку всего кода, вызываемого таймером => после обработки кода у сервера появится, в случае с секундным таймером, целая секунда для того, чтоб дальше обрабатывать другие данные и только потом он опять начнёт обрабатывать функцию таймера. Как-то так
    На самом деле отличный ответ, многим бы пригодилась данная информация. Благодарю.
    Попробую тогда для начала "разбить" секундный таймер по 500 мс.

    Спрошу еще разок по поводу антирекламы простенькой:
    PHP код:
    new iAR;
        for(
    strlen(...) - 1!= -1i--)
        {
            switch(...)
            {
                case 
    '0'..'9'AR++;
                default: continue;
            }
        }
        if(
    AR кол-во цифрнаказываем... 
    Есть какой-нибудь вариант побыстрее или это оптимальный?

    Цитата Сообщение от DeimoS Посмотреть сообщение
    Эмм, ну предложу такую реализацию
    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;
    }
    Собственно я нашёл в чем у меня была проблема и погрешность была настолько велика, но тем не менее погрешность в ~100 мс чувствуется, за час система может "опаздывать" уже на 3-4 минуты. Так вот, можно ведь поставить интервал не 1000 а 950, золотая середина с небольшой погрешностью. Меня интересует стоит ли вот так делить таймер на 4 вызова или лучше оставить систему в покое но с небольшой погрешностью, то есть стоит ли оно того? Да всего пару проверок, нагрузке взяться неоткуда, но а если онлайн будет там с 500 человек, допустим, это каждые 250 мс будет вызываться...
    Последний раз редактировалось DeimoS; 13.03.2016 в 10:38.

 

 
Страница 13 из 133 ПерваяПервая ... 3 11 12 13 14 15 23 63 113 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 2 (пользователей: 0 , гостей: 2)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •