Zaloguj się by uzyskać pełen dostęp. Nie masz jeszcze konta? Założ je już teraz w kilka sekund.

Wysłany: 2014-05-26, 16:19


MeeShuffle

Programista/Grafik






Wiek: 32
Na forum: 4394 dni
Posty: 2758
Nick w MP: Shuffle

Piwa: 8575

Respekt: 535,3
Respekt: 535,3

W dzisiejszym poradniku, chcia?bym przedstawi? Wam p?tle. P?tla w zwyczajnej formie, wykonuje kod poni?ej i wraca do pocz?tku po czym wykonuje go jeszcze raz i tak bez ko?ca. Przejd?my do praktyk.


Przyk?ad p?tli :


for k,v in ipairs getElementsByType "player" )) do



Opiszmy j? Sobie


for - z angielskiego "dla"

k - inaczej key, rzadko u?ywany w kodzie.
v - inaczej value, zwraca nam warto?? kt?r? podali?my dla elementu w nawiasie.

do - z angielskiego "zr?b"



Podana wy?ej p?tla, sprawdza wszystkie obiekty, czyli "player" ( gracz ).
w tym przypadku v zwr?ci nam wszystkich graczy obecnych na serwerze.

UWAGA : R??nic? podam w kolejnym poradniku.


Przyk?ad w kodzie :



addCommandHandler "gracze", function()
for k,v in ipairs getElementsByType "player" )) do
outputChatBox getPlayerName ), root )
end
end)



Wspomn?, ?e p?tla wymaga dodania END.

Ten kod, pokazuje nam nicki graczy na serwerze, inaczej t?umacz?c

sprawdza nick i go wy?wietla, potem znowu sprawdza nick i znowu go wy?wietla i tak dop?ki kod nie stwierdzi, ?e pokaza? wszystkich graczy i sam przestanie sprawdza?.




Drugim rodzajem p?tli jest p?tla ograniczona.
Mo?emy j? ograniczy? do x razy.
Jak wcze?niej wspomnia?em i zwraca liczb? czyli :


for 1,100 do



w tym przypadku nie mamy ?adnego nawiasu jest zwyczajna warto??, podana p?tla u?yje si? 100 razy jak pokazuje 1,100


Przyk?ad w kodzie, kt?ry wyczy?ci nam chat :


addCommandHandler "czysc", function()
for 1,10 do
outputChatBox " "root )
end
end)


Kod u?yje si? 10 razy, wy?wietlaj?c pust? wiadomo??, symuluj?c? czyszczenie chatu.


Trzecim rodzajem p?tli jest p?tla indeksowa.


P?tl? indeksow? wykonujemy tak :

indeks = {
{}
}


for k,v in ipairs indeks ) do


Ta p?tla, sprawdza wszystkie elementy, umieszczone w indeksie, kt?rego zmienna jest podawana w nawiasie.

Przyk?ad :


indeks = {
{ "Tekst1" },
{ "Tekst2" }
}


addCommandHandler "pokaz", function()
for k,v in ipairs indeks ) do
outputChatBox v[1], root )
end
end)


Po wpisaniu "pokaz", wy?wietli nam na chacie Tekst1 oraz Tekst2. Pami?tajmy, ?e je?li dajemy w nawiasie indeks, zawsze musimy poda? "numer warto?ci".

Czyli je?li mamy


indeks = {
{ xy,}
}



to chc?c pobra? x dajemy v[1], chc?c pobra? y dajemy v[2], z v[3], dlaczego ?
x jest pierwsze, y drugie, z trzecie. Pro?ciej wyt?umaczy? chyba nie mo?na :)



Na koniec dla tych co zrozumieli, jaka jest r??nica mi?dzy ipairs a pairs


pairs - jest szybsze od ipairs o 0.3 milisekundy. Mo?e to niewielka r??nica, ale w kodzie czyni du?y odst?p.


Zapraszam do nast?pnego poradnika. W razie pyta?, zapraszam do komentowania.


W kolejnym poradniku : P?tle c.d. ( while )

Podpis

