Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Pamieć przeglądarki - setInterval
rulespl
post
Post #1





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 29.03.2009

Ostrzeżenie: (0%)
-----


Witam

Mam problem z cyklicznie (setInterval) wywoływaną funkcją.
Jej zadaniem jest m.in. podmiana atrybytu src dla <img>:

  1. function assign_image() {
  2. ('#element').attr('src', nowa_sciezka);
  3. }


Przy każdym wywołaniu tej funkcji zwiększa się zużycie pamięci przez przeglądarkę.
Jak to zwalczyć?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
zegarek84
post
Post #2





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

Ostrzeżenie: (0%)
-----


po pierwsze nie jestem pewien, czy podałeś cały dokładny kontekst czy tylko fragment tego co zamierzasz uzyskać...

po drugie każdy z tych obrazków może być buforowanych w danej przeglądarce...

po trzecie skoro wiesz, w którym obrazku zmieniasz ścieżkę to znacznie szybciej by to działało jeśli byś zbuforował gdzieś albo obiekt jQuery z wyszukanym elementem DOM albo sam surowy element drzewa DOM...

najlepiej daj przykład live...


--------------------
Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.

Go to the top of the page
+Quote Post
rulespl
post
Post #3





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 29.03.2009

Ostrzeżenie: (0%)
-----


Kod jest trochę zawiły i jest tam kilka innych dodatkowych funkcji dlatego nie zamieszczałem całego.

Cytat
po drugie każdy z tych obrazków może być buforowanych w danej przeglądarce...

Jak usunąć w takim razie poprzednie obrazki?

Cytat
po trzecie skoro wiesz, w którym obrazku zmieniasz ścieżkę to znacznie szybciej by to działało jeśli byś zbuforował gdzieś albo obiekt jQuery z wyszukanym elementem DOM albo sam surowy element drzewa DOM...


Jak zbuforować taki obiekt DOM? Jakiś przykład, gdzie można to w dokumentacji znaleźć?
Go to the top of the page
+Quote Post
kamil4u
post
Post #4





Grupa: Zarejestrowani
Postów: 2 350
Pomógł: 512
Dołączył: 4.01.2009
Skąd: Wrocław / Świdnica

Ostrzeżenie: (0%)
-----


Cytat
Jak zbuforować taki obiekt DOM? Jakiś przykład, gdzie można to w dokumentacji znaleźć?

Zmienną globalną smile.gif
[JAVASCRIPT] pobierz, plaintext
  1. var zmienna = document.getElementById('id'); //$('#id');
  2. function test(){
  3. zmienna.operacje(); //dzięki temu przeglądarka nie będzie za każdym razem wyszukiwać elementu zmienna
  4. }
[JAVASCRIPT] pobierz, plaintext


Opisz co chcesz osiągnąć, może jest na to jakiś inny lepszy sposób. Co do cache, to może być problem smile.gif I daj wreszcie przykład 'live'.


--------------------
Go to the top of the page
+Quote Post
rulespl
post
Post #5





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 29.03.2009

Ostrzeżenie: (0%)
-----


Cytat(kamil4u @ 5.09.2011, 15:57:06 ) *
Opisz co chcesz osiągnąć, może jest na to jakiś inny lepszy sposób. Co do cache, to może być problem smile.gif I daj wreszcie przykład 'live'.


Przykład 'live', kod odpowiedzialny za problem wygląda tak:
[JAVASCRIPT] pobierz, plaintext
  1. function check_image(img,id) {
  2. if (!img.complete) {
  3. return false;
  4. }
  5. if (typeof img.naturalWidth != "undefined" && img.naturalWidth == 0) {
  6. return false;
  7. }
  8. timestamp = timestamp + 1;
  9. loading[id] = 'complete';
  10. return true;
  11. }
  12.  
  13. function assign_image(x) {
  14. switch(x) {
  15. case 0: {
  16. if (loading[x] == 'empty') {
  17. image0 = new Image();
  18. var dateNow = new Date();
  19. image0.src = image_output[x] + '&timestamp='+timestamp+'&rand='+dateNow.valueOf();
  20. loading[x] = 'progress';
  21. }
  22. else if (loading[x] == 'progress') {
  23. check_image(image0,x);
  24. }
  25. else if (loading[x] == 'complete') {
  26. $('#img_src').attr('src',image_output[x] + '&timestamp='+timestamp);
  27. loading[x] = 'empty';
  28. }
  29. break;
  30. }
  31. }
  32. }
  33. function animate() {
  34. interval_id = setInterval(function() {
  35. if (mode == "picture") {
  36. $(counter).html(timestamp);
  37. //zmiana obrazka
  38. assign_image(0);
  39. }
  40. }, interval/2);
  41.  
  42. }
  43.  
