Костыль
Думаю, можно это сделать в виде нового инклюда-дополнения для foreach, чтобы не запоминать алгоритм.
Вид для печати
Костыль, который позволяет сэкономить и память, и процессорное время в ситуациях, похожих на пример из статьи :mamba:
Я думал об этом написать, но, в итоге, забыл :pardon:
Как по мне, можно этот алгоритм и в основной инклуд записать, добавив дополнительный тэг, через который всё будет работать. А для тех, кто боится лишний код тащить за собой из библиотек, можно сообразить макрос, что позволит включать/отключать этот алгоритм.
C:\Users\User\Documents\GTA San Andreas User Files\SAMP\server\gamemodes\typicalrp.pwn(9698) : error 017: undefined symbol "a@YSII_Cg"PHP код:
foreach(Player, a)
{
if(player_info[a][ADMIN] > 0)
{
Iter_Random(a)
C:\Users\User\Documents\GTA San Andreas User Files\SAMP\server\gamemodes\typicalrp.pwn(9698) : error 017: undefined symbol "a@YSII_Ag"
:blush2:
Вообще мне кажется, что стоит сделать упор на том, как устроены функции библиотеки, дабы не обмануть себя.
В пример такого обмана можно привести итератор для игроков в зоне стрима. Казалось бы, добавили функцию добавления игрока в итератор при входе в зону стрима, удаления при выходе и при тестах получили приличный прирост к скорости, но есть одно "но": что функция добавления итератора, что функция удаления - обе содержат в себе цикл и некоторые другие вычисления, которые будут вызываться 2 раза при входе/выходе каждого игрока из/в зону стрима.
В итоге получается, что в момент вызова цикла у нас получился прирост к скорости, но взамен мы получили постоянную нагрузку, которая, при хорошем онлайне, может стать гораздо вреднее, нежели цикл с проверкой координат
эт еще ничего)
есть такой вариант :D
PHP код:
#if FOREACH_I_PlayerVehiclesStream || FOREACH_I_VehiclePlayersStream
/*
Iter_OnVehicleStreamIn
*/
public OnVehicleStreamIn(vehicleid, forplayerid)
{
#if FOREACH_I_PlayerVehiclesStream
Iter_Add(PlayerVehiclesStream[forplayerid], vehicleid);
#endif
#if FOREACH_I_VehiclePlayersStream
Iter_Add(VehiclePlayersStream[vehicleid], forplayerid);
#endif
#if defined Iter_OnVehicleStreamIn
return Iter_OnVehicleStreamIn(vehicleid, forplayerid);
#else
return 1;
#endif
}
#if defined _ALS_OnVehicleStreamIn
#undef OnVehicleStreamIn
#else
#define _ALS_OnVehicleStreamIn
#endif
#define OnVehicleStreamIn Iter_OnVehicleStreamIn
#if defined Iter_OnVehicleStreamIn
forward Iter_OnVehicleStreamIn(vehicleid, forplayerid);
#endif
/*
Iter_OnVehicleStreamOut
*/
public OnVehicleStreamOut(vehicleid, forplayerid)
{
#if FOREACH_I_PlayerVehiclesStream
Iter_Remove(PlayerVehiclesStream[forplayerid], vehicleid);
#endif
#if FOREACH_I_VehiclePlayersStream
Iter_Remove(VehiclePlayersStream[vehicleid], forplayerid);
#endif
#if defined Iter_OnVehicleStreamOut
return Iter_OnVehicleStreamOut(vehicleid, forplayerid);
#else
return 1;
#endif
}
#if defined _ALS_OnVehicleStreamOut
#undef OnVehicleStreamOut
#else
#define _ALS_OnVehicleStreamOut
#endif
#define OnVehicleStreamOut Iter_OnVehicleStreamOut
#if defined Iter_OnVehicleStreamOut
forward Iter_OnVehicleStreamOut(vehicleid, forplayerid);
#endif
#endif
Я думаю, далеко не во всех случаях они будут бесполезны (Какой-нибудь античит, например, где нужно в радиусе проверку делать. Хотя тут нужно проводить замеры нагрузки, по хорошему, ибо может быть разная картина при маленьком и большом онлайне).
Вообще речь ведь о том, что нужно использовать всё сознательно (чувствую себя Капитаном Очевидность, хотя почему-то не все этой истины понимают). Тогда и проблем не будет