https://shufflecode.pl
Static Codes and Graphics - Join our discord!
Postaw piwo autorowi tego posta
 

 
Więcej szczegółów
Wystawiono 4 piw(a):
Tygrys1, tokpl, kuba43, ShadowING
Wysłany: 2014-05-27, 14:57


Yazir







Wiek: 36
Na forum: 4391 dni
Posty: 9
Nick w MP: Yazir

Piwa: 2

Respekt: 80

Pytanie: Jak zrobi? aby co 10 sekund co? si? dzia?o?

Postaw piwo autorowi tego posta
 

 
Wysłany: 2014-05-27, 15:05


MeeShuffle

Programista/Grafik






Wiek: 32
Na forum: 4394 dni
Posty: 2758
Nick w MP: Shuffle

Piwa: 8575

Respekt: 535,3
Respekt: 535,3

to ju? nie musisz p?tl?, mo?esz zrobi? to tak :


function cos ()
outputChatBox "cos"root )
end
setTimer cos10000)


Podpis

https://shufflecode.pl
Static Codes and Graphics - Join our discord!
Postaw piwo autorowi tego posta
 

 
Wysłany: 2014-05-28, 08:16


Wielebny







Wiek: 41
Na forum: 5499 dni
Posty: 257
Nick w MP: Wielebny

Piwa: 1690

Respekt: 180
Respekt: 180Respekt: 180

Cytat:


Na koniec dla tych co zrozumieli, jaka jest r??nica mi?dzy ipairs a pairs

pairs - jest szybsze od ipairs o 0.3 milisekundy. Mo?e to niewielka r??nica, ale w kodzie czyni du?y odst?p.


Pomiar 'z dupy'. W jakich warunkach, na jakich kluczach, na jakim sprz?cie jest szybsze? Czy jeste? pewny ?e jest szybsze? Ja jestem przeciwnego zdania.

R??nica pomi?dzy ipairs i pairs jest diametralna: ipairs iteruje po kluczach bed?cych kolejnymi liczbami naturalnymi, pairs iteruje po wszystkich kluczach.



Postaw piwo autorowi tego posta
 

 
Wysłany: 2014-05-28, 15:12


Tey







Wiek: 31
Na forum: 4876 dni
Posty: 155
Nick w MP: l0nger

Piwa: 280

Respekt: 193
Respekt: 193Respekt: 193

"Wielebny" napisał/a:

Cytat:


Na koniec dla tych co zrozumieli, jaka jest r??nica mi?dzy ipairs a pairs

pairs - jest szybsze od ipairs o 0.3 milisekundy. Mo?e to niewielka r??nica, ale w kodzie czyni du?y odst?p.


Pomiar 'z dupy'. W jakich warunkach, na jakich kluczach, na jakim sprz?cie jest szybsze? Czy jeste? pewny ?e jest szybsze? Ja jestem przeciwnego zdania.

R??nica pomi?dzy ipairs i pairs jest diametralna: ipairs iteruje po kluczach bed?cych kolejnymi liczbami naturalnymi, pairs iteruje po wszystkich kluczach.

Obrazek

Osobiscie jestem twierdzenia, ze pairs jest szybsze od ipairs, nawet popar?em to kodem sprawdzaj?cym:

local t={}
for i=11000 do
   t[i]=math.random(0,1000)
end

local tick=os.clock()
for i=110000 do
  for i,v in pairs(t) do
     t[i]=v+1
  end
end
print("PAIRS: wykonano w " .. os.clock()-tick)

local tick=os.clock()
for i=110000 do
  for i,v in ipairs(t) do
     t[i]=v+1
  end
end
print("IPAIRS: wykonano w " .. os.clock()-tick)

Ca?o?? by?a testowana na lua online. R??nica jest spora, bo praktycznie 0.04 milisekundy, niby nic, ale zawsze co?, ponadto roznica bedzie sie zaczynac dopiero gdy ilosc kluczy bedzie wieksza niz 10 (przy 20 juz zaczyna uciekac jakies 0.01 ms).

Postaw piwo autorowi tego posta
 

 
Wysłany: 2014-05-28, 19:26


Wielebny







Wiek: 41
Na forum: 5499 dni
Posty: 257
Nick w MP: Wielebny

