SA-MP Forums Archive
Оптимизация кода - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: Non-English (https://sampforum.blast.hk/forumdisplay.php?fid=9)
+--- Forum: Languages (https://sampforum.blast.hk/forumdisplay.php?fid=33)
+---- Forum: Русский/Russian (https://sampforum.blast.hk/forumdisplay.php?fid=32)
+---- Thread: Оптимизация кода (/showthread.php?tid=153915)

Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13


Re: Оптимизация кода - DrSlett - 27.01.2013

PHP код:
strdel(Name[playerid], 0MAX_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], 0MAX_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"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




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


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
Тоже добавил у себя метод работы.


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; локальный?
//-------------------
Почитал, разобрался.