Форум Pawn-Wiki.Ru - Воплоти мечту в реальность!: Оптимизация Циклов Max_Players - Форум Pawn-Wiki.Ru - Воплоти мечту в реальность!

Перейти к содержимому

Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

[ Урок ]
Оптимизация Циклов Max_Players
Оценка: -----

#1
Пользователь офлайн   Romzes 

  • © Pawn-Wiki.Ru
  • Вставить ник
  • Раскрыть информацию
Здравствуйте!
- - -
Не так давно поднимался вопрос об оптимизации циклов вида:
for(new i=0;i<MAX_PLAYERS;i++)
{ ... }


Не для кого не секрет, что MAX_PLAYERS определяется в a_samp.inc и равна 500.
Раньше я использовал вот такую манипуляцию:
#if defined MAX_PLAYERS
#undef MAX_PLAYERS
#define MAX_PLAYERS 100
#else
#define MAX_PLAYERS 100
#endif


Это конечно давало некоторый прирост, но я пошел еще дальше!
Первой идеей было использовать функцию GetMaxPlayers(), но это никак не помогло бы: на сервере могут быть всего 3 игрока, ид которых 0, 7 и 28, и циклу приходилось бы совершать 28 тактов.
- - -
К сожалению, в pawn нельзя создавать динамические массивы, поэтому я придумал использовать что-то вроде псевдодинамического массива для хранения ид подключенных игроков. Создал глобальный масив:
new PLIDs[MAX_PLAYERS];


Далее я ввел переменную содержащую количество игроков на сервере:
new MaxPlayers = 0;


Очистим весь массив PLIDs при инициализации мода OnGameModInit:
for(new i=0;i<sizeof(PLIDs);i++){PLIDs[i] = -1;}


Теперь надо добавить в паблик OnPlayerConnect необходимые операции с глобальными переменными:
PLIDs[MaxPlayers] = playerid;
MaxPlayers++;


Все довольно просто - игрок подключается, и его ИД помещается в последнюю свободную ячейку массива PLIDs, ну а переменная MaxPlayers становится на единицу больше.
С пабликом OnPlayerDisconnect все немного сложнее. Игрок выходит, тоесть слот в PLIDs который занимала его ИД надо очистить. Но мне не нужен пустой слот, поэтому я присваиваю ему значение самого последнего слота PLIDs, и вот последний уже очищаю:
for(new i=0;i<MaxPlayers;i++)
{
    if(PLIDs[i] == playerid)
    {
        MaxPlayers--;
        PLIDs[i] = PLIDs[MaxPlayers];
        PLIDs[MaxPlayers] = -1;
        break;
    }
}


- - -
Все, теперь вы можете оптимизировать массивы.
Пример:
Пусть был массив:
for(new i=0;i<MAX_PLAYERS;i++)
{
    if(!IsPlayerConnected(i)){continue;}
    SendClientMessage(i, -1, "Message");
}


После оптимизации:
for(new i=0;i<MaxPlayers;i++)
{
    SendClientMessage(PLIDs[i], -1, "Message");
}


- - -
Плюсы данного метода:
- отсутствуют лишние такты циклов
- не требуется проверять подключен ли игрок

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

- - -
Вот и все.
3

#2
Пользователь офлайн   x4ml0 

  • Пользователь
  • Вставить ник
  • Раскрыть информацию
Romzes, как минус (- меняется порядок ИД игроков при выполнении циклов) отобразится на деле? Просто недопонял
0

#3
Пользователь офлайн   Pa4enka 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияx4ml0 (08 Февраль 2018 - 22:00) писал:

Romzes, как минус (- меняется порядок ИД игроков при выполнении циклов) отобразится на деле? Просто недопонял

Давно уже не актуально. Лол.
0

#4
Пользователь офлайн   Sonic X 

  • Х_X
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияx4ml0 (08 Февраль 2018 - 22:00) писал:

Romzes, как минус (- меняется порядок ИД игроков при выполнении циклов) отобразится на деле? Просто недопонял

Ну даже такое можно решить, просто сделать массивом, и каждой ячейке присваивать ID игрока :blush:
0

#5
Пользователь офлайн   x4ml0 

  • Пользователь
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияPa4enka (08 Февраль 2018 - 22:41) писал:

Давно уже не актуально. Лол.


Цитата

А что актуально? Как Оптимизировать циклы?

0

#6
Пользователь офлайн   Sonic X 

  • Х_X
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияx4ml0 (09 Февраль 2018 - 16:45) писал:


1. Использовать forech.
2. Что ж у тебя за циклы такие? Что ты их прям пытаешься оптимизировать.
0

Поделиться темой:


Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

2 человек читают эту тему
1 пользователей, 1 гостей, 0 скрытых пользователей

  1. Hamilton09