Главная | Комментарии | О проекте
Чтение RSS
Суперсайт
Главная Контакты Карта сайта Добавить в избранное
  • Кто OnLine

    Всего на сайте: 6
    Гостей: 3
    Пользователи: - отсутствуют
    Роботы: Google AdSense, crawl Bot, Yahoo Bot

    Опрос пользователей

    Для какого мода Вы пишите плагины?

    • Популярное

    Рекомендуем

    • AMX Mod X
    • up.org.ua

    Наши друзья


  • Автор: Safety1st Дата: 26-08-2014, 08:01 Просмотров: 4466

    Некоторые функции, особенно нагружающие сервер

    Внимание! 'Статья' - это по сути комментарий, который не уместился. Раскрыто от силы 5% материала. Вопросы, пожелания и предложения в комментариях приветствуются.


    sibas
    Если можно, хорошо было бы составить список команд, функций, форвардов которые нагружают сервер.

    sibas, ага) А вторую сразу же - с наиболее распространёнными примерами, когда можно обойтись без дикой нагрузки xD Жаль, нет времени.

    Всё в той или иной степени нагружает сервер) Главное вот что: ощутимую нагрузку создаёт то, что выполняется в плагине многократно за секунду.

    Особенно нагрузочные форварды из комплекта AMXX:
    // engine
    client_PostThink()
    client_PreThink()
    server_frame()
    client_cmdStart()

    // fakemeta
    FM_PlayerPreThink
    FM_PlayerPostThink
    FM_CmdStart
    FM_CmdEnd
    FM_AddToFullPack
    FM_UpdateClientData

    // ham sandwich
    Ham_Player_PreThink
    Ham_Player_PostThink

    Лидирует в этом списке, безусловно, FM_AddToFullPack - этот форвард выполняется просто с космической скоростью: порядка 10000 раз в секунду. Затем идёт server_frame() - число вызовов равно FPS сервера, остальные перечисленные форварды выполняются порядка 50-100 раз в секунду.

    Есть простой способ определить число выполнений функции:
    // algorithm by Asdmodai

    // инклуды

    #define INTERVAL 1    // how frequently print info; in seconds

    new giCounter

    public plugin_init() {
        // регим форвард, если нужно
        // <> TargetForward <>

        set_task( INTERVAL.0, "PrintRate", .flags = "b" )
    }

    public TargetForward() {
        giCounter++
    }

    public PrintRate() {
        server_print( "Current rate: %d", giCounter / INTERVAL )
        giCounter = 0
    }

    На примере форварда server_frame:
    #include <amxmodx>
    #include <engine>

    #define INTERVAL 1    // how frequently print info in seconds

    new giCounter

    public plugin_init() {
        set_task( INTERVAL.0, "PrintRate", .flags = "b" )
    }

    public server_frame() {
        giCounter++
    }

    public PrintRate() {
        server_print( "Current server_frame() rate: %d", giCounter / INTERVAL )
        giCounter = 0
    }

    Интервал показаний 1 с (sys_ticrate 100):
    Current forward rate: 102
    Current forward rate: 102
    Current forward rate: 91
    Current forward rate: 102
    Current forward rate: 92
    Current forward rate: 100
    Current forward rate: 89
    Current forward rate: 100
    Current forward rate: 101
    Current forward rate: 91
    Current forward rate: 100
    Current forward rate: 100
    Current forward rate: 90
    Current forward rate: 100

    Интервал 5 с даёт усреднённые значения:
    Current forward rate: 100
    Current forward rate: 98
    Current forward rate: 99
    Current forward rate: 98
    Current forward rate: 97
    Current forward rate: 98
    (и не спрашивайте, почему именно такие средние значения: эти данные выдал сервер xD)

    Таким макаром и выясняйте для себя частоту выполнения той или иной функции.
    Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
    Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
    Некоторые функции, особенно нагружающие сервер
    sibas

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    Спасибо огромное. Сразу же возник вопрос: Все эти функции, а точнее спрошу про часто используемый PreThink(не важно из какого модуля) лучше тогда вообще не использовать? Просто бывают такие плагины которые без prethink будут плохо а то и вообще работать не будут. И что же тогда делать? Удалять и не использовать эти плагины? В пример можно взять плагин multiJump
    Safety1st

    5.08.2014
    ICQ: --
    Публикаций: 8
    Комментариев: 42
    Репутация: -  9  +

    Если есть способ решить задачу без нагрузочных функций - конечно же, стоит предпочесть его. Да, есть такие ситуации, где без многократной проверки за секунду не обойтись: когда нет возможности по-иному выполнить действие строго в нужный момент. Но во многих случаях, как мне кажется, только от незнания другого, более эффективного способа, форварды выше используются. А где без них не обойтись - их зачастую достаточно регистрировать на время: FM и Ham это позволяют.


    Цитата: sibas
    В пример можно взять плагин multiJump

    Не знаю, что там за код, и не горю желанием узнать) Приведу примеры из моей практики:
    • скорость выставляется в client_PreThink(). Правильно - ставить в те моменты, когда она действительно меняется игрой, используя форвард Ham_CS_Player_ResetMaxSpeed.
    • замедление прыгнувшего игрока выставляется в client_PreThink(). Я переделал выставление на использование форварда Ham_Player_Jump : он срабатывает, только пока у игрока нажата клавиша прыжка.
    • информер в JB вычисляет число мёртвых/живых и формирует текст каждую секунду. без ущерба заново вычислять стоит, только когда что-то из информации поменялось: игрок заспавнился/умер/отключился, закончился свободный день, появился бунтующий зэк и т.д.
    • регенерацию здоровья для всех игроков на сервере можно сделать без тасков/think'ов: создать entity trigger_hurt по размеру карты, которая будет игрокам hp пополнять, сама игра будет это делать...

    Цитата: sibas
    Удалять и не использовать эти плагины?

    Если из-за них сервер 'лагает' - безусловно) Особенно если речь идёт о различных эффектах.
    --------------------
    sibas

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    Safety1st, замедление прыгнувшего игрока выставляется в client_PreThink(). Я переделал выставление на использование форварда Ham_Player_Jump : он срабатывает, только пока у игрока нажата клавиша прыжка.

    То есть даже если я использую client_prethink но но в нём ставлю условие то prethink якобы не работает(в плагине) пока не пройдёт условие?

    допустим
    public client_prethink(id)
    {
          if(V_RYKE_GRANATA(id))
          {
           // код
           }
    }

    Значит client_prethink не будет вообще работать и нагружать сервер если у игрока в руке нет гранаты?
    Safety1st

    5.08.2014
    ICQ: --
    Публикаций: 8
    Комментариев: 42
    Репутация: -  9  +

    Сам client_PreThink() вызывается всегда. А проверка выше действительно помогает избежать лишней нагрузки, 'если у игрока в руке нет гранаты'. Но всё же за секунду форвард на 32-х слотовом сервере срабатывает порядка 300 раз и столько же раз вызывается проверка. Хотя бы V_RYKE_GRANATA стоит запоминать, а не получать текущее оружие игрока заново.
    --------------------
    sibas

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    Safety1st
    Хотя бы V_RYKE_GRANATA стоит запоминать, а не получать текущее оружие игрока заново.
    ,

    Простите за нескромный вопрос, но как?
    Еще бы хотел узнать как на время регистрировать через FM и Ham
    Safety1st

    5.08.2014
    ICQ: --
    Публикаций: 8
    Комментариев: 42
    Репутация: -  9  +

    sibas, эти частные вопросы уже за рамками сайта)
    За помощью обратитесь на форум AMX-X.
    --------------------
    артист

    2.10.2012
    ICQ: --
    Публикаций: 3
    Комментариев: 154
    Репутация: -  7  +

    server_frame() наверное 1 место, ибо 1000 вызовов в секунду(зависит от фпс сервера...)

    #include <amxmodx>
    #include <engine>

    new Float:bla, blay

    public server_frame()
    {
        static Float:gametime; gametime = get_gametime()
        
        if(bla <= gametime)
        {
            client_print(0, print_chat, "server fps %i", blay)
            blay = 0
            bla = gametime + 1.0
        }
        else blay++
    }


    П.с. не увидел FM_AddToFullPack wink

    Информация

    Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
Наверх

Реклама