←  Tutoriale

AMXX.pl: Support AMX Mod X i SourceMod

»

Warunek If

  • +
  • -
darkman - zdjęcie darkman 14.09.2008

Napisze tutaj jak używać warunku if(...) z zaoszczędzeniem użycia CPU.

Np.
if (get_user_team(player) == TEAM_T)
{
    //...kod
} else if (get_user_team(player) == TEAM_CT) {
    //...kod
} else if (get_user_team(player) == TEAM_SPECTATOR) {
    //...kod
}

Taki przykład kodu zużywa więcej procesora - dlaczego? Ponieważ za każdym razem kiedy stawiany jest warunek if(..) wywoływana jest funkcja get_user_team(player).

W użyciu wygląda to mniej więcej tak:
Wywołanie get_user_team
  Porównaj drużyne usera do tej która jest postawiona w Ifie, jeżeli jest prawdziwa - wykonaj kod
Wywołanie get_user_team
  Porównaj drużyne usera do tej która jest postawiona w Ifie, jeżeli jest prawdziwa - wykonaj kod
Wywołanie get_user_team
  Porównaj drużyne usera do tej która jest postawiona w Ifie, jeżeli jest prawdziwa - wykonaj kod


Można to zmienić na:
new team = get_user_team(player)
if (team == TEAM_T)
{
    //...kod
} else if (team == TEAM_CT) {
    //...kod
} else if (team == TEAM_SPECTATOR) {
    //...kod
}

Teraz będzie to wyglądało mniej więcej tak:
Wywołanie get_user_team
  Porównaj drużyne usera do tej która jest postawiona w Ifie, jeżeli jest prawdziwa - wykonaj kod
  Porównaj drużyne usera do tej która jest postawiona w Ifie, jeżeli jest prawdziwa - wykonaj kod
  itd.

Zamiast if można też użyć przełącznika switch, będzie to najlepsze rozwiązanie:
new team = get_user_team(player)
switch (team)
{
  case TEAM_T:
     //kod...
  case TEAM_CT:
     //kod...
  case TEAM_SPECTATOR:
     //kod...
}

Będzie to wyglądało tak:
Wywołaj get_user_team
  Wykonaj kod
  Wykonaj kod
  Wykonaj kod
Odpowiedz

  • +
  • -
grankee - zdjęcie grankee 15.09.2008

No darkman, znowu muszę Cię poprawiać ;>
Wywołanie Switch a if(team==TEAM_CT) w wykonaniu przez procesor wygląda identycznie, popraw byka:P
Odpowiedz

  • +
  • -
darkman - zdjęcie darkman 15.09.2008

dobra mistrzu skmiń coś i pokaż a nie poprawiaj moich tutków :D dlatego powiedziałem że switch będzie najlepszą metodą do zrobienia tego bo najmniej pisania i kod bardziej przejrzysty.
Odpowiedz

  • +
  • -
Miczu - zdjęcie Miczu 15.09.2008

Pomijajac fakt, ze jesli ktos nie zna zbytnio zastosowan funkcji sterujacych (czy. if, swich [nie wymieniam for i while bo to dla mnie bardziej petle :P]) to raczej nie poradzi sobie z pawn'em - mowiac inaczej, malo ludzi uzna to za szczegolnie przydatne.

Pomijajac powyzsze, GJ.
Odpowiedz

  • +
  • -
choyrack - zdjęcie choyrack 16.09.2008

Jak się czepiamy to można jeszcze :-)
Po co sprawdzać 3 warunki :?: Skoro gracz nie będzie T, ani nie będzie CT to musi być SPEC :-D
new team = get_user_team(player)
if (team == TEAM_T)
{
    //...kod
} else if (team == TEAM_CT) {
    //...kod
} else {
    //...kod
}

I to samo przy switch.
Jeden warunek mniej do sprawdzania - jak już mówimy o wykorzystaniu procesora.
Odpowiedz

  • +
  • -
darkman - zdjęcie darkman 16.09.2008

nie przyszło ci do głowy, że ktoś może sobie wymyślić coś takiego, że np. terroryści dostają inną broń ct inną? jeden z wielu przykładów które można wymyśleć w ciągu sekundy.
Odpowiedz

  • +
  • -
mgr inż. Pavulon - zdjęcie mgr inż. Pavulon 16.09.2008

Akurat choyrack'owi chodziło o to żeby zostawić dwa sprawdzanie tj:
Czy jesteś CT, a może jesteś TT, jeśli nie to jesteś SPECT'em.
Czyli CT dostaje swoją broń, TT dostają swoją a pozostali(SPECT'y) nic.
Czyli wszystko jest ok i tylko dwa IF'y.
Odpowiedz

  • +
  • -
Miczu - zdjęcie Miczu 16.09.2008

Sa 4 mozliwe wartosci:
CS_TEAM_T, CS_TEAM_CT, CS_TEAM_SPECTATOR, CS_TEAM_UNASSIGNED
Odpowiedz

  • +
  • -
Zullus - zdjęcie Zullus 23.06.2009

W jakim wypadku gracz jest CS_TEAM_UNASSIGNED ?
Odpowiedz

  • +
  • -
Knopers - zdjęcie Knopers 23.06.2009

jak gościu wszedł na serwer i jeszcze teamu nie wybrał
Odpowiedz

Gość__* 04.08.2009

if = instrukcja warunkowa ( takie małe domówienie ).
Odpowiedz

  • +
  • -
.Cz!t3R - zdjęcie .Cz!t3R 08.09.2010

Nie wiem dlaczego, ale nie mówicie o tym ułatwieniu w warunkach...:
Pokażę na przykładzie ustawiania wartości
Wartosc = (Wartosc > 100) ? 100 : Wartosc+1;

Czyli tak sprawdza czy Wartosc jest większa od 100 jeśli tak ustawia na 100, jeśli nie dodaje 1. Można te ułatwienie użyć w wielu przypadkach tworząc kod bardziej przejrzysty.

[Warn = GoQ]http://amxx.pl/warunki-t5396.html [/warn]
Odpowiedz