Natrag   Forum.hr > Informatička tehnologija > Internet > Web development

Web development Programiranje, dizajn, hosting i sve ostalo vezano uz razvoj web siteova

Odgovor
 
Tematski alati Opcije prikaza
Old 05.12.2013., 12:30   #1
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
bozoou is offline  
Odgovori s citatom
Old 05.12.2013., 16:10   #2
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 ...
josipmo is offline  
Odgovori s citatom
Old 05.12.2013., 18:01   #3
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??
bozoou is offline  
Odgovori s citatom
Old 05.12.2013., 18:31   #4
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.
mr-crime is offline  
Odgovori s citatom
Old 05.12.2013., 23:22   #5
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/
Refulgent_Splendour is offline  
Odgovori s citatom
Old 06.12.2013., 00:04   #6
Quote:
mr-crime kaže: Pogledaj post
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
bozoou is offline  
Odgovori s citatom
Old 06.12.2013., 00:19   #7
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

bozoou is offline  
Odgovori s citatom
Old 06.12.2013., 01:12   #8
Quote:
Refulgent_Splendour kaže: Pogledaj post
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!
bozoou is offline  
Odgovori s citatom
Old 06.12.2013., 13:23   #9
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.
mr-crime is offline  
Odgovori s citatom
Old 07.12.2013., 21:58   #10
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...
bozoou is offline  
Odgovori s citatom
Old 08.12.2013., 15:15   #11
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...
bozoou is offline  
Odgovori s citatom
Old 09.12.2013., 01:52   #12
pogledaj da negdje nemas rekurzivnih funkcija jer jedu memoriju nenormalno ...
josipmo is offline  
Odgovori s citatom
Old 09.12.2013., 11:09   #13
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....
bozoou is offline  
Odgovori s citatom
Odgovor


Tematski alati
Opcije prikaza

Kreni na podforum




Sva vremena su GMT +2. Trenutno vrijeme je: 09:19.