Web development Programiranje, dizajn, hosting i sve ostalo vezano uz razvoj web siteova |
|
05.12.2013., 11:30
|
#1
|
Registrirani korisnik
Registracija: Jun 2008.
Lokacija: zg
Postova: 3,342
|
Javascript nakuplja radnu memoriju
Pozdrav,
radio sam igricu u canvasu http://bozoou.com/rukomet/ (Pucanje je tipka B)
... i zanima me koji su mogući razlozi da ta igrica počne blesirati (štekati) nakon nekog vremena rada.
Promatram RAM-e ..i oni lagano cijelo vrijeme rastu, dok je moj procesor na nekih 30% ak vrtim na mozilli.
Uglavnom..radi sve glatko nakon pokretanja...ali nakon nekog vremena počme lagano štekati. ....ponekad se čak desi ( ali nakon izvjesnog vremena) da se procesor zakuca u vrh a igrica totalno uspori.
Gdje može biti problem? .., i za početak koji su razlozi skupljanja RAM-a? Može li se to izbjeći?? Hvala
|
|
|
05.12.2013., 15:10
|
#2
|
Registrirani korisnik
Registracija: Jan 2010.
Lokacija: Split
Postova: 333
|
mozda neces dobiti puno iz mog odgovora ali ... JS je skriptni programski jezik koji se izvrsava na racunalu klijenta, znaci trosi tvoje resurse (RAM i procesor) ... u pravilu JS se izvodi liniju po liniju, pa je moguce da na nekoj liniji imas memory leek (ako je to uopce moguce u JS) pa nakon vise puta pokretanja iste linije dolazi to crash-a ...
|
|
|
05.12.2013., 17:01
|
#3
|
Registrirani korisnik
Registracija: Jun 2008.
Lokacija: zg
Postova: 3,342
|
Pa jasno mi je da JS troši klijentov RAM, ali ne kužim zašto se povećava potrošnja RAM-a, nakon što su jednom sve varijable definirane.
Kakva bi to linija bila koja je "memory leek" , postoje li neke specifične situacije koje treba izbjegavati??
|
|
|
05.12.2013., 17:31
|
#4
|
maternični replikator
Registracija: Apr 2013.
Postova: 11,801
|
Ajd ako nije problem kopiraj sumnjive skripte, lakše ćemo tako naći, ovako je to samo nagađanje.
__________________
Ne očajavamo, zato što se ne nadamo nikom. Ničemu dobrom, ničemu lošem tu ne nada se niko.
I sa tom diplomom, i sa šljakom sam se slik’o. Rintao k'o magarac, sve dok nisam rikn'o.
|
|
|
05.12.2013., 22:22
|
#5
|
(defn the-answer [n] 42)
Registracija: Aug 2007.
Postova: 439
|
JavaScript se u Chrometu kompajlira u native code koji se onda izvršava. Slično je i drugim browserima koji kompajliraju JavaScript u bytecode npr. Tak da izvršavanje liniju po liniju nema s tim veze. A nebi imalo niti da se baš tak interpreterski izvršava.
@bozoou: ono kaj tebi treba za početak je profiliranje izvršavanja aplikacije. Vidi na primjer http://coding.smashingmagazine.com/2...veloper-tools/
|
|
|
05.12.2013., 23:04
|
#6
|
Registrirani korisnik
Registracija: Jun 2008.
Lokacija: zg
Postova: 3,342
|
Quote:
mr-crime kaže:
Ajd ako nije problem kopiraj sumnjive skripte, lakše ćemo tako naći, ovako je to samo nagađanje.
|
Naravno da mi nije problem ..samo ne volim sve kopirati da se ljudi ne poplaše
Evo započetak da sažmem tijek informacije:
Ovdje se vidi glavna petlja, koja poziva za svaki frame update funkciju svakog objekta (gdje se izvršava logika, računaju nove koordinate ovisno o brzini itd), i render funkciju svakog objekta (gdje se izvršava funkcija crtanja objekta)
PHP Code:
var Game={}; Game.loop = function() { objectUpdate({fps:Game.fps,shapes:Game.shapes}); renderEkran({canvas:Canvas,shapes:Game.shapes}); }; Game.fps=46; function startGame(f) { Game.shapes=f.shapes Game.timeInterval = setInterval(function(){Game.loop()},1000/Game.fps); }
E sad, funkcija objectUpdate prolazi kroz svaki objekt koji se nalazi u listi Game.shapes, i poziva funkciju toga objekta ako ona postoji:
PHP Code:
function objectUpdate(f) { var t=1/f.fps; for(var x in f.shapes) { if(f.shapes[x].update)f.shapes[x].update(t); } }
Funkcija render je zamišljena isto kao gornja update, ali s malim dodatkom. Prije nego protrči kroz listu Game.shapes, sortira tu listu prema vrijednosti y koordinate...i tu se stvara jedna privremena lista u svakom fram-u. Ja sporazumjevam da takve liste nestaju same od sebe iz memorije....
(Sortiranje je iz razloga da prvo crtam objekte s većom y koordinatom, koja predstavlja dubinu na slici .... rado bi primio savjet kako se ovo može elegantnije izvesti da ne moram sortirati u svakom frame-u)
PHP Code:
function renderEkran(f) { clearCanvas(f.canvas); var indexedList=sortObjectList(f.shapes,'y'); for(var x in indexedList)if(indexedList[x].render)indexedList[x].render(f.canvas); }
To je ono što se ponavlja puno puta ..a u sljedećem postu ću staviti ugrubo kako stvaram te objekte koji se nalaze u Game.shapes
|
|
|
05.12.2013., 23:19
|
#7
|
Registrirani korisnik
Registracija: Jun 2008.
Lokacija: zg
Postova: 3,342
|
Znači kreiranje nove igre izgleda ovako:
(Radi pojednostavljenja, neću staviti cijele update funkcije objekata niti njihove sve atribute...ali stavit ću dovoljno za pokazni primjer da se vidi na koji način unutar jedne update funkcije pozivam ostale objekte)
PHP Code:
function newGame() { var igrac={}; igrac.img=new Image(); igrac.src='img/igrac.png'; igrac.x=0; igrac.y=0; igrac.z=0; igrac.speed=10;
var lopta={}; lopta.img=new Image(); lopta.src='img/lopta.png'; lopta.x=10; lopta.y=10; lopta.z=10; lopta.speed=100;
lopta.render=function(canvas) { canvas.drawImage(this.img,this.x,this.y,20,20); } lopta.update=function(t) { lopta.x+=lopta.speed*t; if(lopta.x>200)igrac.speed=0; // << znaci unutar jedne update funkcije, slobodno baratam drugim objektima koji su definirani unutar funkcije newGame() }
Mousetrap.bind('b',function(e) { igrac.speed+=200; lopta.speed=0; //ovo je funkcija koja se aktivira pritskom na tipku "b", tu također slobodno baratam svim objektima koje sam definirao unutar funkcije newGame() })
startGame({shapes:[igrac,lopta]}); // ovdje se znači aktivira timeInterval pokazan u postu iznad }
|
|
|
06.12.2013., 00:12
|
#8
|
Registrirani korisnik
Registracija: Jun 2008.
Lokacija: zg
Postova: 3,342
|
Quote:
Refulgent_Splendour kaže:
JavaScript se u Chrometu kompajlira u native code koji se onda izvršava. Slično je i drugim browserima koji kompajliraju JavaScript u bytecode npr. Tak da izvršavanje liniju po liniju nema s tim veze. A nebi imalo niti da se baš tak interpreterski izvršava.
@bozoou: ono kaj tebi treba za početak je profiliranje izvršavanja aplikacije. Vidi na primjer http://coding.smashingmagazine.com/2...veloper-tools/
|
Zanimljivo...proučit ću to bolje prvom prilikom!
|
|
|
06.12.2013., 12:23
|
#9
|
maternični replikator
Registracija: Apr 2013.
Postova: 11,801
|
Quote:
Prije nego protrči kroz listu Game.shapes, sortira tu listu prema vrijednosti y koordinate...i tu se stvara jedna privremena lista u svakom fram-u. Ja sporazumjevam da takve liste nestaju same od sebe iz memorije....
|
Nemoj nikad podrazumjevati collector jer nije pouzdano da će počistiti, bolje koristi jednu listu(polje ili što već) i u njega uvijek trpaj nove podatke, piši preko prošlog frame-a, smanjit ćeš load, i mislio sam da je ovako nešto, kad isprobaš ovako vidjet ćeš jel ti pomoglo.
__________________
Ne očajavamo, zato što se ne nadamo nikom. Ničemu dobrom, ničemu lošem tu ne nada se niko.
I sa tom diplomom, i sa šljakom sam se slik’o. Rintao k'o magarac, sve dok nisam rikn'o.
|
|
|
07.12.2013., 20:58
|
#10
|
Registrirani korisnik
Registracija: Jun 2008.
Lokacija: zg
Postova: 3,342
|
Malo sam guglao o Memory leak i sad sam mrvicu upućeniji.
Nadam se da će vrijediti ovo što spojminješ da prepisujem nove vrijednosti preko već definiranih varijabli. Po tome bi znači vrijedilo napraviti ovako u spomenutom primjeru:
PHP Code:
function renderEkran(f)
{
clearCanvas(f.canvas);
this.indexedList=sortObjectList(f.shapes,'y');
for(var x in this.indexedList)if(this.indexedList[x].render)this.indexedList[x].render(f.canvas);
}
Mislim, već sam ugradio promjene...ali igrica je ionako imala boljih i lošijih dana, pa su mi razlike trenutno teško usporedive. Vrijeme će najbolje pokazati hoće li doći opet do gušenja...
|
|
|
08.12.2013., 14:15
|
#11
|
Registrirani korisnik
Registracija: Jun 2008.
Lokacija: zg
Postova: 3,342
|
Nije pomoglo
Čak kad gledam, možda problem i nije do skupljanja memorije.... imao sam situaciju da igram par minuta, CPU na 30% cijelo vrijeme sa oscilacijama +-5%. Baš onako sve uredno...i onda odjednom skoči na 70%, igrica vidno uspori (čak bez trzanja, ali postane teška) ...i onda dolazi iza toga lagano štekanje koje u konačnici završava u totalnom kaosu...
|
|
|
09.12.2013., 00:52
|
#12
|
Registrirani korisnik
Registracija: Jan 2010.
Lokacija: Split
Postova: 333
|
pogledaj da negdje nemas rekurzivnih funkcija jer jedu memoriju nenormalno ...
|
|
|
09.12.2013., 10:09
|
#13
|
Registrirani korisnik
Registracija: Jun 2008.
Lokacija: zg
Postova: 3,342
|
Pa one bi od početka pravile velike probleme....i njih bi uočio u onom alatu za mjerenje što je mr-crime preporučio, jer bi te funkcije odskakale u utrošenom cpu, a meni je sve ravnopravno....barem koliko za sad kužim taj alat, no definitivno ga moram bolje prokužiti....
|
|
|
|
Sva vremena su GMT +2. Trenutno vrijeme je: 13:08.
|
|
|
|