Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 3 1 2 3 ПоследняяПоследняя
Показано с 1 по 10 из 23
  1. #1
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±

    dc_foreach_veh - быстрый перебор транспорта

    Внимание: Данный инклуд морально устарел. Аналогичный функционал уже реализован в foreach, пользуйтесь им вместо стороннего дополнения.

    Старое содержимое темы оставлено по историческим причинам.
      Открыть/закрыть

    Довольно простой инклуд, добавляющий для foreach новый итератор Vehicle, содержащий в себе ID всех транспортных средств, заспавненных на сервере.
    Транспорт автоматически добавляется в итератор при создании (CreateVehicle/AddStaticVehicle(Ex)) и удаляется при уничтожении (DestroyVehicle).

    Для работы инклуда требуется foreach/y_iterate от Y_Less.
    Можете закинуть их как в папку "include" (в корне сервера), так и в "pawno/include", в инклуде учитываются оба варианта.

    Примеры использования:
    PHP код:
    #include <a_samp>
    #include "../include/foreach.inc"
    #include "../include/dc_foreach_veh.inc"

    CMD:respawnvehicles(playeridparams[])
    {
        if (
    == IsPlayerAdmin(playerid))
            return 
    0;
        foreach (new 
    v:Vehicle)
            
    SetVehicleToRespawn(v);
        return 
    SendClientMessage(playerid, -1"Вы зареспавнили весь транспорт.");
    }
    ALTX:respawnvehicles("/resveh"); 
    PHP код:
    GetNearestVehicle(Float:xFloat:yFloat:zFloat:distance)
    {
        new 
    Float:tnearest_veh_id INVALID_VEHICLE_ID;
        foreach (new 
    v:Vehicle)
            if (
    floatcmp((GetVehicleDistanceFromPoint(vxyz)), distance) != 1)
                
    distance tnearest_veh_id v;
        return 
    nearest_veh_id;
    }
    GetNearestVehicleToPlayer(playeridFloat:distance)
    {
        new 
    Float:xFloat:yFloat:z;
        if (
    == GetPlayerPos(playeridxyz))
            return 
    INVALID_VEHICLE_ID;
        return 
    GetNearestVehicle(xyzdistance);


    Примечания:
    • Нельзя удалять машины (DestroyVehicle) во время перебора итератора Vehicle с помощью foreach.
      Это связано с тем, что удаление элементов из итератора во время цикла по его элементам может привести к непредсказуемым последствиям.
      Пример кода, который может привести к крашу:
      PHP код:
      foreach (v:Vehicle)
          
      DestroyVehicle(v); 
    • Не пытайтесь в своём моде изменить значение макроса MAX_VEHICLES.
      Даже если вы это значение измените, скажем, на 500, с помощью CreateVehicle/AddStaticVehicle(Ex) всё равно можно будет создать более 500 машин.
      Примеры вмешательства в MAX_VEHICLES (лучше уберите их из своего скрипта):
      PHP код:
      #undef MAX_VEHICLES
      #define MAX_VEHICLES 500 
      PHP код:
      #if defined MAX_VEHICLES
          #undef MAX_VEHICLES
      #endif
      #define MAX_VEHICLES 500 
      PHP код:
      #if defined MAX_VEHICLES
          #undef MAX_VEHICLES
      #endif
      enum MAX_VEHICLES 500 }; 
    • Инклуд работает только в том скрипте, в котором создаётся и удаляется весь транспорт на сервере. Т.е. если вы используете инклуд в моде, то и создавать/удалять транспорт тоже следует из мода, а не из фильтрскоиптов, т.к. невозможно отследить создание и удаление транспорта из другого скрипта.



    Скачать: https://www.dropbox.com/s/rgv8k3h9l1...oreach_veh.inc

    Автор: Daniel_Cortez

    Специально для Pro-Pawn.ru
    Копирование данной статьи на других ресурсах без разрешения автора запрещено!
    Последний раз редактировалось Daniel_Cortez; 05.09.2017 в 18:06. Причина: the end
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  2. 11 пользователя(ей) сказали cпасибо:
    $continue$ (24.12.2015) BadPawn (10.02.2016) Blood (07.01.2016) Desulaid (24.12.2015) HarrWe (27.09.2016) L0ndl3m (28.12.2015) Osetin (24.12.2015) Profyan (24.12.2015) Salvacore (25.12.2015) vovandolg (29.12.2015) VVWVV (05.03.2016)
  3. #2
    Аватар для Profyan
    Пользователь

    Статус
    Оффлайн
    Регистрация
    23.12.2013
    Адрес
    Омск
    Сообщений
    196
    Репутация:
    22 ±
    Сильно отличается в быстродействии от этого варианта ?

    UPD:Если вы не обновляли include a_vehicles.inc до версии 0.3.7, то могут появится warning's по поводу addsiren.Чтобы это исправить, обновите ваши include's.
    Последний раз редактировалось Profyan; 24.12.2015 в 20:19.



    Любой дурак может написать код, понятный компьютеру. Хороший программист пишет код, понятный человеку
    Мартин Фаулер


    Skype
    profan99
    VK
    click




  4. #3
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Я провёл несколько тестов, регулируя кол-во оборотов в циклах профайлера и кол-во машин на сервере.
    Для количества машин брались значения MAX_VEHICLES, MAX_VEHICLES/8 (=250) и 0.
     Код
    PHP код:
    // Profiler v1.1 (copyright (c) 2014-2015 Daniel_Cortez)  \\ Pro-Pawn.ru
    // Условия использования данного кода: http://pro-pawn.ru/showthread.php?12585


    /*Настройки.*/
    #include <a_samp>

    //==============================================================================
    new forveh_vehicles[MAX_VEHICLES];
    new 
    forveh_count 0;

    #if !defined IsValidVehicle
         
    native IsValidVehicle(vehicleid);
    #endif

    #define forveh(%0) for(new ouf, %0=forveh_vehicles[ouf]; ouf<forveh_count; %0=forveh_vehicles[++ouf])

    stock Forveh_CreateVehicle(modelidFloat:xFloat:yFloat:zFloat:anglecolor1color2respawn_delayaddsiren=0)
    {
        new 
    vehid CreateVehicle(modelidxyz,anglecolor1color2respawn_delayaddsiren);
        
    forveh_vehicles[forveh_count++]=vehid;
        return 
    vehid;
    }
    #if defined _ALS_CreateVehicle
         #undef CreateVehicle
    #else
         #define _ALS_CreateVehicle
    #endif
    #define CreateVehicle Forveh_CreateVehicle

    stock Forveh_AddStaticVehicle(modelidFloat:spawn_xFloat:spawn_yFloat:spawn_zFloat:anglecolor1color2)
    {
        new 
    vehid AddStaticVehicle(modelidspawn_xspawn_yspawn_zanglecolor1color2);
        
    forveh_vehicles[forveh_count++]=vehid;
        return 
    vehid;
    }
    #if defined _ALS_AddStaticVehicle
         #undef AddStaticVehicle
    #else
         #define _ALS_AddStaticVehicle
    #endif
    #define AddStaticVehicle Forveh_AddStaticVehicle

    stock Forveh_AddStaticVehicleEx(modelidFloat:spawn_xFloat:spawn_yFloat:spawn_zFloat:anglecolor1color2respawn_delayaddsiren=0)
    {
        new 
    vehid AddStaticVehicleEx(modelidspawn_xspawn_yspawn_zanglecolor1color2,respawn_delayaddsiren);
        
    forveh_vehicles[forveh_count++]=vehid;
        return 
    vehid;
    }
    #if defined _ALS_AddStaticVehicleEx
        #undef AddStaticVehicleEx
    #else
        #define _ALS_AddStaticVehicleEx
    #endif
    #define AddStaticVehicleEx Forveh_AddStaticVehicleEx

    stock Forveh_DestroyVehicle(vehicleid)
    {
        if(!
    IsValidVehicle(vehicleid)) return 0;
        for(new 
    i=0;i<forveh_count;i++)
        {
            if(
    forveh_vehicles[i]==vehicleid)
            {
                
    forveh_vehicles[i]=forveh_vehicles[--forveh_count];
                break;
            }
        }
        return 
    DestroyVehicle(vehicleid);
    }
    #if defined _ALS_DestroyVehicle
        #undef DestroyVehicle
    #else
        #define _ALS_DestroyVehicle
    #endif
    #define DestroyVehicle Forveh_DestroyVehicle
    //==============================================================================

    #include "../include/dc_foreach_veh.inc"

    const PROFILE_VEHICLES_COUNT MAX_VEHICLES;
    const 
    PROFILE_ITERATIONS_MAJOR 1_000_000;
    const 
    PROFILE_ITERATIONS_MINOR 10;

    new const 
    code_snippets_names[2][] =
    {
        {
    "forveh(c)"},
        {
    "foreach(v:Vehicle)"}
    };

    #define Prerequisites();\
        
    printf("Кол-во транспорта: %d."PROFILE_VEHICLES_COUNT);\
        new 
    v;\
        for (
    0PROFILE_VEHICLES_COUNT; ++i)\
            
    CreateVehicle(4110.00.00.00.000, -1false);

    #define CodeSnippet1();\
        
    forveh(c){}

    #define CodeSnippet2();\
        
    foreach (v:Vehicle){}
    /*Конец настроек.*/


    #tryinclude <a_samp>
    #if defined _samp_included
        #define LINE_BREAK ""
    #else
        #define LINE_BREAK "\n"
        #include <core>
        #include <time>
        #define GetTickCount() tickcount()
    #endif

    new code_snippets_time[sizeof(code_snippets_names)] = {0, ...};

    main()
    {
        new 
    t1t2ij;
        
    #emit    zero.pri
        #emit    lctrl        7
        #emit    stor.s.pri    i
        
    printf(
            
    "Тестирование: <%s> vs <%s>" LINE_BREAK,
            
    code_snippets_names[0], code_snippets_names[1]
        );
        static const 
    JIT_status_strings[2][] = {"интерпретируемый""с JIT-компиляцией"};
        
    printf(
            
    "Режим: %s, %dx%d итераций.\a" LINE_BREAK,
            
    JIT_status_strings[i],
            
    PROFILE_ITERATIONS_MAJORPROFILE_ITERATIONS_MINOR
        
    );
        
    Prerequisites();
        for (
    0PROFILE_ITERATIONS_MAJOR; ++i)
        {
            
    t1 GetTickCount();
            for (
    0PROFILE_ITERATIONS_MINOR; ++j)
            {
                
    CodeSnippet1();
            }
            
    t1 GetTickCount()-t1;
    #if !defined _samp_included
            
    if(t1 0)
                continue;
    #endif
            
    t2 GetTickCount();
            for (
    0PROFILE_ITERATIONS_MINOR; ++j)
            {
                
    CodeSnippet2();
            }
            
    t2 GetTickCount()-t2;
    #if !defined _samp_included
            
    if(t2 0)
                continue;
    #endif
            
    code_snippets_time[0] += t1;
            
    code_snippets_time[1] += t2;
        }
        for (
    0sizeof(code_snippets_names); ++i)
            
    printf(
                
    "%s: %d" LINE_BREAK,
                
    code_snippets_names[i], code_snippets_time[i]
            );
        print(
    "\a\a" LINE_BREAK);



    Результаты:
    Код:
    Тестирование: <forveh(c)> vs <foreach(v:Vehicle)>
    Режим: интерпретируемый, 10000x10 итераций.
    Кол-во транспорта: 2000.
    forveh(c): 9125
    foreach(v:Vehicle): 5383
    
    Тестирование: <forveh(c)> vs <foreach(v:Vehicle)>
    Режим: интерпретируемый, 100000x10 итераций.
    Кол-во транспорта: 250.
    forveh(c): 11461
    foreach(v:Vehicle): 6750
    
    Тестирование: <forveh(c)> vs <foreach(v:Vehicle)>
    Режим: интерпретируемый, 10000000x10 итераций.
    Кол-во транспорта: 0.
    forveh(c): 7564
    foreach(v:Vehicle): 6757
    
    Тестирование: <forveh(c)> vs <foreach(v:Vehicle)>
    Режим: с JIT-компиляцией, 100000x10 итераций.
    Кол-во транспорта: 2000.
    forveh(c): 8122
    foreach(v:Vehicle): 8995
    
    Тестирование: <forveh(c)> vs <foreach(v:Vehicle)>
    Режим: с JIT-компиляцией, 1000000x10 итераций.
    Кол-во транспорта: 250.
    forveh(c): 10918
    foreach(v:Vehicle): 11330
    
    Тестирование: <forveh(c)> vs <foreach(v:Vehicle)>
    Режим: с JIT-компиляцией, 100000000x10 итераций.
    Кол-во транспорта: 0.
    forveh(c): 12985
    foreach(v:Vehicle): 11423
    Вариант с foreach почти в 2 раза опережает forveh, а с использованием JIT лишь слегка уступает (и то не во всех ситуациях: если машин мало, foreach обгоняет forveh даже с JIT).
    К тому же, forveh подходит только для перебора машин, а foreach - более универсальный вариант.
    Также хотелось бы заметить, что в forveh(v) внутри цикла создаётся локальная переменная v, в то время, как в foreach можно использовать уже существующую, чтобы не тратилось время на создание новой локальной переменной - именно так я и поступил в тесте.

    Цитата Сообщение от Profyan Посмотреть сообщение
    UPD:Если вы не обновляли include a_vehicles.inc до версии 0.3.7, то могут появится warning's по поводу addsiren.Чтобы это исправить, обновите ваши include's.
    Ах да, чуть не забыл: в forveh мне пришлось самому добавлять параметр addsiren, т.к. код давно не обновлялся. Сам по себе этот код не может работать с SA:MP 0.3.7 R1+.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  5. Пользователь сказал cпасибо:
    Profyan (25.12.2015)
  6. #4
    Аватар для vovandolg
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±
    Велосипеды, скутеры и моцаклет обычный не хотят работать с этим перебором,может быть из за того что версия 0.3е(пробовал инклуд новее, пробовал старее с удалением addsiren разницы не повидал).
    Остальное вроде бы всё гуд.

  7. #5
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от vovandolg Посмотреть сообщение
    Велосипеды, скутеры и моцаклет обычный не хотят работать с этим перебором,может быть из за того что версия 0.3е(пробовал инклуд новее, пробовал старее с удалением addsiren разницы не повидал).
    Остальное вроде бы всё гуд.
    Да быть такого не может. Все эти "велосипеды, скутеры и моцаклеты" создаются точно так же, как и другой транспорт (через CreateVehicle/AddStaticVehicle(Ex)) и точно так же добавляются в итератор Vehicle.
    Смотрите свой код. Вполне возможно, что какие-то машины создаются через фильтрскрипт - тогда они не будут добавлены в итератор. Либо, если в ФС тоже подключить dc_foreach_veh, то транспорт будет добавляться в уже другой экземпляр итератора, не в тот, который в моде.

    В общем, смотрите, что у вас там не так. Если в каком-то ФС есть создание транспорта - пишите сюда, что-нибудь придумаю. Иначе - в раздел вопросов.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  8. Пользователь сказал cпасибо:
    vovandolg (28.12.2015)
  9. #6
    Аватар для vovandolg
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    В общем, смотрите, что у вас там не так. Если в каком-то ФС есть создание транспорта - пишите сюда, что-нибудь придумаю. Иначе - в раздел вопросов.
    Вот с этого момента я вспомнил что эти ребусы двухколесные были заспавнены через include
    Только если я не ошибаюсь в инклуде инклуды как то по другому крепятся, в общем от помощи не отказался бы)

  10. #7
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от vovandolg Посмотреть сообщение
    Вот с этого момента я вспомнил что эти ребусы двухколесные были заспавнены через include
    Только если я не ошибаюсь в инклуде инклуды как то по другому крепятся, в общем от помощи не отказался бы)
    Подключайте dc_foreach_veh.inc сразу же после foreach.inc, как показано в примере в 1-м посте.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  11. Пользователь сказал cпасибо:
    vovandolg (28.12.2015)
  12. #8
    Аватар для vovandolg
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±
    Я в моде у себя нашёл такую строку
    PHP код:
    for(new i!= MAX_VEHICLESi++) 
    Её так же можно заменить на данный перебор?

    - - - Добавлено - - -

    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Подключайте dc_foreach_veh.inc сразу же после foreach.inc, как показано в примере в 1-м посте.
    Спасибо, теперь с этими двухколесными всё гуд, подключил теперь все кары на карте респаются

  13. #9
    Аватар для vovandolg
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±
    Та же проблема что и самая первая, решил просто из интереса через FS подключить и получилось что не чего не получилось..
    инклуды так же самые первые вставлены остались просто тоже самое всё что и в инклуде было то и сюда закинул, FS не клюёт так.

  14. #10
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от vovandolg Посмотреть сообщение
    Та же проблема что и самая первая, решил просто из интереса через FS подключить и получилось что не чего не получилось..
    инклуды так же самые первые вставлены остались просто тоже самое всё что и в инклуде было то и сюда закинул, FS не клюёт так.
    Он и не должен работать в отдельном FS. Посты выше внимательней читайте.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  15. Пользователь сказал cпасибо:
    $continue$ (03.01.2016)
 

 
Страница 1 из 3 1 2 3 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

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