Страница 1 из 16 12311 ... ПоследняяПоследняя
Показано с 1 по 10 из 158

Тема: Единая тема оптимизации

  1. #1
    ? FreeLancer ? Аватар для RastaOrecha
    Регистрация
    12.07.2011
    Адрес
    Челябинск
    Возраст
    26
    Сообщений
    1,857
    Репутация: 229

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

    Единая тема оптимизации

    1. JIT compiler

    Он переводит AMX байт-код (код созданный компилятором PAWN) в машинный x86-код, во время выполнения, чтобы ускорить выполнение скрипта.
    На самом деле JIT Compiler во много раз ускоряет выполнение скрипта (кода).

    В топике, где размещён плагин, размещены и тесты:

    Без JIT:
    Код:
    Test "floatrandom1" finished: 2684ms (3725782.5/sec)
    Test "IsPlayerAimingAt" finished: 3004ms (332889.5/sec)
    Test "GetPlayerCameraAimVector" finished: 192ms (5208333.5/sec)
    С использованием плагина JIT Compiler:
    Код:
    Test "floatrandom1" finished: 715ms (13986014.0/sec)
    Test "IsPlayerAimingAt" finished: 2301ms (434593.6/sec)
    Test "GetPlayerCameraAimVector" finished: 22ms (45454548.0/sec)
    Если вдруг JIT крашит сервер, попробуйте запустить samp-server.exe с параметром ProcDump и укажите .dmp файл для него. Для этого откройте командную строку, перейдите в каталог с вашим сервером и выполните следующую команду:
    PHP код:
    path/to/procdump.exe --ma -x samp-server.exe samp-server.dmp 
    Официальная тема JIT Compiler v0.3.2: [Перейти]

    2. Строки

    Почитайте очень полезный урок от Триггера, который объяснит почему нельзя использовать большие стринги [Перейти]

    Так же не стоит возвращать строки в функциях, подробнее в уроке от Владокса: [Перейти]

    3. Возвраты

    Возьмём за пример следующий код:

    PHP код:
    new Float:health;
    for (new 
    iMAX_PLAYERSi++)
    {
        if 
    IsPlayerConnected(i) *then // <----
        
    {
            
    GetPlayerHealth(ihealth);
            
    SetPlayerHealth(ihealth 10.0);
        }

    Проверку на то, что игрок подключен в данном случае можно избежать, тем самым оптимизировав и упростив код:

    PHP код:
    new Float:health;
    for (new 
    iMAX_PLAYERSi++)
    {
        if 
    GetPlayerHealth(ihealth) *then // <-----
        
    SetPlayerHealth(ihealth 10.0);

    Если игрок не подключен, то функция GetPlayerHealth вернёт 0, тогда цикл пропустит итерацию.

    Ещё 1 пример:
    PHP код:
    if (IsPlayerInAnyVehicle(playerid)) //  <-----
    {
        new 
    vehicleid GetPlayerVehicleID(playerid);
        
    SetVehiclePos(vehicleid0.00.010.0);

    Проверка на нахождение игрока в автомобиле абсолютно бесполезная, учитывая то, что в дальнейшем узнается id автомобиля, в котором сидит игрок.
    Давайте посмотрим на оптимизированную версию этого кода:

    PHP код:
    new vehicleid GetPlayerVehicleID(playerid);
    if (
    vehicleid)
        
    SetVehiclePos(vehicleid0.00.010.0); 
    Если игрок не в автомобиле, то функция GetPlayerVehicleID вернет 0, собственно код ниже не выполнится.
    Отсюда становится ясно, что условие нахождение игрока в автомобиле не нужно.

    4. Циклы

    Вот пример оптимизированного цикла:

    PHP код:
    for(new i,zx GetMaxPlayers( ); zxi++)
    {
        if !
    IsPlayerConnected(i) *then continue; //В некоторых случаях можно поставить проверку на флаг логина (если не залогинен)
        //Действие

    Это один из способов оптимизации циклов игроков.

    Второй (более быстрый) способ от пользователя официального форума Y_Less'а.

    Он создал инклуд под названием foreach и сейчас я постараюсь объяснить как им пользоваться.

    Пример:
    PHP код:
    foreach(Playeri)
    {
        
    //Действие

    Это очень быстрый метод сканирования игроков, постараюсь объяснить.

    Допустим играют на сервере 3 человека, id последнего - 25.
    Цикл foreach сделает 3 итерации, в отличии от остальных.

    Скачать foreach: [Скачать]

    Подключать его легко, закиньте его в папку include в вашей папке с pawno и далее в моде/скрипте/инклуде:

    PHP код:
    #include foreach 
    5. Функции

    В стандартном GF функции создаются примерно так:

    PHP код:
    forward Func(playeridgunid);
    public 
    Func(playeridgunid)
    {
        return 
    true;

    Есть ещё 2 способа создания функций и они намного быстрее, нежели первый:

    PHP код:
    stock  Func(playeridgunid)
    {
    }

    Func(playeridgunid)
    {

    Таким образом создавать функции намного удобнее и лучше, кстати, я рекомендую способ напрямую создания функции (Func (playerid, gunid) ), т.к если функция в коде не применялось, то компилятор выдаст warining.

    6. Переменные MAX_PLAYERS

    Часто сталкивался с таким кодом как:

    PHP код:
    new Player[MAX_PLAYERS];

    public 
    OnPlayerConnect(playerid)
    {
        
    Player[playerid] += 1;

    Дефолтно переменная MAX_PLAYERS равна 500.

    Т.е мы создаём массив с 500 ячейками, а если максимальное кол-во слотов на сервере - 100, то для этого используем следующий код:

    PHP код:
    #undef MAX_PLAYERS // Раздефайним макрос MAX_PLAYERS
    #assert MAX_PLAYERS > 0
    #define MAX_PLAYERS  100 //Объявим константу, равную 100 
    7. Получение имени игрока

    Всё чаще начал замечать следующую функцию для получения ника игрока:

    PHP код:
    forward GN(playerid);
    public 
    GN(playerid)
    {
    new 
    PlayerName[MAX_PLAYER_NAME];
    GetPlayerName(playerid,PlayerName,sizeof(PlayerName));
    return 
    PlayerName;

    Категорически не рекомендую это использовать, т.к у данной функции есть 2 больших минуса:

    1. При каждом использовании создается переменная PlayerName
    2. Функция возвращает строку, а это не хорошо

    Вот как можно это оптимизировать:

    В энуменатор игроков добавляем переменную:
    PHP код:
    pName[MAX_PLAYER_NAME
    В public OnPlayerConnect :
    PHP код:
    GetPlayerName(playeridPlayerInfo[playerid][pName], MAX_PLAYER_NAME); 
    Далее ко всем макросам:
    #define GN(%1) PlayerInfo[%1][pName]

    И всё, теперь без переполнения стека можно определять ник игрока, это очень большой плюс к оптимизации.

    Пример использования:

    PHP код:
    printf("%s был замечен на сервере"GN(playerid)); 

    8. Switch vs Оператор ветвления if/else/else if

    В большинстве случаев оператор switch выигрывает в скорости.

    Switch работает быстрее в тех случаях, когда нужно перебрать большое кол-во значений.

    К примеру диалоги, в большинстве модах много диалогов и оператором if их перебирать не разумно.

    Приведём пример как было:

    PHP код:
    if(dialogid == 100)
    {
        if(
    response)
        {
        if(
    listitem == 0)
        {
           print(
    "1");
        }
        if(
    listitem == 1)
        {
            print(
    "1");
        }
        if(
    listitem == 2)
        {
            print(
    "1");
        }
        if(
    listitem == 3)
        {
            print(
    "2");
        }
        if(
    listitem == 4)
        {
            print(
    "3");
        }
        if(
    listitem == 5)
        {
            print(
    "2");
        }
        }
    }
    else if(
    dialogid == DIALOG_LOGIN)
    {
        if(
    response)
        {
           
    //Действие
        
    }

    и как стало:

    PHP код:
    switch(dialogid)
    {
        case 
    100:
        {
            if(!
    response) return true;
            switch(
    listitem)
            {
                case 
    0..2: print("1");
                case 
    3,5: print("2");
                case 
    4: print("3");

            }
        }
        case 
    DIALOG_LOGIN:
        {
            if(!
    response) return 1;
        }

    В каких случаях лучше использовать switch:

    Следующая конструкция:
    PHP код:
    switch(var)
    {
            case 
    40,80,150,160,230,420: return 1;

    быстрее, чем

    PHP код:
    if ( var == 40 || var == 80 || var == 150 || var == 160 || var == 230 || var == 420 ) return 1
    Следующая конструкция:

    PHP код:
    switch(var)
    {
            case 
    40..80,150..160,230..420: return 1;

    медленнее чем

    PHP код:
    if ( var >= 40 && var <= 80 || var >= 150 && var <= 160 || var >= 230 && var <= 420 ) return 1
    Следующая конструкция:

    PHP код:
    switch(var)
    {
            case 
    40: return 1;

    одинакова как и

    PHP код:
    if ( var == 40 ) return 1
    Следующая конструкция:

    PHP код:
    switch(var)
    {
            case 
    40..50: return 1;

    быстрее чем

    PHP код:
    if ( var >= 40 && var <= 50 ) return 1


    9. Команды

    Наиболее быстрый плагин для создания команд - DC_CMD

    Вот ссылка: http://pawno.su/showthread.php?t=96066

    P.S: Если знаете более быстрый способ, отпишитесь в комментариях

    10. Рейты

    Ещё одна немаловажная часть, это рейты.
    При правильной настройке снизится пинг, лаги, нагрузка и пр.

    Итак, заходим в server.cfg и там:

    Если на вашем сервере играет до 100 человек, то:

    PHP код:
    onfoot_rate 40
    incar_rate 40
    weapon_rate 40
    stream_distance 400.0
    stream_rate 500 
    Если на вашем сервере играет от 100 до 200 игроков, то:

    PHP код:
    onfoot_rate 40
    incar_rate 40
    weapon_rate 40
    stream_distance 300.0
    stream_rate 1000 
    Если же на вашем сервере играет от 200 до 500 игроков, то:

    PHP код:
    onfoot_rate 50
    incar_rate 50
    weapon_rate 50
    stream_distance 200.0
    stream_rate 2000 
    onfoot_rate - время в мили секундах за которое будут обновляться координаты перемещения игроков (в ходьбе).
    incar_rate - время в мили секундах для обновления позиции транспорта на котором ездят игроки.
    weapon_rate - время в мили секундах обновления попадания оружия.
    stream_distance - расстояние от игрока к объекту в зоне видимости.
    stream_rate - время в мили секундах за которое будут обновляться данные от игрока к объекту.


    10. Оптимизация потребления памяти

    Приведу простой пример оптимизации потребления памяти на переменных.

    Возьмём для примера 2 переменные:
    1.
    PHP код:
    new a[MAX_PLAYERS];
    a[1] = 100
    2.
    PHP код:
    new a[MAX_PLAYERS char];
    a{1} = 100
    heapspace MAX_PLAYERS: 2004
    heapspace MAX_PLAYERS char: 504

    Результат на лицо.
    Однако не спешите ко всем массивам приписывать char, давайте приглядимся.

    Фигурные скобки обозначают, что мы обращаемся к байту, а не к ячейке и главной нашей проблемой является то, что 1 байт хранит значения от 0 до 255 (включительно).
    А это значит, что использовать char нужно осмотрительно и с умом.

    Так же, для экономии памяти вы можете использовать флаги: [Перейти]



    Код:
    PAWN:
    
    • [PAWN Wiki] Пишем регистрацию с 0 на Y_INI
    • [PAWN Wiki] Использование YCMD (y_commands) + SSCANF 2.x
    • [PAWN Wiki] Использование Y_Timers
    • [PAWN Wiki] Разделяем мод на инклуды (y_hooks)
    • [PAWN Wiki] Использование UVar
    • [PAWN Wiki] Единая тема оптимизации
    • [Интересные комманды] Cмена ника MySQL 
    • [Интересные комманды] Full Set
    • [Интересные комманды] Телепорт по указанным координатам 
    • [Скрипты и инклуды] jBank System [version 1]
    • [Скрипты и инклуды] jRegistration System
    
    Lua:
    • [Wiki] Создание мода с 0
    • [Wiki] Дерево элементов | new
    • [Wiki] Бинд клавиш или комманда на кнопку
    • [Func] eachOther (повторение числа/строки) | new
    Маппинг:
    
    • [MAP] Квартира в центре (приятный вид)
    • [Source] Маленькое помещение с видом из окна
    • [Source] Пустое помещение с панорамными окнами
    
    HTML, JavaScript:
    
    • [HTML] Подключение таблицы стилей CSS к HTML
    • [HTML][CSS] Красивый текст снизу картинки
    
    C#, C++ :
    
    • [C++] Действие на кнопку (при нажатии на кнопку)
    • [C++] Работа с файлами
    • [C++] Склоняем






    “When you have insomnia, you're never really asleep. And you're really awake.”
    “Никогда не указывайте на ошибки, если не знаете, как их исправить.” - Бернард Шоу.
    “Если ты способен выдумать что-то, ты можешь и сделать это.” - Уолт Дисней.
    “Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.” - Элеонор Рузвельт.

  2. #2
    Активный пользователь Аватар для Kamolsky
    Регистрация
    10.02.2012
    Адрес
    Нижний Новгород
    Сообщений
    1,034
    Репутация: 109

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

    Re: Единая тема оптимизации

    Однако лучше использовать Zcmd. Не очень уж я и доверяю библиотеке Ysi.

    З.Ы. Долбанный антикапс, портит предложения. -_-

  3. #3
    ? FreeLancer ? Аватар для RastaOrecha
    Регистрация
    12.07.2011
    Адрес
    Челябинск
    Возраст
    26
    Сообщений
    1,857
    Репутация: 229

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

    Re: Единая тема оптимизации

    Цитата Сообщение от Kamolsky Посмотреть сообщение
    Однако лучше использовать zcmd. Не очень уж я и доверяю библиотеке ysi.
    Если уж подключен foreach, то можно и YCMD, а если нет, то ZCMD.

  4. #4
    Активный пользователь Аватар для Rock and Roll
    Регистрация
    23.09.2011
    Адрес
    Деревня
    Возраст
    28
    Сообщений
    282
    Репутация: 55

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

    Re: Единая тема оптимизации

    Все хорошо. И Ysi и Zcmd. А так подробно все описано, но уже не то. Было бы это таки 2 года назад, глаза бы горели.

    Уважил.





  5. #5
    Активный пользователь Аватар для Sistems
    Регистрация
    06.10.2012
    Адрес
    Душанбе
    Возраст
    28
    Сообщений
    504
    Репутация: 66

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

    Re: Единая тема оптимизации

    :ahuenna: Молодца!

  6. #6
    ? FreeLancer ? Аватар для RastaOrecha
    Регистрация
    12.07.2011
    Адрес
    Челябинск
    Возраст
    26
    Сообщений
    1,857
    Репутация: 229

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

    Re: Единая тема оптимизации

    Цитата Сообщение от ARHI[V]IRUS Посмотреть сообщение
    Все хорошо. И Ysi и Zcmd. А так подробно все описано, но уже не то. Было бы это таки 2 года назад, глаза бы горели.

    Уважил.
    Ну так это для тебя года два назад, а тут ещё новички у которых не только глаза могут гореть на темы с оптимизацией

  7. #7
    Активный пользователь Аватар для Kamolsky
    Регистрация
    10.02.2012
    Адрес
    Нижний Новгород
    Сообщений
    1,034
    Репутация: 109

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

    Re: Единая тема оптимизации

    PHP код:
    const MAX_PLAYERS 100
    Зачем ты используешь констату?

  8. #8
    ? FreeLancer ? Аватар для RastaOrecha
    Регистрация
    12.07.2011
    Адрес
    Челябинск
    Возраст
    26
    Сообщений
    1,857
    Репутация: 229

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

    Re: Единая тема оптимизации

    Зачем ты используешь констату?
    А что? Разве хуже?

  9. #9
    Активный пользователь Аватар для Kamolsky
    Регистрация
    10.02.2012
    Адрес
    Нижний Новгород
    Сообщений
    1,034
    Репутация: 109

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

    Re: Единая тема оптимизации

    Было:

    PHP код:
    if(IsPlayerInAnyVehicle(playerid))
    {
        new 
    vehicleid GetPlayerVehicleID(playerid);
        
    SetVehiclePos(vehicleid0.00.010.0);

    Стало:

    PHP код:
    if(GetPlayerVehicleID(playerid)) SetVehiclePos(GetPlayerVehicleID(playerid), 0.00.010.0); 
    В этом случае, у тебя суть потерялась. Так как в первом варианте у тебя стоит проверка на нахождении игрока в машине, а здесь получение ида. Так то ид можно получить рядом стоя с машиной. Мб должно быть так?

    PHP код:
    if(IsPlayerInAnyVehicle(playerid)) SetVehiclePos(GetPlayerVehicleID(playerid), 0.00.010.0); 

  10. #10
    Активный пользователь Аватар для Kamolsky
    Регистрация
    10.02.2012
    Адрес
    Нижний Новгород
    Сообщений
    1,034
    Репутация: 109

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

    Re: Единая тема оптимизации

    Цитата Сообщение от Dope D.O.D Посмотреть сообщение
    А что? Разве хуже?
    Точно не знаю, но мне кажется что констаты так же занимают память как и переменные.
    Но точно не знаю, если ошибаюсь, то поправьте меня

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

Похожие темы

  1. Вопрос по оптимизации
    от Clarita1996 в разделе Вопросы по скриптингу
    Ответов: 10
    Последнее сообщение: 03.11.2012, 21:33
  2. Ответов: 16
    Последнее сообщение: 09.12.2011, 17:42
  3. Вопрос по оптимизации
    от happines в разделе Вопросы по скриптингу
    Ответов: 0
    Последнее сообщение: 01.07.2011, 11:00
  4. Помогите в оптимизации
    от ruslan в разделе Вопросы по скриптингу
    Ответов: 1
    Последнее сообщение: 30.03.2011, 20:28

Ваши права

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