Вот тема л3, там есть интересное сообщение
PHP код:
if (isAttackReady(BASE_ATTACK))
{
if (!IsWithinMeleeRange(victim))
{
setAttackTimer(BASE_ATTACK, 100);
if (m_swingErrorMsg != 1) // send single time (client auto repeat)
{
SendAttackSwingNotInRange();
m_swingErrorMsg = 1;
}
}
//120 degrees of radiant range, if player is not in boundary radius
else if (!IsWithinBoundaryRadius(victim) && !HasInArc(2 * float(M_PI) / 3, victim))
{
setAttackTimer(BASE_ATTACK, 100);
if (m_swingErrorMsg != 2) // send single time (client auto repeat)
{
SendAttackSwingBadFacingAttack();
m_swingErrorMsg = 2;
}
}
else
{
m_swingErrorMsg = 0; // reset swing error state
// prevent base and off attack in same time, delay attack at 0.2 sec
if (haveOffhandWeapon())
if (getAttackTimer(OFF_ATTACK) < ATTACK_DISPLAY_DELAY)
setAttackTimer(OFF_ATTACK, ATTACK_DISPLAY_DELAY);
// do attack
AttackerStateUpdate(victim, BASE_ATTACK);
resetAttackTimer(BASE_ATTACK);
}
}
Тоесть после готовности таймера автоатаки, сервер делает проверку на возможность атаки ренжа, проверку на лос и наличие цели перед лицом (выделил красным проверки и событие сброса таймера автоатаки), а это все обращения к координатам через базу данных. И только после этого наностися урон и сбрасывается таймер автоатаки. Возможно, данные обращения к координатам и вызывают задержку. Но я все равно не могу понять, почему эта задержка всегда статична и не изменяется от кол-ва онлайна. В общем, надеюсь вы найдете причину задержки и найдете возможность от неё избавиться или по крайней мере снизить до приемлемых значений.
Честно говоря не понимаю почему сервер обращается к бд при проверке на рейндж и фронт, это как-то нелогично, мб он ошибся, а вот при обращении на возможность лоса вполне может быть.
В общем сделал такой тест: запустил 4 ака с одного компа, 2 на х5, и 2 на птр, и практически одновременно отправил бить манекен


Это х5
28*60=1680 секунд боя
1680/3=560 должно быть атак со скоростью 3 сек
получилось 544 и 1551 ударов соостветсвнно
560-544=16 зажеванных атак
1680-1551=129 зажеванных атак
16*3/544=0,08823 сек или 88,23 мс потеря времени при каждой атаке
129/1551=0,08317 сек или 83,17 мс потеря времени при каждой атаке


Это птр
28*60=1680 секунд боя
1680/3=560должно быть атак со скоростью 3 сек
получилось 549 и 1642 ударов соостветсвнно
560-549=11 зажеванных атак
1680-1642=38 зажеванных атак
11*3/549=0,06066 сек или 60,66 мс потеря времени при каждой атаке
38/1642=0,02314 сек или 23,14 мс потеря времени при каждой атаке
Сложно сказать почему зажеванных атак получилось меньше всего у кота на птр, потом я еще провел пару тестов, и задержка у кота на птр была так же 60 мс.
Я вначале думал что это из-за приоритетов виндоуса, когда одно окно свернуто, а другое нет, но оказалось это здесь не причем.
Может действительно дело в обращении ядра к бд при проверке на лос