Страница 1 из 9 123 ... ПоследняяПоследняя
Показано с 1 по 10 из 86

Тема: Оптимизация циклов max_players

  1. #1
    ?????? ??????? Аватар для OFFREAL
    Регистрация
    31.03.2010
    Адрес
    Калининград
    Возраст
    33
    Сообщений
    2,521
    Репутация: 249

    Звание: - весьма и весьма положительная личность

    Оптимизация циклов max_players




    Здравствуйте!
    - - -
    Не так давно поднимался вопрос об оптимизации циклов вида:
    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");

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

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

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

    Урок: [SQLite Database]
    Урок: [Оптимизация Циклов]
    Урок: [Битовые Операции]
    Полезные функции: [Useful Tools]
    #include [Pickup Portal System]
    Filterscript [Simple AFK System]
    Filterscript [Лазерное Наведение Ракет]
    Filterscript [TextDraw Arcanoid]
    Разное: [Func Tests]
    [Рейтинг Пользователей]

    Реклама в подписи запрещена!!!
    Я ВКонтакте: [vk.com/offreal]

    [SIGPIC][/SIGPIC]

    Код:
                  C---C  GTO  C---C
           \     /     \     /     \     /
            C---C   E   C---C   I   C---C
           /     \     /     \     /     \
       ---C   R   C---C   N   C---C   N   C---
           \     /     \     /     \     /
            C---C   U   C---C   O   C---C
           /     \     /     \     /     \
                  C---C  R11  C---C
                 /     \     /     \
                        C---C

  2. #2
    Проверенный Аватар для frog163
    Регистрация
    12.04.2010
    Адрес
    Samara
    Возраст
    31
    Сообщений
    4,548
    Репутация: 365

    Звание: - очень-очень хороший человек
    спс, надеюсь это работает =)
    Минусы:
    - меняется порядок ИД игроков при выполнении циклов
    особого минуса здесь не вижу =)
    Ничто не ограничивает полет мысли программиста так, как компилятор, сцуко!
    Если в предложении собеседника различного рода смайлов больше чем слов - однозначно, что этот индивид страдает критической, неизлечимой и при этом прогрессирующей формой долбоебизма © лурка
    PAWN Compiler делает то, что вы приказали ему сделать, а не то, что вы хотели, чтобы он сделал..

  3. #3
    Проверенный Аватар для OKStyle
    Регистрация
    26.04.2010
    Адрес
    Россия, Оренбург
    Возраст
    35
    Сообщений
    6,398
    Репутация: 532

    Звание: - луч света в тёмном царстве

    Re: Оптимизация циклов max_players

    И всё-таки мне кажется, что в этой теме: http://pawno.su/showthread.php/13169-GetOnlinePlayers() куда более действенные способы IMHO.

    sk47, зачем тему удалил?

    Код:
    Applications
    Pawno Rus No 217 [28.06.2008] SA-MP 0.3e Rcon Edition Rus [16.09.2010] Win-server Autostarter [31.01.2011]
    
    Gamemodes
    Public Enemy LS/SF/LV [25.07.2010] TDM Style []
    
    Filterscripts
    Sex            [05.07.2008] Showgirls                 [24.05.2010] Equip                     [02.02.2011] Jellyfisher               [11.02.2012] Tank Lights System [14.03.2013]
    All Animations [13.07.2008] Colored Healthbar         [08.06.2010] Exclusive Clothes         [07.03.2011] Parking                   [12.02.2012] TextDraw Captcha   [22.03.2013]
                                Pay'n'Spray Colors Menu   [23.06.2010] 0.2.2 Class Selection     [07.03.2011] Serial ID Ban             [31.03.2012]
                                Wedding                   [28.06.2010] Other Chatname            [09.03.2011] Advanced Weapons          [02.04.2012]
                                Rusty Brown's Ring Donuts [29.06.2010] Top View                  [09.03.2011] Ingame Map Editor         [01.05.2012]
                                                                       Rainbow Tab               [10.03.2011] Colored Checkpoints       [10.05.2012]
                                                                       Textdraw Intro            [03.09.2011] Experience & Level System [22.07.2012]
                                                                       Kickstart Challange       [06.09.2011] Target Message System     [17.11.2012]
                                                                       Love Fist Concert         [09.10.2011]
                                                                       3D Info                   [12.10.2011]
                                                                       Vehicle Bonus Return      [13.10.2011]
                                                                       Rockstar Logos Collection [16.10.2011]
                                                                       Textures Ingame Editor    [16.10.2011]
                                                                       Map-Radar                 [17.10.2011]
    
    Maps
    Military Vehicle Interior  [06.04.2012]
    Barracks Soldiers Interior [07.04.2012]
    Barracks Officers Interior [08.04.2012]
    
    Include
    FD ASM - форматированный диалог на #emit [31.03.2013]
    






  4. #4
    Пользователь
    Регистрация
    05.03.2011
    Адрес
    Пуп Земли
    Возраст
    29
    Сообщений
    67
    Репутация: 3

    Звание: пока не определено

    Re: Оптимизация циклов max_players

    спасибо.. норм тема..)

  5. #5
    ?????? ??????? Аватар для OFFREAL
    Регистрация
    31.03.2010
    Адрес
    Калининград
    Возраст
    33
    Сообщений
    2,521
    Репутация: 249

    Звание: - весьма и весьма положительная личность

    Re: Оптимизация циклов max_players

    Цитата Сообщение от DarkAngel Посмотреть сообщение
    спасибо.. норм тема..)
    Она вернулась )))
    [Θpposing Force]

    Урок: [SQLite Database]
    Урок: [Оптимизация Циклов]
    Урок: [Битовые Операции]
    Полезные функции: [Useful Tools]
    #include [Pickup Portal System]
    Filterscript [Simple AFK System]
    Filterscript [Лазерное Наведение Ракет]
    Filterscript [TextDraw Arcanoid]
    Разное: [Func Tests]
    [Рейтинг Пользователей]

    Реклама в подписи запрещена!!!
    Я ВКонтакте: [vk.com/offreal]

    [SIGPIC][/SIGPIC]

    Код:
                  C---C  GTO  C---C
           \     /     \     /     \     /
            C---C   E   C---C   I   C---C
           /     \     /     \     /     \
       ---C   R   C---C   N   C---C   N   C---
           \     /     \     /     \     /
            C---C   U   C---C   O   C---C
           /     \     /     \     /     \
                  C---C  R11  C---C
                 /     \     /     \
                        C---C

  6. #6
    Проверенный Аватар для DuMBaSS
    Регистрация
    14.11.2010
    Адрес
    Московская область
    Сообщений
    1,268
    Репутация: 101

    Звание: скоро придёт к известности

    Re: Оптимизация циклов max_players

    отличный урок, полюбому пригодится. лови плюсик
    p.s. плюсик позже дам, т.к. пишет что уже давал
    Покупаем!!!

    И я здесь ради идеи, пока здесь денег нет...
    Кого-то кормят, а кого-то кормят ноги...

    Мои работы:
    [FS] Miner (работа шахтера)
    [FS]Ferma (как на samp-rp)
    [FS]3D Спидометр
    [FS]Работа искателем ракушек
    [FS]Работа грузчика как на samp-rp v 0.2
    [HTML] Таймер отсчета до определенного события


    WIKI:
    [Урок] Эффект фильма
    [Урок] Анти повторный подбор пикапов

    Полезные функции:
    GetOnlinePlayers();

    Не в паблике:
    [WEB]User Control Panel v 1.0

    Надоели люди, пишущие что павно это программа, а не язык. (c) DuMBaSS


  7. #7
    Активный пользователь Аватар для Kup9[PinK]
    Регистрация
    02.05.2010
    Адрес
    United States , New Jersey , Manville
    Возраст
    29
    Сообщений
    221
    Репутация: 2

    Звание: пока не определено

    Re: Оптимизация циклов max_players

    хороший урок дня новичков и не ток !!

  8. #8
    Активный пользователь Аватар для ZakMage
    Регистрация
    03.05.2010
    Адрес
    Харьков
    Возраст
    28
    Сообщений
    1,046
    Репутация: 45

    Звание: на пути к лучшему

    Re: Оптимизация циклов max_players

    Извините, не то.
    Код:
    //---Уроки--
    [Урок]Как правильно делать отступы от скобок { и }!
    [Урок]Как сделать включение фар у трейлера!
    [Урок]Случайный скин при спавне!
    //---Скрипты--
    [FS]Stunt Park на время
    //---Инклюды--
    [INC]Movable3DText v0.1
    //---Моды--
    RussianTrucker[15 тысяч строк, 1 месяц работы, заказ].
    //---Услуги--
    Услуги скриптера:
    Skype:zakmage

  9. #9
    Проверенный Аватар для frog163
    Регистрация
    12.04.2010
    Адрес
    Samara
    Возраст
    31
    Сообщений
    4,548
    Репутация: 365

    Звание: - очень-очень хороший человек

    Re: Оптимизация циклов max_players

    Цитата Сообщение от OKStyle Посмотреть сообщение
    И всё-таки мне кажется, что в этой теме: http://pawno.su/showthread.php/13169-GetOnlinePlayers() куда более действенные способы IMHO.
    а смысл ее использовать то? проверка на коннект игроков все равно будет использоваться
    если подумать этот код:
    PHP код:
    for(new i;i<GetMaxPlayers();i++)
    {
        if(!
    IsPlayerConnected(i)){continue;}
        
    SendClientMessage(i, -1"Message");

    ничем не отличается от этого:
    PHP код:
    for(new i;i<GetOnlinePlayers();i++)
    {
        
    SendClientMessage(i, -1"Message");

    >>>>добавлено
    даже нет, второй код будет даже дольше работать, ведь получается там 2 цикла
    Ничто не ограничивает полет мысли программиста так, как компилятор, сцуко!
    Если в предложении собеседника различного рода смайлов больше чем слов - однозначно, что этот индивид страдает критической, неизлечимой и при этом прогрессирующей формой долбоебизма © лурка
    PAWN Compiler делает то, что вы приказали ему сделать, а не то, что вы хотели, чтобы он сделал..

  10. #10
    ?????? ??????? Аватар для OFFREAL
    Регистрация
    31.03.2010
    Адрес
    Калининград
    Возраст
    33
    Сообщений
    2,521
    Репутация: 249

    Звание: - весьма и весьма положительная личность

    Re: Оптимизация циклов max_players

    Пусть на серваке было 10 человек, ИД игроков от 0 до 9 ... потом игроки с нечетными ИД ушли с сервера.
    Запускаем цикл:
    PHP код:
    for(new i;i<GetOnlinePlayers();i++)
    {
        
    SendClientMessage(i, -1"Message");

    GetOnlinePlayers вернет нам 5, поэтому SendClientMessage сработает только для 0, 2 и 4 ИД
    - - - - -
    А вот описание GetMaxPlayers с wiki.sa-mp
    Цитата Сообщение от WIKI.SA-MP
    GetMaxPlayers is in contrast read from the server.cfg
    Поэтому при правильной настройке мода
    PHP код:
    //правильная настройка
    #if defined MAX_PLAYERS
    #undef MAX_PLAYERS
    #define MAX_PLAYERS 100
    #else
    #define MAX_PLAYERS 100
    #endif 
    она не отличается от MAX_PLAYERS
    [Θpposing Force]

    Урок: [SQLite Database]
    Урок: [Оптимизация Циклов]
    Урок: [Битовые Операции]
    Полезные функции: [Useful Tools]
    #include [Pickup Portal System]
    Filterscript [Simple AFK System]
    Filterscript [Лазерное Наведение Ракет]
    Filterscript [TextDraw Arcanoid]
    Разное: [Func Tests]
    [Рейтинг Пользователей]

    Реклама в подписи запрещена!!!
    Я ВКонтакте: [vk.com/offreal]

    [SIGPIC][/SIGPIC]

    Код:
                  C---C  GTO  C---C
           \     /     \     /     \     /
            C---C   E   C---C   I   C---C
           /     \     /     \     /     \
       ---C   R   C---C   N   C---C   N   C---
           \     /     \     /     \     /
            C---C   U   C---C   O   C---C
           /     \     /     \     /     \
                  C---C  R11  C---C
                 /     \     /     \
                        C---C

Страница 1 из 9 123 ... ПоследняяПоследняя

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •