2010-01-11 15 views
7

Bir HTML5 tuval öğesinin içeriğinin dikey olarak kaydırılmasını uygulamak istiyorum. Tüm içeriği tekrar oluşturmak istemiyorum. Bunun yerine tüm içeriği aşağı/yukarı taşımak ve sadece görüntüye kaydırılan alanı oluşturmak istiyorum.HTML5 tuval öğesinin içindeki dikdörtgen (piksel) bölgeyi taşımanın en hızlı yolu nedir?

getImageData ve putImageData işlevlerini denedim, ancak testlerimde neredeyse tüm sahneyi yeniden boyamak kadar yavaşlar.

// scroll 20px down 
var data = ctx.getImageData(0, 0, width, height-20); 
ctx.putImageData(0, 20); 

Tuval öğesinin içinde dikdörtgen piksel bölgelerini kopyalamanın en hızlı yolu nedir?

cevap

12

bu deneyin:

ctx.drawImage(ctx.canvas, 0, 0, width, height-20, 0, 20, width, height-20); 

drawImage ya bir HTMLImageElement, bir HTMLCanvasElement veya ilk argüman için bir HTMLVideoElement alabilir.

7

mutlak hız, ben kullanırım, fazlasıyla büyük <canvas> içinde <div> ile overflow:hidden sonra <div><canvas> kaydırmak için düzenli DOM yöntemleri kullanmak ayarlayın.

Elbette bu hafıza kullanımını hız lehine kurban eder.

+0

İyi bir fikir ama ne yazık ki tam boyutu önceden bilmiyorum ve kaydırma alanı potansiyel olarak binlerce piksel yüksekliğindedir, bu yüzden bunun benim için çalışacağını düşünmüyorum. –

+0

Keşke başvurumda kaydırma yapmadan önce bu yaklaşımı biliyor olsaydım. Büyük bir gizli Canvas ve küçük bir viewport tuvaliyle çift tamponlamayı kullanıyorum. Sonra yeni görünen kısmı gizliden görüntü alanına kopyalarım. Çalışır, ama muhtemelen daha hızlı olabilirdi. Ve eğer görüntü binlerce piksel yüksekse, çözümüm işe yaramazdı. –

+0

Ancak aşağıya doğru kaydırma yapabilmek için bir beklenti yoksa, son ekrana yeni bir "ekstra büyük" tuval üzerine yeniden boyayabilirsiniz. Ve herhangi bir zamanınız varsa (ileti akışında duraklama gibi), daha sonra hiç kimse fark etmeden yeniden çizebilir ve kırpabilirsiniz. Eski teknik gecikmeyi ortadan kaldırmaz, ancak kesinlikle daha az gerçekleşmesini sınırlar. –

İlgili konular