Piwa: 1690

Respekt: 180
Respekt: 180Respekt: 180

Faktycznie, mea culpa, w niekt?rych sytuacjach[1] pairs jest szybsze, ale my?l?, ?e r??nica jest na tyle pomijalna, ?e nie warto na jej rzecz rezygnowa? z funkcji, przygotowanej w?asnie do tego.

A je?li tak bardzo zale?y komu? na optymalizacji p?tli, to zawsze mo?e spr?bowa? takich iteracji:


local t={}
for i=11000 do
   t[i]=math.random(0,1000)
end

local tick=os.clock()
for i=110000 do
  for i,v in pairs(t) do
     t[i]=v+1
  end
end
print("PAIRS: wykonano w " .. os.clock()-tick)

local tick=os.clock()
for i=110000 do
  for i,v in ipairs(t) do
     t[i]=v+1
  end
end
print("IPAIRS: wykonano w " .. os.clock()-tick)

local tick=os.clock()
for i=110000 do
  for i,v in nextdo
     t[i]=v+1
  end
end
print("next: wykonano w " .. os.clock()-tick)

local tick=os.clock()
for i=110000 do
  for i=1,#t do
     local v=t[i]
     t[i]=v+1
  end
end
print("iterate: wykonano w " .. os.clock()-tick)


Wynik:
Kod:


lbiegaj@valhalla:/tmp$ lua go.lua
PAIRS: wykonano w 0.55
IPAIRS: wykonano w 0.6
next: wykonano w 0.53
iterate: wykonano w 0.34


Warto te? zauwa?y?, ze przetwarzanie czegokolwiek w skrypcie przez p?? sekundy to stanowczo zbyt d?ugo i spowoduje 'przywis' threadu z kodem na ten w?asnie okres czasu. Je?li potrzeba przetwarza? du?e lub czasoch?onne p?tle to warto zrealizowa? to za pomoc? couroutines. Przyk?adowy kod przetwarzaj?cy tablic? w ten spos?b:


