Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 4 1 2 3 ... ПоследняяПоследняя
Показано с 1 по 10 из 36
  1. #1
    Аватар для Caypen
    Пользователь

    Статус
    Оффлайн
    Регистрация
    25.03.2014
    Сообщений
    90
    Репутация:
    16 ±

    Перебор машин по принципу foreach

    Бешеный перебор машин на основе foreach от Траккера(Триггера)
    Переделал под машины: Caypen

    В самый верх мода:
    PHP код:
    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_delay)
    {
        new 
    vehid CreateVehicle(modelidxyz,anglecolor1color2respawn_delay);
        
    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_delay)
    {
        new 
    vehid AddStaticVehicleEx(modelidspawn_xspawn_yspawn_zanglecolor1color2,respawn_delay);
        
    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 
    Перебираем машины вот так:
    PHP код:
        forveh(c)
        {
            
    Действие(c);
        } 
    Таким образом мы перебираем только те машины которые были созданы а те которые удалены пропускаем даже не интерпретируя.
    За основу взят метод Траккера для игроков.

    Тесты:
    Цитата Сообщение от Salvador Посмотреть сообщение
    тесты?
    Щас будут.

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

    PHP код:
    [09:47:37Тестируем дедовский метод перебора машин
    [09:47:37125 машин создали
    [09:47:3750-74 ID машин уничтожены
    [09:47:37Стартуем глобальный цикл 1000000 раз
    [09:58:05тест дедовского метода перебора машин ЗАВЕРШЕНвремя628328 ms.
    [
    09:58:05]

    [
    09:58:05Тестируем forveh машин
    [09:58:05125 машин создали
    [09:58:0550-74 ID машин уничтожены
    [09:58:05Стартуем глобальный цикл 1000000 раз
    [09:58:29тест forveh машин ЗАВЕРШЕНвремя23553 ms
    Почти в 27 раз быстрее.
    Был создан цикл на 1000000 раз в нутри которого был цикл машин через forveh а в первом же тесте через дедовский метод.

    код теста (Идея такого теста тоже спизжена у Траккера :D):
      Открыть/закрыть

    PHP код:
    #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_delay)
    {
        new 
    vehid CreateVehicle(modelidxyz,anglecolor1color2respawn_delay);
        
    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_delay)
    {
        new 
    vehid Forveh_AddStaticVehicleEx(modelidspawn_xspawn_yspawn_zanglecolor1color2,respawn_delay);
        
    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
    stock test()
    {
        new 
    time,vehid[MAX_VEHICLES];
        
    printf("Тестируем дедовский метод перебора машин");
         for(new 
    i=0;i<125;i++)
        {
            
    vehid[i] = CreateVehicle(5202109.17630+random(50), 1503.045332.288782.28730160);
        }
        
    printf("125 машин создали");
        for(new 
    i=50;i<75;i++)
        {
            
    DestroyVehicle(vehid[i]);
        }
        
    printf("50-74 ID машин уничтожены");
        
    printf("Стартуем глобальный цикл 1000000 раз");
        
    time=GetTickCount();
        for(new 
    i=0;i<1000000;i++)
            for(new 
    x=0;x<MAX_VEHICLES;x++)
            {
                if(
    IsValidVehicle(x)){}
                continue;
                
    //#pragma unused x
            
    }
        
    printf("тест дедовского метода перебора машин ЗАВЕРШЕН. время: %d ms.",GetTickCount()-time);
        
    //
        
    print("\n");

         
    printf("Тестируем forveh машин");
        for(new 
    i=0;i<125;i++)
            
    forveh_vehicles[forveh_count++]=i;
        
    printf("125 машин создали");
        for(new 
    i=50;i<75;i++)
        {
            for(new 
    j=0;j<forveh_count;j++)
            {
                if(
    forveh_vehicles[j]==i)
                {
                    
    forveh_vehicles[j]=forveh_vehicles[--forveh_count];
                    
    forveh_vehicles[forveh_count]=-1;
                    break;
                }
            }
        }
        
    printf("50-74 ID машин уничтожены");
        
    printf("Стартуем глобальный цикл 1000000 раз");
        
    time=GetTickCount();
        for(new 
    i=0;i<1000000;i++)
            
    forveh(x)
            {
                continue;
                
    #pragma unused x
            
    }
        
    printf("тест forveh машин ЗАВЕРШЕН. время: %d ms.",GetTickCount()-time);
        
    //
        
    print("\n");
     } 


    Автор кода для машин: Caypen
    Критика и корректирование: Daniel_Cortez
    Последний раз редактировалось Caypen; 22.06.2014 в 19:44.
    Захожу на pro-pawn.ru - чувствую себя обычным пользователем
    Захожу на gawno-info.ru - чувствую себя самым великим гением
    (С) Caypen

  2. 3 пользователя(ей) сказали cпасибо:
    Flime (29.06.2014) Mexanizm (07.10.2015) Salvacore (05.06.2014)
  3. #2
    Аватар для Salvacore
    Инжунер-погромист

    Статус
    Оффлайн
    Регистрация
    10.05.2013
    Адрес
    Аҧсуа бызшәа
    Сообщений
    2,271
    Репутация:
    418 ±
    тесты?

  4. #3
    Аватар для Caypen
    Пользователь

    Статус
    Оффлайн
    Регистрация
    25.03.2014
    Сообщений
    90
    Репутация:
    16 ±
    Цитата Сообщение от Salvador Посмотреть сообщение
    тесты?
    Щас будут.

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

    PHP код:
    [09:47:37Тестируем дедовский метод перебора машин
    [09:47:37125 машин создали
    [09:47:3750-74 ID машин уничтожены
    [09:47:37Стартуем глобальный цикл 1000000 раз
    [09:58:05тест дедовского метода перебора машин ЗАВЕРШЕНвремя628328 ms.
    [
    09:58:05

    [
    09:58:05Тестируем forveh машин
    [09:58:05125 машин создали
    [09:58:0550-74 ID машин уничтожены
    [09:58:05Стартуем глобальный цикл 1000000 раз
    [09:58:29тест forveh машин ЗАВЕРШЕНвремя23553 ms
    Почти в 27 раз быстрее.
    Был создан цикл на 1000000 раз в нутри которого был цикл машин через forveh а в первом же тесте через дедовский метод.

    код теста (Идея такого теста тоже спизжена у Траккера :D):
    PHP код:
    stock test()
    {
        new 
    time,vehid[MAX_VEHICLES];
        
    printf("Тестируем дедовский метод перебора машин");
         for(new 
    i=0;i<125;i++)
        {
            
    vehid[i] = CreateVehicle(5202109.17630+random(50), 1503.045332.288782.28730160);
        }
        
    printf("125 машин создали");
        for(new 
    i=50;i<75;i++)
        {
            
    DestroyVehicle(vehid[i]);
        }
        
    printf("50-74 ID машин уничтожены");
        
    printf("Стартуем глобальный цикл 1000000 раз");
        
    time=GetTickCount();
        for(new 
    i=0;i<1000000;i++)
            for(new 
    x=0;x<MAX_VEHICLES;x++)
            {
                if(
    IsValidVehicle(x)){}
                continue;
                
    //#pragma unused x
            
    }
        
    printf("тест дедовского метода перебора машин ЗАВЕРШЕН. время: %d ms.",GetTickCount()-time);
        
    //
        
    print("\n");
        
         
    printf("Тестируем forveh машин");
        for(new 
    i=0;i<125;i++)
            
    Vehicles[vehicles++]=i;
        
    printf("125 машин создали");
        for(new 
    i=50;i<75;i++)
        {
            for(new 
    j=0;j<vehicles;j++)
            {
                if(
    Vehicles[j]==i)
                {
                    
    Vehicles[j]=Vehicles[--vehicles];
                    
    Vehicles[vehicles]=-1;
                    break;
                }
            }
        }
        
    printf("50-74 ID машин уничтожены");
        
    printf("Стартуем глобальный цикл 1000000 раз");
        
    time=GetTickCount();
        for(new 
    i=0;i<1000000;i++)
            
    forveh(x)
            {
                continue;
                
    #pragma unused x
            
    }
        
    printf("тест forveh машин ЗАВЕРШЕН. время: %d ms.",GetTickCount()-time);
        
    //
        
    print("\n");
     } 
    Захожу на pro-pawn.ru - чувствую себя обычным пользователем
    Захожу на gawno-info.ru - чувствую себя самым великим гением
    (С) Caypen

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    1. Подумал, что может случиться, если машины были созданы с помощью AddStaticVehicle/AddStaticVehicleEx ?
    2. Что будет, если функции CreateVehicle и DestroyVehicle уже были где-то перехвачены (например, в каком-нибудь античите)?
    3. Сразу бросается в глаза "богатая фантазия" по поводу именования переменных:
    PHP код:
    new Vehicles[MAX_VEHICLES] = {-1, ...};
    new 
    vehicles
    Doesn't make any sense...
    4.
    PHP код:
    CreateVehicleAC 
    Что означает постфикс "AC"? Это какой-то античит?
    5. Если в DestroyVehicleAC передать ID машины больше MAX_VEHICLES или меньше 0, цикл по всем созданным машинам пройдёт впустую.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  6. #5
    Аватар для Caypen
    Пользователь

    Статус
    Оффлайн
    Регистрация
    25.03.2014
    Сообщений
    90
    Репутация:
    16 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    5. Если в DestroyVehicleAC передать ID машины больше MAX_VEHICLES или меньше 0, цикл по всем созданным машинам пройдёт впустую.
    Там есть это,но по поводу меньше 0 и больше MAX_VEHICLES ты прав не подумал,на это и есть критики вроде тебя что-бы ошибки замечать)
    PHP код:
    if(INVALID_VEHICLE_ID ==vehicleid) return true
    Захожу на pro-pawn.ru - чувствую себя обычным пользователем
    Захожу на gawno-info.ru - чувствую себя самым великим гением
    (С) Caypen

  7. #6
    Аватар для Tracker1
    Проверенный

    Статус
    Оффлайн
    Регистрация
    30.07.2013
    Сообщений
    54
    Репутация:
    84 ±
    Эта проверка никак не спасет, если id будет меньше 0 или больше MAX_VEHICLES.

  8. #7
    Аватар для Caypen
    Пользователь

    Статус
    Оффлайн
    Регистрация
    25.03.2014
    Сообщений
    90
    Репутация:
    16 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    3. Сразу бросается в глаза "богатая фантазия" по поводу именования переменных:
    PHP код:
    new Vehicles[MAX_VEHICLES] = {-1, ...};
    new 
    vehicles
    Doesn't make any sense...
    4.
    PHP код:
    CreateVehicleAC 
    Что означает постфикс "AC"? Это какой-то античит?.
    Переменным давал имя так же как и Триггер делал с перебором игроков, сомневаюсь что юзер будет использовать еще такие переменные в моде,но если вас сударь это так тревожит,то сделаю им префиксик.
    AC? Да по сути произошло от античита,но я решил оставить так, опять же изменять эти префиксы сугобо дело идеалистов,но если ты решил придраться ко всему,то ладно изменю.

    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    1. Подумал, что может случиться, если машины были созданы с помощью AddStaticVehicle/AddStaticVehicleEx ?
    А да ты прав,сейчас сек.
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    2. Что будет, если функции CreateVehicle и DestroyVehicle уже были где-то перехвачены (например, в каком-нибудь античите)?
    Античит на машину? Не вижу особо смысла в этом,ну в таком случае юзеру придется переделывать костыль под forveh

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

    Цитата Сообщение от Tracker1 Посмотреть сообщение
    Эта проверка никак не спасет, если id будет меньше 0 или больше MAX_VEHICLES.
    Я где-то сказал что она должна спасти?
    Последний раз редактировалось Caypen; 18.05.2014 в 11:31.
    Захожу на pro-pawn.ru - чувствую себя обычным пользователем
    Захожу на gawno-info.ru - чувствую себя самым великим гением
    (С) Caypen

  9. #8
    Аватар для Tracker1
    Проверенный

    Статус
    Оффлайн
    Регистрация
    30.07.2013
    Сообщений
    54
    Репутация:
    84 ±
    Цитата Сообщение от Caypen Посмотреть сообщение
    Там есть это,но по поводу меньше 0 и больше MAX_VEHICLES ты прав не подумал,на это и есть критики вроде тебя что-бы ошибки замечать)
    PHP код:
    if(INVALID_VEHICLE_ID ==vehicleid) return true
    Тогда к чему этот пост был?

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

    Статус
    Оффлайн
    Регистрация
    25.03.2014
    Сообщений
    90
    Репутация:
    16 ±
    Цитата Сообщение от Tracker1 Посмотреть сообщение
    Тогда к чему этот пост был?
    "о по поводу меньше 0 и больше MAX_VEHICLES ты прав "
    Читать лучше надо)

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

    Всё, теперь кажется исправил вроде всё.

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

    Зачем я вас послушал,можно же было просто в DestroyVehicle такую проверку IsValidVehicle
    Захожу на pro-pawn.ru - чувствую себя обычным пользователем
    Захожу на gawno-info.ru - чувствую себя самым великим гением
    (С) Caypen

  11. #10
    Аватар для Seregamil
    Проверенный

    Статус
    Оффлайн
    Регистрация
    21.11.2013
    Сообщений
    551
    Репутация:
    274 ±
    цикл 1000000 раз
    таким идиотизмом заниматься НИКТО не будет.
    цикл на машины, в нормальном моде, вызывается раз 5-6, но не 10млн.

 

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

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

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

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

Ваши права

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