[JAVASCRIPT] pobierz, plaintext

Go to the top of the page
+Quote Post
zegarek84
post
Post #6





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

Ostrzeżenie: (0%)
-----


przede wszystkim to nie jest przykład 'live' (co znaczy, że miałeś podać linka do strony internetowej z działającym całym kodem)...

poza tym kod który podałeś nie trzyma się kupy... rozumiem, iż start jest od animate(), potem zawsze wykonujesz kod assign_image(0) [no warunkowo ale...]...

w funkcji assign_image(x) niby tworzysz tymczasowy obiekt obrazka do pobrania ale nie wiem po co skoro po załadowaniu nigdzie go nie wyświetlasz...[PRZECZYTAJ CAŁOŚĆ - WIEM, CHCESZ GO WYŚWIETLIĆ ;P] poza tym gdy już nie potrzebny jest obiekt Image mógłbyś go usunąć gdyż przechowuje wiele danych - a ponieważ jest on przypisany do zmiennej lokalnej to nie zadziała delete i tej zmiennej lokalnej musisz przypisać NULL - różnie to bywa z czyszczeniem zmiennych lokalnych, a ponieważ obiekt i tak przekazujesz dalej przez referencję to nie zostawiaj niepotrzebnych referencji...

następna sprawa samo sprawdzanie czy obrazek załadowany - po co aż tyle sprawdzeń skoro masz zdarzenia dla tego obiektu .onload i .onerror do których możesz przypisać funkcję... ale mniejsza o to...

to co mnie dalej zastanawia, to przy sprawdzeniu, czy obrazek został załadowany zwiększasz zmienną timestap i ustawiasz loading na zakończony - i patrzmy dalej gdy loading zakończony... podmieniasz atrybut src jakiegoś obrazka w DOM'ie ale!!! z nowym timestapem!!! TO PO CO WCZYTYWAŁEŚ DO BUFORU WCZEŚNIEJSZY OBRAZEK SKORO NAWET Z NIEGO NIE SKORZYSTAŁEŚquestionmark.gif?

następny przebieg dla tego samego obrazka będzie o tyle szybszy, że choć buforujesz to znowu nie potrzebnie gdyż ten obrazek jest już wcześniej wczytywany do przeglądarki do drzewa DOM przez obiekt $('#img_src') - no do następnego przebiegu nie zwiększasz timestap... i dalej się dzieje to co pisałem od początku...


DAJ PRZYKŁAD LIVE TO PRĘDZEJ KTOŚ POMOŻE ;]

Ten post edytował zegarek84 6.09.2011, 17:37:40


--------------------
Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.

Go to the top of the page
+Quote Post
rulespl
post
Post #7





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 29.03.2009

Ostrzeżenie: (0%)
-----


Chyba do końca nie wiedziałem o co chodzi z tym live wink.gif.
Niestety nie jest możliwe pokazanie tego live, gdyż działa to tylko na lokalu.
Spróbowałem rozwiązać trochę inaczej funkcje assign_image :

[JAVASCRIPT] pobierz, plaintext
  1.  
  2. function assign_image(x) {
  3. var image_url = null;
  4. var img_content = null;
  5. var dateNow = null;
  6. switch(x) {
  7. case 0: {
  8. dateNow = new Date();
  9. image_url = image_output[x] + '&timestamp='+timestamp+'&rand='+dateNow.valueOf();
  10. //alert(image_url);
  11. $.ajax({
  12. url: image_url,
  13. cache: false,
  14. success: function(){
  15. img_content = '<img id="img_src" src="' + image_url+ '" >';
  16. $(img_content).bind("load", function () {
  17. $('#img_src').replaceWith(img_content);
  18. });
  19. }
  20. });
  21. break;
  22. }
  23. }
  24. }
  25.  
[JAVASCRIPT] pobierz, plaintext


Zauważyłem, ze nawet jeśli w odpowiedzi ajax nie będzie obrazka z każdym nowym żądaniem rośnie zużycie pamięci przeglądarki.
Czy jest tak, że po uzyskaniu odpowiedzi z serwera obiekt XMLHttpRequest zajmuje pamięć. Czy można usunąć go ręcznie?

Skrypt działa tak, że np co 500 ms pobierany jest nowy obrazek, który zastępuje poprzedni. Czy usunięcie poprzedniego obrazka z drzewa DOM spowoduje usunięcie go z pamięci przeglądarki?

Jakieś pomysły?

Ten post edytował rulespl 7.09.2011, 13:23:14
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 06:43