Перегружаемые функции

Сообщения
10
Реакции
6
Добрый день/вечер уважаемые пользователи.
Хочу узнать, есть ли способы избежать подобных функций:
C++:
// 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
Я составил список плагинов (которые стоят на моем сервере), в которых используются часть этих функций, и из-за чего могут происходить полные/частичные зависания, или подтормаживание сервера (даже поднятие 'пинга', хотя я могу ошибаться).

CSS:
client_PostThink()
    Система вип:
        zmvip.sma

client_PreThink()
    Класс зомби:
        zp_Jack_FrostFire.sma
        zp_class_crow.sma (не используется в сборке)

FM_PlayerPreThink
    Мод:
        zombie_plague40.sma

    Класс зомби:
        Banchee.sma
        zp_class_oxidation.sma
        zp_class_climb.sma

    Ножики:
        Knife_hummer.sma
        Knife_katana.sma
        Knife_souleater.sma
        Knife_sword.sma
        Knife_tomahawk.sma
        Knife_two_blades.sma

    Парашют:
        zp_sub_parachute.sma
   
    Джет-Пак:
        zp_jetpack_new.sma

FM_CmdStart
    Мод:
        zombie_plague40.sma

    Оружие:
        M32.sma
        azp_weapon_infi.sma
        azp_weapon_mg36.sma
        weapon_arx.sma
        zp_bazooka_new.sma
        azp_weapon_balrog7.sma
        azp_weapon_k1asus.sma
        zp_extra_bullet.sma

    Режим гранат:
        nademodes.sma
   
    Класс зомби:
        zp_class_blink.sma
        cso_zclass_shaman.sma

FM_UpdateClientData
    Оружие:
        zp_weapon_dmp7_1.sma
        azp_weapon_acrb.sma
        azp_weapon_infi.sma
        azp_weapon_mg36.sma
        azp_weapon_sprifle.sma
        azp_weapon_vsk94.sma
        cso_extra_ak47_blackstar.sma
        M32.sma
        weapon_arx.sma
        zp_extra_items_plasmagun.sma
        zp_weapon_pulser.sma
        azp_weapon_balrog7.sma
        azp_weapon_k1asus.sma
        azp_weapon_kriss.sma
        azp_weapon_sfgun.sma
        azp_weapon_trg42g.sma
        azp_weapon_xm2010.sma
        zp_extra_bullet.sma

Ham_Player_PreThink
    Режим гранат:
        nademodes.sma

Возьмем код плагина zmvip.sma для доп. прыжка (знаю что подобных плагинов было создано миллион +1, но других способов реализации я не видел), в основном все используют
client_PreThink() и client_PostThink()
C++:
public client_PostThink(id)
{
    if(!is_user_alive(id))
        return PLUGIN_CONTINUE;

    if(!access(id, ADMINACCESS))
        return PLUGIN_CONTINUE;

    if(dojump[id] == true)
    {
        new Float:velocity[3]
        entity_get_vector(id, EV_VEC_velocity, velocity)
        velocity[2] = random_float(265.0, 285.0)
        entity_set_vector(id, EV_VEC_velocity, velocity)
        dojump[id] = false
        return PLUGIN_CONTINUE
    }

    return PLUGIN_CONTINUE
}
Как избежать использование client_PostThink() ?
client_PreThink() я поменял на RegisterHam(Ham_Player_Jump, "player", "OnJump");

Или вот еще функция в плагине "Парашют" - register_forward(FM_PlayerPreThink, "fw_PreThink");
 

Download all Attachments

Последнее редактирование:
Сообщения
169
Реакции
462
Помог
2 раз(а)
Название темы некорректное. Перегружаемые функции - это другое.
Как избежать использование
Какого-то универсального "рецепта" нет. Зависит от конкретного кейса. В 9 случаях из 10 полностью избежать использования вряд ли получится (если, конечно, автор плагина не нуб и знал, что делает).
Можно попробовать оптимизировать код в этих форвардах.
 
Сообщения
1,293
Реакции
2,294
Помог
57 раз(а)
Прыжок RG_CBasePlayer_Jump
Парашют RG_PM_AirMove
 
Сообщения
1,042
Реакции
206
Предупреждения
1
Помог
6 раз(а)
Конечно будут зависания и подтормаживание сервера с таким плагинами.
 

d3m37r4

111111
Сообщения
1,451
Реакции
1,177
Помог
10 раз(а)
Сообщения
1,042
Реакции
206
Предупреждения
1
Помог
6 раз(а)
d3m37r4, Да я знаю, что нет.
Все равно никуда не деться от использования этих функций.
Если только копать еще глубже.
 

d3m37r4

111111
Сообщения
1,451
Реакции
1,177
Помог
10 раз(а)
BiZaJe, тогда к чему сообщение выше, если этот пост ему противоречит?)
Эти функции нужно использовать с умом, так же как и все остальные.
 
Сообщения
1,042
Реакции
206
Предупреждения
1
Помог
6 раз(а)
BiZaJe, тогда к чему сообщение выше, если этот пост ему противоречит?)
Эти функции нужно использовать с умом, так же как и все остальные.
Чтобы просто было :)
Да не то, что с умом, а с особой осторожностью
 
Сообщения
212
Реакции
334
Помог
3 раз(а)
В основном никак не избежать. И это нормально, потому что реализация подобных вещей всегда требует очень частых покадровых вызовов. Даже если взглянуть под капот движка, то там наглядно видно, что эти события, грубо говоря, делают игру. Передвижения игрока, контроль оружия, стрельба с него, синхронизация клиента и сервера — всё происходит покадрово. Даже задачи set_task используют server_frame, иначе нельзя контролировать задачи с задержкой во времени, они требуют постоянной частой проверкой на то, пришло ли их время или нет.
Обработчики можно оптимизировать. Оптимизировать можно сокращением количества нативных вызовов, огранизацией кеширования на стороне плагина, в крайнем случае можно перенести тяжелый обработчик события в модуль (но это так, для продвинутых).
 
Сообщения
10
Реакции
6
Xelson, Возможно я поспешил с выводом о том, что функции которые есть в плагинах нагружают сервер до того состояния, что происходят частые/переодические зависания на сервере в плоть до вылета с игры. Сегодня я тестировал сборку на myarena с другом, у него 'вообще' небыло подвисаний и т.п, в то время как у меня дико 'висло' и выкидывало с игры, пинг до 2000 поднимался, позже выяснилось, причиной стала плохая скорость интернета.
 
Сообщения
7
Реакции
4
В парашюте можно prethink заменить на ham_objectcaps (вызывается каждый кадр, когда нажата клавиша 'E' /+use)
 

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

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу