Новое решение для ускорение циклов. В ~7 раз быстрее векторов, с остальным не проверял.
Ссылка на инклюд: http://forum.sa-mp.com/showthread.php?p=2620155
Ссылка на плагин: http://forum.sa-mp.com/showthread.php?t=451381
Результат теста на 1000000 итераций на 500 игроков:
Vectors: 70683 ms
Lists: 11472 ms
Тест 10000 итераций на 500 игроков:
Vectors: 712 ms
Lists: 123 ms
GetMaxPlayers: 68 ms
Тест 10000 итераций на 50 игроков:
Vectors: 72 ms
Lists: 12 ms
GetMaxPlayers: 68 ms
Пример:
PHP код:
new LIST::init<PLAYERS>; // Создаем список
public OnPlayerConnect(playerid)
{
SetPVarInt(playerid, "nodeid_list", _:LIST::push_back(PLAYERS, playerid)); // Добавляем в список и сохраняем номер в списке
return 1;
}
public OnPlayerDisconnect(playerid)
{
LIST::erase(PLAYERS, ListIt:GetPVarInt(playerid, "nodeid_list")); // Удаляем из списка
return 1;
}
// например, таймер...
forward OtherTimer();
public OtherTimer()
{
LIST::foreach<i>(PLAYERS)
{
new playerid = LIST_IT::data(i); // получаем из ячейки i значение
SendClientMessage(playerid, -1, "Привет :)");
}
}
public OnGameModeExit()
{
LIST::clear(PLAYERS); // Очищаем список
return 1;
}
Или:
PHP код:
#define foreach%2(%0:%1) for(new Pointer:__%0_x_ = Pointer:%1[LIST_base_begin], Pointer:_b_%0_ = MEM_EX::get_ptr(Pointer:%1[LIST_base_begin]->LIST_IT_data_data_offset), %0; _:__%0_x_ != NULL; _b_%0_ = (__%0_x_ = Pointer:MEM_EX::get_val(__%0_x_->LIST_IT_data_next))+Pointer:(LIST_IT_data_data_offset*MEM_MACR_SIZEOF_CELL)) if((%0 = LIST_IT_data(_b_%0_)))
new LIST::init<PLAYERS>; // Создаем список
public OnPlayerConnect(playerid)
{
SetPVarInt(playerid, "nodeid_list", _:LIST::push_back(PLAYERS, playerid)); // Добавляем в список и сохраняем номер в списке
return 1;
}
public OnPlayerDisconnect(playerid)
{
LIST::erase(PLAYERS, ListIt:GetPVarInt(playerid, "nodeid_list")); // Удаляем из списка
return 1;
}
// например, таймер...
forward OtherTimer();
public OtherTimer()
{
foreach(playerid:PLAYERS)
{
SendClientMessage(playerid, -1, "Привет :)");
}
}
public OnGameModeExit()
{
LIST::clear(PLAYERS); // Очищаем список
return 1;
}