Что лучше Цикл или get_players?

Сообщения
673
Реакции
242
Помог
11 раз(а)
Собственно в название сам и вопрос
Что лучше использовать/целесообразно в плане оптимизации

Код:
new Players[32]
new Count, i, player
get_players(Players, Count, "h") //or get_players_ex(Players, Count, GetPlayers_ExcludeDead);
for (i=0; i<Count; i++)
{
    player = Players[i]
    //Code....
}
или
Код:
for(new i = 1; i <= MaxClients; i++)
{
    if(!is_user_connected(i)) continue;
    //Code
}
 
Сообщения
1,420
Реакции
2,511
Помог
58 раз(а)
В первом примере идёт получение по флагу "h", во втором варианте нет, соответственно там ещё нужно добавить проверку на HLTV.

Если делать первый вариант то вот:

Код:
new iPlayers[MAX_PLAYERS], iPlayerCount;
get_players_ex(iPlayers, iPlayerCount, GetPlayers_ExcludeHLTV);

for(new i; i < iPlayerCount; i++)
{
    // code
}
Нужно иметь ввиду что сохранять в отдельную переменную игрока нужно только если будет более 2 раз использоваться id. Пример:

Код:
new iPlayers[MAX_PLAYERS], iPlayerCount, iPlayer;
get_players_ex(iPlayers, iPlayerCount, GetPlayers_ExcludeHLTV);

for(new i; i < iPlayerCount; i++)
{
    iPlayer = iPlayers[i];

    client_print_color(iPlayer, iPlayer, "^1Your name: %n", iPlayer);
    client_print_color(iPlayer, iPlayer, "^1Your name: %n", iPlayer);
    client_print_color(iPlayer, iPlayer, "^1Your name: %n", iPlayer);
}
Во втором случае, будет медленнее, ибо проверки в AMXX медленнее если я не ошибаюсь, в get_players же эти проверки идут в самом AMXX.
 
Сообщения
333
Реакции
290
Помог
9 раз(а)
Limbooc, Очередной забавный вопрос про оптимизацию.. Какую задачу вы поставили перед собой? Чтобы ваша функция выполнилась не за 0,00002 сек, а за 0,00001? 21-й век, серверы давно не на "калькуляторах" работают да и объект- игровой сервер, а не управление баллистической ракетой.
Поставьте вопрос- целесообразно или нет в данном случае и дайте ответ сами.
Например: Нужно знать количество игроков без учета мертвых - используйте первый вариант. Не нужно- используйте другой.
 
Сообщения
673
Реакции
242
Помог
11 раз(а)
zhorzh78,

Но ведь get_players проходит 2 цикла, а цикл 1

Код:
static cell AMX_NATIVE_CALL get_players(AMX *amx, cell *params) /* 4 param */
{
    int iNum = 0;
    int ilen;
    char* sptemp = get_amxstring(amx, params[3], 0, ilen);
    int flags = UTIL_ReadFlags(sptemp);

    cell *aPlayers = get_amxaddr(amx, params[1]);
    cell *iMax = get_amxaddr(amx, params[2]);

    int team = 0;

    if (flags & 48)
    {
        sptemp = get_amxstring(amx, params[4], 0, ilen);

        if (flags & 16)
        {
            if (flags & 64)
                team = g_teamsIds.findTeamId(sptemp);
            else
                team = g_teamsIds.findTeamIdCase(sptemp);
        }
    }

    for (int i = 1; i <= gpGlobals->maxClients; ++i)
    {
        CPlayer* pPlayer = GET_PLAYER_POINTER_I(i);
        if (pPlayer->ingame)
        {
            if (pPlayer->IsAlive() ? (flags & 2) : (flags & 1))
                continue;
            if (pPlayer->IsBot() ? (flags & 4) : (flags & 8))
                continue;
            if ((flags & 16) && (pPlayer->teamId != team))
                continue;
            if ((flags & 128) && (pPlayer->pEdict->v.flags & FL_PROXY))
                continue;
            if (flags & 32)
            {
                if (flags & 64)
                {
                    if (stristr(pPlayer->name.c_str(), sptemp) == NULL)
                        continue;
                }
                else if (strstr(pPlayer->name.c_str(), sptemp) == NULL)
                    continue;
            }
            aPlayers[iNum++] = i;
        }
    }

    *iMax = iNum;
    
    return 1;
}
 
Сообщения
333
Реакции
290
Помог
9 раз(а)
Limbooc, Да хоть 3. Все зависит от конкретной задачи, а не от куска кода с потолка.
Если вам во втором варианте нужно будет отфильтровать живых террористов без учета ботов, то будете вызывать дополнительно 3 натива для проверки. В то время, как в первом вы это сделаете за 1 цикл for (int i = 1; i <= gpGlobals->maxClients; ++i)
Если же нужно, например 1 раз в минуту, сделать что-то со всеми соединенными игроками без разделения по критериям, то 2-й вариант проще (хоть и не единственный). Тут уже на любителя ("оптимизаций")
 

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

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу