Re: Оптимизация кода -
DrSlett - 27.01.2013
PHP код:
strdel(Name[playerid], 0, MAX_PLAYER_NAME);
и
PHP код:
Name[playerid] = 0;
не то же ли самое?
Re: Оптимизация кода -
anybox - 27.01.2013
DrSlett, дельное замечание. В таком случае, действительно можно задать вопрос "зачем всё это", смотря на pLastVeh.
stabker, всегда так делал, только в OnPlayerDisconnect можно даже не очищать Name[playerid].
stepashka, да, затея была действительно глупой, но благодаря ответам форумчан мои знания чуть расширились.
Re: Оптимизация кода -
Stepashka - 27.01.2013
Quote:
Originally Posted by anybox
Ограничиваем использование GetPlayerVehicleID и IsPlayerInAnyVehicle, тем самым сберегая немного трафика. Это мелочи, но при большом онлайне, когда многие используют команды, связанные с этими функциями, получаются уже какие-никакие, но сетевые затраты. А тут уже всё хранится будет в массиве и достаточно только к элементу обратиться.
|
Во-первых, вызов команды ещё не означает обращение к клиенту, у сервера есть "пул" данных к каждому клиенту, который периодически обновляется клиентом, и все функции работают с этим "пулом".
Во-вторых, данная оптимизация это бесполезная трата времени и памяти, так что оставьте эту затею.
В-третьих, даже при большом онлайне данная функция не будет вызываться так часто что вызовет лаги, не там вы проблему ищите.
Quote:
Originally Posted by DrSlett
PHP код:
strdel(Name[playerid], 0, MAX_PLAYER_NAME);
и
PHP код:
Name[playerid] = 0;
не то же ли самое?
|
да. Только вместо нуля используйте EOS.
Re: Оптимизация кода -
stabker - 27.01.2013
Quote:
Originally Posted by anybox
stabker, всегда так делал, только в OnPlayerDisconnect можно даже не очищать Name[playerid].
|
Можно, я не очищаю у себя в моде, т.к. оно там не пылиться. Это скорее от онлайна зависит.
Re: Оптимизация кода -
Maikkk - 27.01.2013
Quote:
Originally Posted by Stepashka
Во-первых, вызов команды ещё не означает обращение к клиенту, у сервера есть "пул" данных к каждому клиенту, который периодически обновляется клиентом, и все функции работают с этим "пулом".
Во-вторых, данная оптимизация это бесполезная трата времени и памяти, так что оставьте эту затею.
В-третьих, даже при большом онлайне данная функция не будет вызываться так часто что вызовет лаги, не там вы проблему ищите.
да. Только вместо нуля используйте EOS.
|
В чем отличие EOS'a от 0? Ведь по сути EOS и есть тот самый 0.
Re: Оптимизация кода -
dimonml - 27.01.2013
Quote:
Originally Posted by Maikkk
В чем отличие EOS'a от 0? Ведь по сути EOS и есть тот самый 0.
|
Удобством последующего чтения кода программистом.
Re: Оптимизация кода -
eakwarp - 27.01.2013
Quote:
Originally Posted by Maikkk
В чем отличие EOS'a от 0? Ведь по сути EOS и есть тот самый 0.
|
Нет, EOS - по сути спецсимвол, означающий конец строки. Хотя в некоторых языках действительно используют #define EOS 0 .
Re: Оптимизация кода -
hub4 - 01.02.2013
приветствую
представим систему с домами, а именно входы в них
вход по команде, или кнопке - не суть, главное что не автоматический.
for(перебор домов)
if(стоит на входе)
входим
если домов много, стоит ли это менять на
onplayerpickuppickup
if(пикап дома)
lastpickup=номер дома
а в команде входа проверять
if(lastpickup==номер дома)
входить в дом
т.е. по сути в исходном случае идет проверка координат, несколько сотен isplayerinrangeofpoint
а во втором всего лишь сравнение простых чисел, ида икапа
Re: Оптимизация кода -
Stepashka - 01.02.2013
Quote:
Originally Posted by hub4
приветствую
представим систему с домами, а именно входы в них
вход по команде, или кнопке - не суть, главное что не автоматический.
for(перебор домов)
if(стоит на входе)
входим
если домов много, стоит ли это менять на
onplayerpickuppickup
if(пикап дома)
lastpickup=номер дома
а в команде входа проверять
if(lastpickup==номер дома)
входить в дом
т.е. по сути в исходном случае идет проверка координат, несколько сотен isplayerinrangeofpoint
а во втором всего лишь сравнение простых чисел, ида икапа
|
шило на мыло меняете, во втором случае вам так же придется перебирать массив домов и сравнивать ID поднятого пикапа с ID пикапа привязанного к дому.
Re: Оптимизация кода -
White_116 - 01.02.2013
Если пикап запоминает ид дома, то второй случай правильный.
Re: Оптимизация кода -
White_116 - 08.03.2013
Возьмём классический пример: таймер на 1000 мс и прогон всех игроков. Чтобы не вызывать тормозов можно распределить нагрузку. Разобьём одни большой прогон на 4 части, таймер уменьшим в 4 раза, т.е. не 1000 а 250.
PHP код:
#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++;
}
Quote:
1) 0,4,8,12
2) 1,5,9,13
3) 2,6,10,14
4) 3,7,11,15
|
Re: Оптимизация кода -
Alexander_Petrov - 08.03.2013
Quote:
Originally Posted by White_116
Возьмём классический пример: таймер на 1000 мс и прогон всех игроков. Чтобы не вызывать тормозов можно распределить нагрузку. Разобьём одни большой прогон на 4 части, таймер уменьшим в 4 раза, т.е. не 1000 а 250.
PHP код:
new state;
public TimerE()
{
for(new i=state; i<MAX_PLAYERS;i+=4)
{
//.....
}
if(state == 3)state=0;else state++;
}
|
Смысл классического секундного таймера в том, что для каждого игрока таймер должен проходить раз в секунду. С таким раскладом таймер должен выглядеть так
pawn Код:
#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;
}
Quote:
1) 0, 1, 2, 3
2) 4, 5, 6, 7
3) 8, 9, 10, 11
4) 12, 13, 14, 15
|
Я вообще не вижу смысла разбивать что-то. Легче и лучше просто создавать таймер для каждого игрока.
upd: Не рассмотрел твой код, исправил свой.
Re: Оптимизация кода -
proff116 - 08.03.2013
Ого, никогда думал об этом, интересно. Так даже проще
Re: Оптимизация кода -
White_116 - 08.03.2013
Quote:
Originally Posted by Alexander_Petrov
Смысл классического секундного таймера в том, что для каждого игрока таймер должен проходить раз в секунду. С таким раскладом таймер должен выглядеть так
pawn Код:
public OnGameModeInit() { SetTimer("TimerE", 250, 0); }
public TimerE() { static state; for(new plus = state; state < (MAX_PLAYERS/4)+plus; state++) { //..... } if(state == MAX_PLAYERS-1) state = 0; SetTimer("TimerE", 250, 0); }
Я вообще не вижу смысла разбивать что-то. Легче и лучше просто создавать таймер для каждого игрока.
|
То что вы написали вообще не работает. Прошу внимательно ознакомиться с мои примером.
Quote:
Originally Posted by Alexander_Petrov
upd: Не рассмотрел твой код, исправил свой.
|
Все ровно не работает.
Re: Оптимизация кода -
Alexander_Petrov - 08.03.2013
Quote:
Originally Posted by White_116
То что вы написали вообще не работает. Прошу внимательно ознакомиться с мои примером.
|
Да, мой код в конечном итоге работает так же, просто не досмотрел.
Свой исправил, теперь все работает.
Re: Оптимизация кода -
White_116 - 08.03.2013
Сделал более мене правдоподобный код. Метод работы чуть ниже. Каждый игрок будет проверен ровно через секунду!
Re: Оптимизация кода -
Alexander_Petrov - 08.03.2013
Quote:
Originally Posted by White_116
Сделал более мене правдоподобный код. Метод работы чуть ниже. Каждый игрок будет проверен ровно через секунду!
|
Все работает у меня, правда при MAX_PLAYERS больше 3
![Cheesy](images/smilies/biggrin.png)
Тоже добавил у себя метод работы.
Re: Оптимизация кода -
White_116 - 08.03.2013
А вот теперь изюминка. Ты каждые 250 мс будешь проверять MAX_PLAYERS а я MAX_PLAYERS/4
Даже если ты
static st; вынесешь то у тебя лишних действий много.
Re: Оптимизация кода -
Alexander_Petrov - 08.03.2013
Quote:
Originally Posted by White_116
А вот теперь изюминка. Ты каждые 250 мс будешь проверять MAX_PLAYERS а я MAX_PLAYERS/4
Даже если ты static st; вынесешь то у тебя лишних действий много.
|
Недостатки в моем коде есть, но я все же остаюсь на стороне таймера для каждого игрока.
Кстати, единственный мною замеченный можно устранить, поместив проверку в цикл.
pawn Код:
#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; }
}
}
В итоге получается:
Quote:
[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
|
Это код для дебага и работает всего 1 раз при запуске мода, потом таймер убивается.
Re: Оптимизация кода -
White_116 - 08.03.2013
Во всяком случае у меня мозг закипел, как это у вас всё работает когда
static st; локальный?
//-------------------
Почитал, разобрался.