function loadDomy()
    local tt=getTickCount()
    i=0
    local dbdomy
    dbdomy=exports.DB:pobierzTabeleWynikow("SELECT d.id,d.biznes_id,d.descr,d.vwi,d.drzwi,d.punkt_wyjscia,d.interiorid,d.ownerid,d.owning_org,o.nazwa o...")

    for __,v in ipairs(dbdomy) do
      if dodajDom(v,falsethen i=i+1 end
      if i%6==0 then
        setTimer(function() coroutine.resume(coroutine_loadDomyend1501).
        coroutine.yield()
      end
    end
end

-- ladowanie domow via coroutine
coroutine_loadDomy=coroutine.create(loadDomy)
coroutine.resume(coroutine_loadDomy)


Normalnie funkcja dodajDom trwa kilkana?cie milisekund i za?adowanie tysi?ca dom?w zawiesza?o wykonywanie skrypt?w na serwerze na kilka sekund. Za pomoc? wznawianej coroutine ?adowane jest po 6 dom?w z odst?pem 150ms, dzi?ki czemu inne skrypty i eventy mog? by? prawid?owo przetwarzane.

To taki offtopic, na marginesie, ale my?le ?e lepsza to metoda na optymalizacj?, ni? urywanie u?amk?w milisekund na pairs.

[1] http://facepunch.com/showthread.php?t=875909
http://img204.imageshack....159/100000z.png

Postaw piwo autorowi tego posta
 

 
Wysłany: 2014-06-13, 13:08


|Mlody|

Szatan ponad Szatana






Wiek: 30
Na forum: 4375 dni
Posty: 60
Nick w MP: Akiver

Piwa: 205

Respekt: 52,5

R??nica jest niewielka, lecz w niekt?rych przypadkach mo?e by? wi?ksza.

Podpis

Fast Life RPG |GTA V - Misje, napady na banki, wyścigi i wiele innych atrakcji|NFS - Stwórz swoją anarchię, zostań królem wyścigów, zdobywaj osiągnięcia.. Fast Life RPG - 20%
Postaw piwo autorowi tego posta
 

 
Wysłany: 2014-06-14, 20:10


Piorun







Wiek: 32
Na forum: 6712 dni
Posty: 1837
Nick w MP: Piorun

Piwa: 516

Respekt: 480,7
Respekt: 480,7

Wielebny, jeste? pewny, ?e MTA dopuszcza u?ywania funkcji coroutine? Ostatnio jak chcia?em przetestowa? funkcje os to MTA wypieprzy?o mi b??d, ?e nie znalaz?o podanych funkcji :P .

Podpis
Możesz mnie znaleźć na: Facebook
Postaw piwo autorowi tego posta
 

 
Wysłany: 2014-06-18, 10:33


Wielebny







Wiek: 41
Na forum: 5499 dni
Posty: 257
Nick w MP: Wielebny

Piwa: 1690

Respekt: 180
Respekt: 180Respekt: 180

"Piorun" napisał/a:

Wielebny, jeste? pewny, ?e MTA dopuszcza u?ywania funkcji coroutine? Ostatnio jak chcia?em przetestowa? funkcje os to MTA wypieprzy?o mi b??d, ?e nie znalaz?o podanych funkcji :P .


Dopuszcza, u?ywam ich regularnie.

Postaw piwo autorowi tego posta
 

 
Wysłany: 2014-06-25, 13:02


tomaz0405







Wiek: 33
Na forum: 4368 dni
Posty: 3



Respekt: 50

Wielolebny to czemu mi te funkcje nie dzia?aj?? -,-

Postaw piwo autorowi tego posta
 

 
Wysłany: 2014-06-25, 23:43


Wielebny







Wiek: 41
Na forum: 5499 dni
Posty: 257
Nick w MP: Wielebny

Piwa: 1690

Respekt: 180
Respekt: 180Respekt: 180

Nie mam szklanej kuli i nie zgadn? co u Ciebie nie dzia?a, ale je?li masz jaki? problem z coroutines, to mo?e oprzyj si? na tym ma?ym przyk?adzie:



local STEP=100 -- po ile naraz przerabiamy

function liczymy()
  outputChatBox(" ")
  outputChatBox("Liczymy do miliona bez wieszania serwera")

  for i=1,1000000 do

    outputDebugString("i == " .. i)

    if i%STEP==0 then
        setTimer(function() coroutine.resume(coroutine_liczymyend501)
        coroutine.yield()
    end

  end

  outputChatBox("Policzone!")
end

coroutine_liczymy=coroutine.create(liczymy)
coroutine.resume(coroutine_liczymy)


Postaw piwo autorowi tego posta
 

 
Wysłany: 2015-02-23, 22:57


ZagroHD

Uczeń w LUA






Wiek: 25
Na forum: 4197 dni
Posty: 29
Nick w MP: Zagro

Piwa: 1

Respekt: 50

Kod:

addCommandHandler ( "czysc", function()
for i = 1,10 do
outputChatBox ( " ", root )
end
end)

Takie pytanko co do tego kodu. Interesuje mnie komenda kt?r? wpisujemy aby nam wykona?o czynno??, czyli b?dzie to /czysc czy poprostu czysc? Chodzi mi czy na czacie lokalnym tak mo?na napisa?.

Podpis
Jak czegoś nie ogarniam napisz na PW ;)
Postaw piwo autorowi tego posta
 

 
Wysłany: 2015-02-23, 23:07


Novovix

xNinja powraca






Wiek: 26
Na forum: 4870 dni
Posty: 240
Nick w MP: xNinja

Piwa: 452

Respekt: 80,5

Na serwerze klikasz liter? "t" i wpisujesz /czysc lub F8 i wpisujesz samo "czysc"

Postaw piwo autorowi tego posta
 

 
Tagi: wstęp :: lua :: pętle
Anonymous





Na forum: 245 dni
Posty: 1



Anonymous Koniecznie zajrzyj na:






Skocz do:  
Wyświetl posty z ostatnich:   
GTAONLINE.PL » JĘZYKI PROGRAMOWANIA » LUA » Poradniki do LUA Ten temat jest zablokowany bez możliwości zmiany postów lub pisania odpowiedzi

Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Dodaj temat do Ulubionych
Wersja do druku