1. Benza04.05.2025 в 11:44от
Загрузка...

[ Урок ] Оптимизация циклов max_players

Тема в разделе "Grand Theft Auto", создана пользователем _ArSen_, 22.06.2012.

  1. _ArSen_

    _ArSen_

    Статус:
    Оффлайн
    Регистрация:
    10.01.12
    Сообщения:
    285
    Репутация:
    101 +/-
    Здравствуйте!
    - - -
    Не так давно поднимался вопрос об оптимизации циклов вида:
    PHP:
    for(new i=0;i<MAX_PLAYERS;i++)
    { ... }
    Не для кого не секрет, что MAX_PLAYERS определяется в a_samp.inc и равна 500.
    Раньше я использовал вот такую манипуляцию:
    PHP:
    #if defined MAX_PLAYERS
    #undef MAX_PLAYERS
    #define MAX_PLAYERS 100
    #else
    #define MAX_PLAYERS 100
    #endif
    Это конечно давало некоторый прирост, но я пошел еще дальше!
    Первой идеей было использовать функцию GetMaxPlayers(), но это никак не помогло бы: на сервере могут быть всего 3 игрока, ид которых 0, 7 и 28, и циклу приходилось бы совершать 28 тактов.
    - - -
    К сожалению, в pawn нельзя создавать динамические массивы, поэтому я придумал использовать что-то вроде псевдодинамического массива для хранения ид подключенных игроков. Создал глобальный масив:
    PHP:
    new PLIDs[MAX_PLAYERS];
    Далее я ввел переменную содержащую количество игроков на сервере:
    PHP:
    new MaxPlayers 0;
    Очистим весь массив PLIDs при инициализации мода OnGameModInit:
    PHP:
    for(new i=0;i<sizeof(PLIDs);i++){PLIDs[i] = -1;}
    Теперь надо добавить в паблик OnPlayerConnect необходимые операции с глобальными переменными:
    PHP:
    PLIDs[MaxPlayers] = playerid;
    MaxPlayers++;
    Все довольно просто - игрок подключается, и его ИД помещается в последнюю свободную ячейку массива PLIDs, ну а переменная MaxPlayers становится на единицу больше.
    С пабликом OnPlayerDisconnect все немного сложнее. Игрок выходит, тоесть слот в PLIDs который занимала его ИД надо очистить. Но мне не нужен пустой слот, поэтому я присваиваю ему значение самого последнего слота PLIDs, и вот последний уже очищаю:
    PHP:
    for(new i=0;i<MaxPlayers;i++)
    {
        if(
    PLIDs[i] == playerid)
        {
            
    MaxPlayers--;
            
    PLIDs[i] = PLIDs[MaxPlayers];
            
    PLIDs[MaxPlayers] = -1;
            break;
        }
    }
    - - -
    Все, теперь вы можете оптимизировать массивы.
    Пример:
    Пусть был массив:
    PHP:
    for(new i=0;i<MAX_PLAYERS;i++)
    {
        if(!
    IsPlayerConnected(i)){continue;}
        
    SendClientMessage(i, -1"Message");
    }
    После оптимизации:
    PHP:
    for(new i=0;i<MaxPlayers;i++)
    {
        
    SendClientMessage(PLIDs[i], -1"Message");
    }
    - - -
    Плюсы данного метода:
    - отсутствуют лишние такты циклов
    - не требуется проверять подключен ли игрок

    Минусы:
    - меняется порядок ИД игроков при выполнении циклов

    - - -
    Вот и все, отписываетесь о багах если таковые найдутся!

    Автор: OFFREAL
     
  2. nomad682

    nomad682

    Статус:
    Оффлайн
    Регистрация:
    21.12.11
    Сообщения:
    123
    Репутация:
    29 +/-
    эээммм...извиняюсь за нубство и куда это присунуть?
     
  3. _ArSen_

    _ArSen_

    Статус:
    Оффлайн
    Регистрация:
    10.01.12
    Сообщения:
    285
    Репутация:
    101 +/-
    Себе в мод/скрипт...
     
  4. makcaka

    makcaka

    Статус:
    Оффлайн
    Регистрация:
    26.11.11
    Сообщения:
    83
    Репутация:
    8 +/-
    Спс, посмотрим
     
  5. Maks_WBC

    Maks_WBC

    Статус:
    Оффлайн
    Регистрация:
    02.11.12
    Сообщения:
    143
    Репутация:
    133 +/-
    Спс другу помогло
     
  6. SEVIKO

    SEVIKO

    Статус:
    Оффлайн
    Регистрация:
    05.09.12
    Сообщения:
    73
    Репутация:
    38 +/-
    Спасибо
     
  7. Fallen13

    Fallen13

    Статус:
    Оффлайн
    Регистрация:
    30.11.12
    Сообщения:
    14
    Репутация:
    0 +/-
    Сокращает и размер массивов плана MAX_PLAYERS. Любителям оптимизации пригодится.
     
  8. baursak007

    YouHack Forever
    baursak007

    Статус:
    Оффлайн
    Регистрация:
    14.10.12
    Сообщения:
    567
    Репутация:
    365 +/-
    Спс, посмотрим
     
  9. baursak007

    YouHack Forever
    baursak007

    Статус:
    Оффлайн
    Регистрация:
    14.10.12
    Сообщения:
    567
    Репутация:
    365 +/-
    +1
     
  10. baursak007

    YouHack Forever
    baursak007

    Статус:
    Оффлайн
    Регистрация:
    14.10.12
    Сообщения:
    567
    Репутация:
    365 +/-
    не помогло другу-)