27.01.2013, 16:58
PHP код:
strdel(Name[playerid], 0, MAX_PLAYER_NAME);
PHP код:
Name[playerid] = 0;
strdel(Name[playerid], 0, MAX_PLAYER_NAME);
Name[playerid] = 0;
Ограничиваем использование GetPlayerVehicleID и IsPlayerInAnyVehicle, тем самым сберегая немного трафика. Это мелочи, но при большом онлайне, когда многие используют команды, связанные с этими функциями, получаются уже какие-никакие, но сетевые затраты. А тут уже всё хранится будет в массиве и достаточно только к элементу обратиться.
|
Во-первых, вызов команды ещё не означает обращение к клиенту, у сервера есть "пул" данных к каждому клиенту, который периодически обновляется клиентом, и все функции работают с этим "пулом".
Во-вторых, данная оптимизация это бесполезная трата времени и памяти, так что оставьте эту затею. В-третьих, даже при большом онлайне данная функция не будет вызываться так часто что вызовет лаги, не там вы проблему ищите. да. Только вместо нуля используйте EOS. |
приветствую
представим систему с домами, а именно входы в них вход по команде, или кнопке - не суть, главное что не автоматический. for(перебор домов) if(стоит на входе) входим если домов много, стоит ли это менять на onplayerpickuppickup if(пикап дома) lastpickup=номер дома а в команде входа проверять if(lastpickup==номер дома) входить в дом т.е. по сути в исходном случае идет проверка координат, несколько сотен isplayerinrangeofpoint а во втором всего лишь сравнение простых чисел, ида икапа |
#include <a_samp>
new state;
public OnGameModeInit()
{
SetTimer("TimerW", 250, 1);
return 1;
}
public TimerW()
{
for(new i=state; i<MAX_PLAYERS;i+=4)
{
//.....
}
if(state == 3)state=0;else state++;
}
1) 0,4,8,12 2) 1,5,9,13 3) 2,6,10,14 4) 3,7,11,15 |
Возьмём классический пример: таймер на 1000 мс и прогон всех игроков. Чтобы не вызывать тормозов можно распределить нагрузку. Разобьём одни большой прогон на 4 части, таймер уменьшим в 4 раза, т.е. не 1000 а 250.
PHP код:
|
#include <a_samp>
public OnGameModeInit()
{
SetTimer("TimerF", 250, 1);
}
forward TimerF();
public TimerF()
{
static st;
for(new plus = st; st < (MAX_PLAYERS/4)+plus; st++)
{
printf("%d", st);
}
if(st >= MAX_PLAYERS-1) st = 0;
}
1) 0, 1, 2, 3 2) 4, 5, 6, 7 3) 8, 9, 10, 11 4) 12, 13, 14, 15 |
Смысл классического секундного таймера в том, что для каждого игрока таймер должен проходить раз в секунду. С таким раскладом таймер должен выглядеть так
pawn Код:
|
А вот теперь изюминка. Ты каждые 250 мс будешь проверять MAX_PLAYERS а я MAX_PLAYERS/4
Даже если ты static st; вынесешь то у тебя лишних действий много. |
#include <a_samp>
#undef MAX_PLAYERS
#define MAX_PLAYERS 20
new timer;
public OnGameModeInit()
{
timer = SetTimer("TimerF", 250, 1);
}
forward TimerF();
public TimerF()
{
printf("%i", GetTickCount());
static st;
for(new plus = st; st < (MAX_PLAYERS/4)+plus; st++)
{
printf("%d", st);
if(st >= MAX_PLAYERS-1) { KillTimer(timer); return; }
}
}
[23:13:49] 6846633 [23:13:49] 0 [23:13:49] 1 [23:13:49] 2 [23:13:49] 3 [23:13:49] 4 [23:13:49] 6846926 [23:13:49] 5 [23:13:49] 6 [23:13:49] 7 [23:13:49] 8 [23:13:49] 9 [23:13:49] 6847219 [23:13:49] 10 [23:13:49] 11 [23:13:49] 12 [23:13:49] 13 [23:13:49] 14 [23:13:50] 6847512 [23:13:50] 15 [23:13:50] 16 [23:13:50] 17 [23:13:50] 18 [23:13:50] 19 |