2013-06-08 49 views
6

SVG tabanlı bir görselleştirme yapıyorum (kısmen) hızlı bir şekilde art arda birçok görüntüyü göstermeye dayanıyor. Görüntüler ağdan yeterince hızlı alınamaz, bu yüzden önceden yüklenmiş olmaları gerekir.SVG görüntü etiketlerinin ön yüklemesinin en iyi yolu?

Anlayışım, SVG'nin en azından büyük tarayıcılarda image etiketini düzgün şekilde önbelleğe almamasıdır. Bu yüzden JavaScript ön yükleme kütüphaneleri ve teknikleri (örn. this SO question) çalışmayacaktır. (Ben katmanlı HTML img etiketlerini kullanarak çare olabilir, ama çünkü benim uygulamanın özelliklerini, ben mümkün olduğunca saf SVG sopa istiyorum) İki seçenek görmek

: Kodlama

  • PNG resim verisi base64 olarak, bellekte dizge olarak saklamak ve data:image/png;base64 kullanarak image etiketlerini yinelemek üzere dizeleri kullanarak dizgilerini kullanarak.
  • Birçok SVG grubunu üst üste yerleştirmek, ancak tümü bir set olmak üzere display: none veya visibility: hidden ve uygun grubun iteratif olarak gösterilmesini engeller. Ancak, tüm görüntülerin ön yüklemeyi bitirdiğini programlı olarak algılamanın mümkün olmayacağına inanıyorum.

Görüntü verisini önceden yüklemenin en iyi yolu nedir? Belki daha kolay bir seçeneği kaçırdım.

+0

Görüş ortalamanız * hepsi olmalı * SVG? Değilse, görüntüleri HTML olarak önceden yükleyebilir, ardından bunları görselin üzerine yerleştirebilirsiniz ... Gerektiğinde tam olarak entegre edilmeleri gerekiyorsa çalışmaz, örn. klip yollarını uygulamak. – nrabinowitz

+0

Evet, sorularımda da belirttiğim gibi, hepsi SVG olsaydı çok isterdim. (aksi takdirde, görüntü katmanım aralarında katmanlanacak şekilde iki SVG katmanında vizimi bölmemi gerektirecektir) –

cevap

1

Bu svg ile image etiketlerini çalışacak olmadığını bilmek web tarayıcıları altında yatan mekaniği ile yeterince aşina değilim ama başarıyı yeni Image ile görüntüleri önbelleğe() vardı:

//download low quality images 
    var imageArray = [] 
    for (var i = 0; i < 600; i++){ 
     imageArray[i] = new Image(); 
     imageArray[i].src = moviePath + (i + 1) + '.jpg.t'; 
     imageArray[i].onload = function(){ 
      var i = this.src.split(movieName + '/')[1].split(".")[0]; 
      d3.select("#bar" + i).style("stroke", 'rgb(' + colors[i].rgb + ')'); 
     } 
    } 

bir göstermek için görüntü, sadece görüntülenen resmin src'sini zaten yüklenmiş olan bir tarayıcıya ayarlıyorum ve tarayıcı önbelleğinden yükler.

source'da daha sonra kullanılan başka küçük bir numara daha vardır - önce düşük kaliteli bir görüntü gösterin ve yalnızca başka bir resim seçilmeden kısa bir zaman aşımı geçtikten sonra yüksek kaliteli bir yükleme yapmaya başlar. Ardından, yüksek kaliteli görüntü yüklendikten sonra, yalnızca aynı görüntünün seçili olduğunu gösterin.

Bunlar en iyi uygulamalar veya herhangi bir şey olup olmadığı konusunda bir fikir yok, ancak it worked reasonably well.

+0

Sözünü ettiğim kesin yaklaşımın, bu soruda işe yaramayacağına inanıyorum. Anladığım kadarıyla, büyük tarayıcılar * SVG 'görüntülerini önbellekten almazlar (SVG'de bitmap desteği biraz sonradan düşünülür). Buna itiraz edemezseniz, bu yaklaşımın SVG için işe yaramadığını düşünmüyorum. –

+1

UA'lar (ve burada sadece Firefox hakkında ayrıntılı bilgiye sahibim), (XML) verilerini önbelleğe alır ancak SVG görüntülerinin bitmap gösterimini değil. Buffered render özniteliği ayarlanmışsa, Opera'nın bitmap'i önbelleğe alacağını düşünüyorum. Yukarıdaki cevap genel olarak çalışmalıdır. –

İlgili konular