Оптимизация кода

PHP код:
strdel(Name[playerid], 0MAX_PLAYER_NAME); 
и
PHP код:
Name[playerid] = 0
не то же ли самое?
Reply

DrSlett, дельное замечание. В таком случае, действительно можно задать вопрос "зачем всё это", смотря на pLastVeh.
stabker, всегда так делал, только в OnPlayerDisconnect можно даже не очищать Name[playerid].
stepashka, да, затея была действительно глупой, но благодаря ответам форумчан мои знания чуть расширились.
Reply

Quote:
Originally Posted by anybox
Посмотреть сообщение
Ограничиваем использование GetPlayerVehicleID и IsPlayerInAnyVehicle, тем самым сберегая немного трафика. Это мелочи, но при большом онлайне, когда многие используют команды, связанные с этими функциями, получаются уже какие-никакие, но сетевые затраты. А тут уже всё хранится будет в массиве и достаточно только к элементу обратиться.
Во-первых, вызов команды ещё не означает обращение к клиенту, у сервера есть "пул" данных к каждому клиенту, который периодически обновляется клиентом, и все функции работают с этим "пулом".
Во-вторых, данная оптимизация это бесполезная трата времени и памяти, так что оставьте эту затею.
В-третьих, даже при большом онлайне данная функция не будет вызываться так часто что вызовет лаги, не там вы проблему ищите.

Quote:
Originally Posted by DrSlett
Посмотреть сообщение
PHP код:
strdel(Name[playerid], 0MAX_PLAYER_NAME); 
и
PHP код:
Name[playerid] = 0
не то же ли самое?
да. Только вместо нуля используйте EOS.
Reply

Quote:
Originally Posted by anybox
Посмотреть сообщение
stabker, всегда так делал, только в OnPlayerDisconnect можно даже не очищать Name[playerid].
Можно, я не очищаю у себя в моде, т.к. оно там не пылиться. Это скорее от онлайна зависит.
Reply

Quote:
Originally Posted by Stepashka
Посмотреть сообщение
Во-первых, вызов команды ещё не означает обращение к клиенту, у сервера есть "пул" данных к каждому клиенту, который периодически обновляется клиентом, и все функции работают с этим "пулом".
Во-вторых, данная оптимизация это бесполезная трата времени и памяти, так что оставьте эту затею.
В-третьих, даже при большом онлайне данная функция не будет вызываться так часто что вызовет лаги, не там вы проблему ищите.

да. Только вместо нуля используйте EOS.
В чем отличие EOS'a от 0? Ведь по сути EOS и есть тот самый 0.
Reply

Quote:
Originally Posted by Maikkk
Посмотреть сообщение
В чем отличие EOS'a от 0? Ведь по сути EOS и есть тот самый 0.
Удобством последующего чтения кода программистом.
Reply

Quote:
Originally Posted by Maikkk
Посмотреть сообщение
В чем отличие EOS'a от 0? Ведь по сути EOS и есть тот самый 0.
Нет, EOS - по сути спецсимвол, означающий конец строки. Хотя в некоторых языках действительно используют #define EOS 0 .
Reply

приветствую
представим систему с домами, а именно входы в них
вход по команде, или кнопке - не суть, главное что не автоматический.

for(перебор домов)
if(стоит на входе)
входим

если домов много, стоит ли это менять на

onplayerpickuppickup
if(пикап дома)
lastpickup=номер дома

а в команде входа проверять
if(lastpickup==номер дома)
входить в дом

т.е. по сути в исходном случае идет проверка координат, несколько сотен isplayerinrangeofpoint
а во втором всего лишь сравнение простых чисел, ида икапа
Reply

Quote:
Originally Posted by hub4
Посмотреть сообщение
приветствую
представим систему с домами, а именно входы в них
вход по команде, или кнопке - не суть, главное что не автоматический.

for(перебор домов)
if(стоит на входе)
входим

если домов много, стоит ли это менять на

onplayerpickuppickup
if(пикап дома)
lastpickup=номер дома

а в команде входа проверять
if(lastpickup==номер дома)
входить в дом

т.е. по сути в исходном случае идет проверка координат, несколько сотен isplayerinrangeofpoint
а во втором всего лишь сравнение простых чисел, ида икапа
шило на мыло меняете, во втором случае вам так же придется перебирать массив домов и сравнивать ID поднятого пикапа с ID пикапа привязанного к дому.
Reply

Если пикап запоминает ид дома, то второй случай правильный.
Reply

Возьмём классический пример: таймер на 1000 мс и прогон всех игроков. Чтобы не вызывать тормозов можно распределить нагрузку. Разобьём одни большой прогон на 4 части, таймер уменьшим в 4 раза, т.е. не 1000 а 250.

PHP код:
#include <a_samp>
new state;
public 
OnGameModeInit()
{
    
SetTimer("TimerW"2501);
    return 
1;
}
public 
TimerW()
{
    for(new 
i=statei<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

Reply

Quote:
Originally Posted by White_116
Посмотреть сообщение
Возьмём классический пример: таймер на 1000 мс и прогон всех игроков. Чтобы не вызывать тормозов можно распределить нагрузку. Разобьём одни большой прогон на 4 части, таймер уменьшим в 4 раза, т.е. не 1000 а 250.

PHP код:
new state;
public 
TimerE()
{
    for(new 
i=statei<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: Не рассмотрел твой код, исправил свой.
Reply

Ого, никогда думал об этом, интересно. Так даже проще
Reply

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: Не рассмотрел твой код, исправил свой.
Все ровно не работает.
Reply

Quote:
Originally Posted by White_116
Посмотреть сообщение
То что вы написали вообще не работает. Прошу внимательно ознакомиться с мои примером.
Да, мой код в конечном итоге работает так же, просто не досмотрел.
Свой исправил, теперь все работает.
Reply

Сделал более мене правдоподобный код. Метод работы чуть ниже. Каждый игрок будет проверен ровно через секунду!
Reply

Quote:
Originally Posted by White_116
Посмотреть сообщение
Сделал более мене правдоподобный код. Метод работы чуть ниже. Каждый игрок будет проверен ровно через секунду!
Все работает у меня, правда при MAX_PLAYERS больше 3
Тоже добавил у себя метод работы.
Reply

А вот теперь изюминка. Ты каждые 250 мс будешь проверять MAX_PLAYERS а я MAX_PLAYERS/4
Даже если ты static st; вынесешь то у тебя лишних действий много.
Reply

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 раз при запуске мода, потом таймер убивается.
Reply

Во всяком случае у меня мозг закипел, как это у вас всё работает когда static st; локальный?
//-------------------
Почитал, разобрался.
Reply


Forum Jump:


Users browsing this thread: 3 Guest(s)