Просмотр полной версии : [Мануал] Перебор машин по принципу foreach
Бешеный перебор машин на основе foreach от Траккера(Триггера)
Переделал под машины: Caypen
В самый верх мода:
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(modelid, Float:x, Float:y, Float:z, Float:angle, color1, color2, respawn_delay)
{
new vehid = CreateVehicle(modelid, x, y, z,angle, color1, color2, respawn_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(modelid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:angle, color1, color2)
{
new vehid = AddStaticVehicle(modelid, spawn_x, spawn_y, spawn_z, angle, color1, color2);
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(modelid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:angle, color1, color2, respawn_delay)
{
new vehid = AddStaticVehicleEx(modelid, spawn_x, spawn_y, spawn_z, angle, color1, color2,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
Перебираем машины вот так:
forveh(c)
{
Действие(c);
}
Таким образом мы перебираем только те машины которые были созданы а те которые удалены пропускаем даже не интерпретируя.
За основу взят метод Траккера для игроков.
Тесты:
тесты?
Щас будут.
- - - Добавлено - - -
[09:47:37] Тестируем дедовский метод перебора машин
[09:47:37] 125 машин создали
[09:47:37] 50-74 ID машин уничтожены
[09:47:37] Стартуем глобальный цикл 1000000 раз
[09:58:05] тест дедовского метода перебора машин ЗАВЕРШЕН. время: 628328 ms.
[09:58:05]
[09:58:05] Тестируем forveh машин
[09:58:05] 125 машин создали
[09:58:05] 50-74 ID машин уничтожены
[09:58:05] Стартуем глобальный цикл 1000000 раз
[09:58:29] тест forveh машин ЗАВЕРШЕН. время: 23553 ms.
Почти в 27 раз быстрее.
Был создан цикл на 1000000 раз в нутри которого был цикл машин через forveh а в первом же тесте через дедовский метод.
код теста (Идея такого теста тоже спизжена у Траккера :D):
#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(modelid, Float:x, Float:y, Float:z, Float:angle, color1, color2, respawn_delay)
{
new vehid = CreateVehicle(modelid, x, y, z,angle, color1, color2, respawn_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(modelid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:angle, color1, color2)
{
new vehid = AddStaticVehicle(modelid, spawn_x, spawn_y, spawn_z, angle, color1, color2);
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(modelid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:angle, color1, color2, respawn_delay)
{
new vehid = Forveh_AddStaticVehicleEx(modelid, spawn_x, spawn_y, spawn_z, angle, color1, color2,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(520, 2109.17630+random(50), 1503.0453, 32.2887, 82.2873, 0, 1, 60);
}
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
Salvacore
18.05.2014, 04:22
тесты?
тесты?
Щас будут.
- - - Добавлено - - -
[09:47:37] Тестируем дедовский метод перебора машин
[09:47:37] 125 машин создали
[09:47:37] 50-74 ID машин уничтожены
[09:47:37] Стартуем глобальный цикл 1000000 раз
[09:58:05] тест дедовского метода перебора машин ЗАВЕРШЕН. время: 628328 ms.
[09:58:05]
[09:58:05] Тестируем forveh машин
[09:58:05] 125 машин создали
[09:58:05] 50-74 ID машин уничтожены
[09:58:05] Стартуем глобальный цикл 1000000 раз
[09:58:29] тест forveh машин ЗАВЕРШЕН. время: 23553 ms.
Почти в 27 раз быстрее.
Был создан цикл на 1000000 раз в нутри которого был цикл машин через forveh а в первом же тесте через дедовский метод.
код теста (Идея такого теста тоже спизжена у Траккера :D):
stock test()
{
new time,vehid[MAX_VEHICLES];
printf("Тестируем дедовский метод перебора машин");
for(new i=0;i<125;i++)
{
vehid[i] = CreateVehicle(520, 2109.17630+random(50), 1503.0453, 32.2887, 82.2873, 0, 1, 60);
}
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");
}
Daniel_Cortez
18.05.2014, 11:07
1. Подумал, что может случиться, если машины были созданы с помощью AddStaticVehicle/AddStaticVehicleEx ?
2. Что будет, если функции CreateVehicle и DestroyVehicle уже были где-то перехвачены (например, в каком-нибудь античите)?
3. Сразу бросается в глаза "богатая фантазия" по поводу именования переменных:
new Vehicles[MAX_VEHICLES] = {-1, ...};
new vehicles;
Doesn't make any sense...
4.
CreateVehicleAC
Что означает постфикс "AC"? Это какой-то античит?
5. Если в DestroyVehicleAC передать ID машины больше MAX_VEHICLES или меньше 0, цикл по всем созданным машинам пройдёт впустую.
5. Если в DestroyVehicleAC передать ID машины больше MAX_VEHICLES или меньше 0, цикл по всем созданным машинам пройдёт впустую.
Там есть это,но по поводу меньше 0 и больше MAX_VEHICLES ты прав не подумал,на это и есть критики вроде тебя что-бы ошибки замечать)
if(INVALID_VEHICLE_ID ==vehicleid) return true;
Tracker1
18.05.2014, 11:14
Эта проверка никак не спасет, если id будет меньше 0 или больше MAX_VEHICLES.
3. Сразу бросается в глаза "богатая фантазия" по поводу именования переменных:
new Vehicles[MAX_VEHICLES] = {-1, ...};
new vehicles;
Doesn't make any sense...
4.
CreateVehicleAC
Что означает постфикс "AC"? Это какой-то античит?.
Переменным давал имя так же как и Триггер делал с перебором игроков, сомневаюсь что юзер будет использовать еще такие переменные в моде,но если вас сударь это так тревожит,то сделаю им префиксик.
AC? Да по сути произошло от античита,но я решил оставить так, опять же изменять эти префиксы сугобо дело идеалистов,но если ты решил придраться ко всему,то ладно изменю.
1. Подумал, что может случиться, если машины были созданы с помощью AddStaticVehicle/AddStaticVehicleEx ?
А да ты прав,сейчас сек.
2. Что будет, если функции CreateVehicle и DestroyVehicle уже были где-то перехвачены (например, в каком-нибудь античите)?
Античит на машину? Не вижу особо смысла в этом,ну в таком случае юзеру придется переделывать костыль под forveh
- - - Добавлено - - -
Эта проверка никак не спасет, если id будет меньше 0 или больше MAX_VEHICLES.
Я где-то сказал что она должна спасти?
Tracker1
18.05.2014, 11:20
Там есть это,но по поводу меньше 0 и больше MAX_VEHICLES ты прав не подумал,на это и есть критики вроде тебя что-бы ошибки замечать)
if(INVALID_VEHICLE_ID ==vehicleid) return true;
Тогда к чему этот пост был?
Тогда к чему этот пост был?
"о по поводу меньше 0 и больше MAX_VEHICLES ты прав "
Читать лучше надо)
- - - Добавлено - - -
Всё, теперь кажется исправил вроде всё.
- - - Добавлено - - -
Зачем я вас послушал,можно же было просто в DestroyVehicle такую проверку IsValidVehicle
Seregamil
18.05.2014, 13:41
цикл 1000000 раз
таким идиотизмом заниматься НИКТО не будет.
цикл на машины, в нормальном моде, вызывается раз 5-6, но не 10млн.
таким идиотизмом заниматься НИКТО не будет.
http://cs617416.vk.me/v617416374/8e0d/ugLDRuRZiRQ.jpg
Рустам Рич на столько крут,что готов заниматься даже таким идиотизмом.
Tracker1
18.05.2014, 14:12
http://cs617416.vk.me/v617416374/8e0d/ugLDRuRZiRQ.jpg
Рустам Рич на столько крут,что готов заниматься даже таким идиотизмом.
НУ А ТЫ ЖЕ ЕГО НАСЛЕДНИК.
НУ А ТЫ ЖЕ ЕГО НАСЛЕДНИК.
Что ты приебался?)
Рустам Рич когда писал мод РЛС не обладал ни какими знаниями вообще, делал мод листая английские мануалы и т.д. и сам додумывался до многого, в то время не было много мест где можно найти ответ на любой вопрос, человек не обладая ни какими знаниями написал мод,да ужасный,не оптимизирвоанный, быдлокодерский,но с нуля, сейчас 70 процентов "скриптеров" делают мод с рлс или гф или стейт 66 т.к. с нуля не способны ничего сделать, сам когда нубом был можно подумать лучше делал? Я полагаю и надеюсь что Рустам в наши дни уже научился многому в павн,но кода к сожалению его не видел.
Tracker1
18.05.2014, 14:40
Я когда был нубом в паблик свои работы не кидал.
Я когда был нубом в паблик свои работы не кидал.
Ты и сейчас их практически не кидаешь ;)
Я когда был нубом в паблик свои работы не кидал.
Там вроде бы его работу слили а он сам не кидал.
underwoker
18.05.2014, 20:00
Насчет Рустика согласен, он и правда не обладал, и за 2 месяца или месяц, уже был готов РЛС.
Salvacore
18.05.2014, 20:16
Рустама могу назвать легендой, толпы школьников поставили его мод на хостинг и поднимали онлайн до 300-400.
Spectrum
18.05.2014, 20:36
Ты и сейчас их практически не кидаешь ;)
github чекай
Рустама могу назвать легендой, толпы школьников поставили его мод на хостинг и поднимали онлайн до 300-400.
По-моему, всё из-за того, что RLS похож на samp-rpб, не? Хотя особо не вглядывался.
Сейчас любой дурак, умеющий пользоваться гуглом, сможет собрать мод. Будет такой же кривой, но работать будет
github чекай
Это был стёб
Salvacore
28.05.2014, 02:29
Спасибо, достойная работа.
Взял : Forveh_DestroyVehicle,Forveh_CreateVehicle и всё :)
Спасибо, достойная работа.
Взял : Forveh_DestroyVehicle,Forveh_CreateVehicle и всё :)
Спасибо, а ты бываешь милым.
Вот мой вариант на итераторе от Юлеса(Y_Less):
#include <foreach> // by Y_Less
new Iterator:valid_vehicles<MAX_VEHICLES>;
#define forveh(%0) foreach (new %0 : valid_vehicles)
stock Forveh_CreateVehicle(modelid, Float:x, Float:y, Float:z, Float:angle, color1, color2, respawn_delay)
{
new vehid = CreateVehicle(modelid, x, y, z,angle, color1, color2, respawn_delay);
Iter_Add(valid_vehicles, vehid);
return vehid;
}
#if defined _ALS_CreateVehicle
#undef CreateVehicle
#else
#define _ALS_CreateVehicle
#endif
#define CreateVehicle Forveh_CreateVehicle
stock Forveh_AddStaticVehicle(modelid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:angle, color1, color2)
{
new vehid = AddStaticVehicle(modelid, spawn_x, spawn_y, spawn_z, angle, color1, color2);
Iter_Add(valid_vehicles, vehid);
return vehid;
}
#if defined _ALS_AddStaticVehicle
#undef AddStaticVehicle
#else
#define _ALS_AddStaticVehicle
#endif
#define AddStaticVehicle Forveh_AddStaticVehicle
stock Forveh_AddStaticVehicleEx(modelid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:angle, color1, color2, respawn_delay)
{
new vehid = AddStaticVehicleEx(modelid, spawn_x, spawn_y, spawn_z, angle, color1, color2,respawn_delay);
Iter_Add(valid_vehicles, vehid);
return vehid;
}
#if defined _ALS_AddStaticVehicleEx
#undef AddStaticVehicleEx
#else
#define _ALS_AddStaticVehicleEx
#endif
#define AddStaticVehicleEx Forveh_AddStaticVehicleEx
stock Forveh_DestroyVehicle(vehicleid)
{
if(Iter_Contains(valid_vehicles, vehicleid))
Iter_Remove(valid_vehicles, vehicleid);
return DestroyVehicle(vehicleid);
}
#if defined _ALS_DestroyVehicle
#undef DestroyVehicle
#else
#define _ALS_DestroyVehicle
#endif
#define DestroyVehicle Forveh_DestroyVehicle
Тесты:
[17:39:37] Тестируем дедовский метод перебора машин
[17:39:37] 125 машин создали
[17:39:37] 50-74 ID машин уничтожены
[17:39:37] Стартуем глобальный цикл 1000000 раз
[17:42:34] тест дедовского метода перебора машин ЗАВЕРШЕН. время: 177256 ms.
[17:42:34]
[17:42:34] Тестируем forveh машин
[17:42:34] 125 машин создали
[17:42:34] 50-74 ID машин уничтожены
[17:42:34] Стартуем глобальный цикл 1000000 раз
[17:42:40] тест forveh машин ЗАВЕРШЕН. время: 5585 ms.
Ссылки:
pastebin (http://pastebin.com/fTSX8kSV)
foreach.inc (http://pastebin.com/iUFrMNtY)
y_iterate Topic (http://forum.sa-mp.com/showthread.php?t=92679)
Пример использования:
forveh(vehicle_id)
{
SetVehicleToRespawn(vehicle_id)
}
#if !defined IsValidVehicle
native IsValidVehicle(vehicleid);
#endif
:crazy: :crazy: :crazy:
Salvacore
03.06.2014, 20:34
Вот мой вариант на итераторе от Юлеса(Y_Less):
#include <foreach> // by Y_Less
new Iterator:valid_vehicles<MAX_VEHICLES>;
#define forveh(%0) foreach (new %0 : valid_vehicles)
stock Forveh_CreateVehicle(modelid, Float:x, Float:y, Float:z, Float:angle, color1, color2, respawn_delay)
{
new vehid = CreateVehicle(modelid, x, y, z,angle, color1, color2, respawn_delay);
Iter_Add(valid_vehicles, vehid);
return vehid;
}
#if defined _ALS_CreateVehicle
#undef CreateVehicle
#else
#define _ALS_CreateVehicle
#endif
#define CreateVehicle Forveh_CreateVehicle
stock Forveh_AddStaticVehicle(modelid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:angle, color1, color2)
{
new vehid = AddStaticVehicle(modelid, spawn_x, spawn_y, spawn_z, angle, color1, color2);
Iter_Add(valid_vehicles, vehid);
return vehid;
}
#if defined _ALS_AddStaticVehicle
#undef AddStaticVehicle
#else
#define _ALS_AddStaticVehicle
#endif
#define AddStaticVehicle Forveh_AddStaticVehicle
stock Forveh_AddStaticVehicleEx(modelid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:angle, color1, color2, respawn_delay)
{
new vehid = AddStaticVehicleEx(modelid, spawn_x, spawn_y, spawn_z, angle, color1, color2,respawn_delay);
Iter_Add(valid_vehicles, vehid);
return vehid;
}
#if defined _ALS_AddStaticVehicleEx
#undef AddStaticVehicleEx
#else
#define _ALS_AddStaticVehicleEx
#endif
#define AddStaticVehicleEx Forveh_AddStaticVehicleEx
stock Forveh_DestroyVehicle(vehicleid)
{
if(Iter_Contains(valid_vehicles, vehicleid))
Iter_Remove(valid_vehicles, vehicleid);
return DestroyVehicle(vehicleid);
}
#if defined _ALS_DestroyVehicle
#undef DestroyVehicle
#else
#define _ALS_DestroyVehicle
#endif
#define DestroyVehicle Forveh_DestroyVehicle
Тесты:
[17:39:37] Тестируем дедовский метод перебора машин
[17:39:37] 125 машин создали
[17:39:37] 50-74 ID машин уничтожены
[17:39:37] Стартуем глобальный цикл 1000000 раз
[17:42:34] тест дедовского метода перебора машин ЗАВЕРШЕН. время: 177256 ms.
[17:42:34]
[17:42:34] Тестируем forveh машин
[17:42:34] 125 машин создали
[17:42:34] 50-74 ID машин уничтожены
[17:42:34] Стартуем глобальный цикл 1000000 раз
[17:42:40] тест forveh машин ЗАВЕРШЕН. время: 5585 ms.
Ссылки:
pastebin (http://pastebin.com/fTSX8kSV)
foreach.inc (http://pastebin.com/iUFrMNtY)
y_iterate Topic (http://forum.sa-mp.com/showthread.php?t=92679)
Пример использования:
forveh(vehicle_id)
{
SetVehicleToRespawn(vehicle_id)
}
Ну хватит уже:D
Надоело всё переписывать.
Вот мой вариант на итераторе от Юлеса(Y_Less):
#include <foreach> // by Y_Less
new Iterator:valid_vehicles<MAX_VEHICLES>;
#define forveh(%0) foreach (new %0 : valid_vehicles)
stock Forveh_CreateVehicle(modelid, Float:x, Float:y, Float:z, Float:angle, color1, color2, respawn_delay)
{
new vehid = CreateVehicle(modelid, x, y, z,angle, color1, color2, respawn_delay);
Iter_Add(valid_vehicles, vehid);
return vehid;
}
#if defined _ALS_CreateVehicle
#undef CreateVehicle
#else
#define _ALS_CreateVehicle
#endif
#define CreateVehicle Forveh_CreateVehicle
stock Forveh_AddStaticVehicle(modelid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:angle, color1, color2)
{
new vehid = AddStaticVehicle(modelid, spawn_x, spawn_y, spawn_z, angle, color1, color2);
Iter_Add(valid_vehicles, vehid);
return vehid;
}
#if defined _ALS_AddStaticVehicle
#undef AddStaticVehicle
#else
#define _ALS_AddStaticVehicle
#endif
#define AddStaticVehicle Forveh_AddStaticVehicle
stock Forveh_AddStaticVehicleEx(modelid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:angle, color1, color2, respawn_delay)
{
new vehid = AddStaticVehicleEx(modelid, spawn_x, spawn_y, spawn_z, angle, color1, color2,respawn_delay);
Iter_Add(valid_vehicles, vehid);
return vehid;
}
#if defined _ALS_AddStaticVehicleEx
#undef AddStaticVehicleEx
#else
#define _ALS_AddStaticVehicleEx
#endif
#define AddStaticVehicleEx Forveh_AddStaticVehicleEx
stock Forveh_DestroyVehicle(vehicleid)
{
if(Iter_Contains(valid_vehicles, vehicleid))
Iter_Remove(valid_vehicles, vehicleid);
return DestroyVehicle(vehicleid);
}
#if defined _ALS_DestroyVehicle
#undef DestroyVehicle
#else
#define _ALS_DestroyVehicle
#endif
#define DestroyVehicle Forveh_DestroyVehicle
Тесты:
[17:39:37] Тестируем дедовский метод перебора машин
[17:39:37] 125 машин создали
[17:39:37] 50-74 ID машин уничтожены
[17:39:37] Стартуем глобальный цикл 1000000 раз
[17:42:34] тест дедовского метода перебора машин ЗАВЕРШЕН. время: 177256 ms.
[17:42:34]
[17:42:34] Тестируем forveh машин
[17:42:34] 125 машин создали
[17:42:34] 50-74 ID машин уничтожены
[17:42:34] Стартуем глобальный цикл 1000000 раз
[17:42:40] тест forveh машин ЗАВЕРШЕН. время: 5585 ms.
Ссылки:
pastebin (http://pastebin.com/fTSX8kSV)
foreach.inc (http://pastebin.com/iUFrMNtY)
y_iterate Topic (http://forum.sa-mp.com/showthread.php?t=92679)
Пример использования:
forveh(vehicle_id)
{
SetVehicleToRespawn(vehicle_id)
}
В твоем случае если создали машину: 0,1,2 и машина 2 уничтожена,то во время перебора будет всё равно 0,1,2
И + вроде бы у тебя последний ид машины будет пропускать, а ид 0 перебирать в то время когда ида 0 у машин не бывает.
Поэтому метод твой только хуже.
Daniel_Cortez
07.06.2014, 14:51
В твоем случае если создали машину: 0,1,2 и машина 2 уничтожена,то во время перебора будет всё равно 0,1,2
У него есть перехват DestroyVehicle с удалением элемента из итератора.
И + вроде бы у тебя последний ид машины будет пропускать, а ид 0 перебирать в то время когда ида 0 у машин не бывает.
Поэтому метод твой только хуже.
Не спеши с выводами, если не знаешь, как работает foreach.inc
Не спеши с выводами, если не знаешь, как работает foreach.inc
никогда не открывал его, найду время посмотрю.
Что ты приебался?)
Рустам Рич когда писал мод РЛС не обладал ни какими знаниями вообще, делал мод листая английские мануалы и т.д. и сам додумывался до многого, в то время не было много мест где можно найти ответ на любой вопрос, человек не обладая ни какими знаниями написал мод,да ужасный,не оптимизирвоанный, быдлокодерский,но с нуля, сейчас 70 процентов "скриптеров" делают мод с рлс или гф или стейт 66 т.к. с нуля не способны ничего сделать, сам когда нубом был можно подумать лучше делал? Я полагаю и надеюсь что Рустам в наши дни уже научился многому в павн,но кода к сожалению его не видел.
Скачай его актуальный не RLS а SRL.
Пельмень
17.06.2014, 16:16
stock Forveh_DestroyVehicle(vehicleid)
{
if(!IsValidVehicle(vehicleid)) return 0;
for (new i = 0, bool:found; i < forveh_count && !found || ((forveh_vehicles[i]=forveh_vehicles[--forveh_count])); i++) found = (forveh_vehicles[i]==vehicleid);
return DestroyVehicle(vehicleid);
}
- - - Добавлено - - -
И, да
stock Forveh_AddStaticVehicleEx(modelid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:angle, color1, color2, respawn_delay)
{
new vehid = Forveh_AddStaticVehicleEx(modelid, spawn_x, spawn_y, spawn_z, angle, color1, color2,respawn_delay);
forveh_vehicles[forveh_count++]=vehid;
return vehid;
}
Не замечаешь, что тут функция используется внутри себя?
BaBuIIIkaDrifteR
13.03.2015, 05:00
Так чей метот лучше?
И да как использовать?
Вот этот цикл:
for(new i = GetVehiclePoolSize(); i >= 1; i--)
{
SetVehicleNumberPlate(i,"Номер кара тест");
SetVehicleToRespawn(i);
}
заменить на:
forveh(c)
{
SetVehicleNumberPlate(c,"Номер кара тест");
SetVehicleToRespawn(c);
} Да? Все верно?
BaBuIIIkaDrifteR
13.03.2015, 18:05
Просто в 0.3.7 добавили некое изменение.
/*Если у вас есть скрипты с использованием MAX_PLAYERS или MAX_VEHICLES, вам необходимо переделать циклы с использованием GetPlayerPoolSize()/GetVehiclePoolSize(), либо переназначить константу MAX_PLAYERS на количество слотов вашего сервера (теперь по-умолчанию 1000).
SA:MP 0.3.7\Пример: Старый цикл: for(new x = 0; x < MAX_PLAYERS; x++) | На новый цикл: for(new x = GetPlayerPoolSize(); x >= 0; x--)*/
Salvacore
23.06.2015, 14:31
Обновляй, хочу быстрее
Daniel_Cortez
23.06.2015, 19:06
Так чей метот лучше?
И да как использовать?
Вот этот цикл:
for(new i = GetVehiclePoolSize(); i >= 1; i--)
{
SetVehicleNumberPlate(i,"Номер кара тест");
SetVehicleToRespawn(i);
}
заменить на:
forveh(c)
{
SetVehicleNumberPlate(c,"Номер кара тест");
SetVehicleToRespawn(c);
} Да? Все верно?
Ответ в самом начале темы...
Просто в 0.3.7 добавили некое изменение.
/*Если у вас есть скрипты с использованием MAX_PLAYERS или MAX_VEHICLES, вам необходимо переделать циклы с использованием GetPlayerPoolSize()/GetVehiclePoolSize(), либо переназначить константу MAX_PLAYERS на количество слотов вашего сервера (теперь по-умолчанию 1000).
SA:MP 0.3.7\Пример: Старый цикл: for(new x = 0; x < MAX_PLAYERS; x++) | На новый цикл: for(new x = GetPlayerPoolSize(); x >= 0; x--)*/
Это нововведение рассчитано на тех, кто не пользуется циклами наподобие foreach.
Данное же решение проходит циклом только по тем слотам, в которых есть транспорт (изначально есть пустой список для машин, при каждом вызове CreateVehicle/AddStaticVehicle/etc. созданный транспорт добавляется в этот список, при DestroyVehicle - удаляется из списка). А потому никакие MAX_VEHICLES и GetVehiclePoolSize не повлияют на скорость работы forveh, единственный значимый фактор - кол-во созданного транспорта.
Обновляй, хочу быстрее
Быстрее уже некуда...
Хорошо, Спасибо :i-m_so_happy:
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot