2011-09-02 16 views
7

Sprite'ı daha sonra görüntülenecek bir bitmap'e karıştıran bir zorunlu oluşturma motoru düşünün. Bu, söz konusu bitmap içindeki tek tek pikselleri verimli bir şekilde dönüştürme yeteneğine büyük ölçüde dayanır. Böyle bir şeyi yan etkileri olmayan bir dilden nasıl yaparım? Sanırım tamamen farklı bir veri yapısı mı deniyor?Haskell'de piksel tabanlı görüntülemeyi nasıl hayal etmeliyim?

cevap

5

Sen bir algoritma içine değişken durumunu kullanan herhangi bir algoritma dönüştürebilirsiniz o "dizeleri" onunla birlikte devlet. Haskell bunu yapmanın bir yolunu sağlar, böylelikle devlet Monad'la zorunlu programlama gibi hissettirir.

rağmen, temel blit operasyon daha işlevsel bir tarzda yapılabilir geliyor bana. Temel olarak piksel işlemiyle piksel üzerinden yeni bir bitmap oluşturmak için iki bitmap'i birleştiriyorsunuz. Bu bana çok işlevsel geliyor. normalde saf fonksiyonel bir tarzda çok güzel mimarileri oluşturabilir biraz hız vermek isteyen varsa

Yüksek kaliteli zorunlu kod genellikle daha hızlı iyi fonksiyonel kod daha olmakla

4

Haskell yan etkileri vardır ve Uygun olduğunda onları kullanmalıdır. İçsel döngünüzde yer alan yüksek hızlı bir harman rutini (ve dolayısıyla performans açısından kritiktir) kesinlikle mutasyonun uygun olduğu bir yer, bu yüzden kullanın! ST (U) Array veya IO (U) Dizisi kullanılarak, Haskell

  • Rulo Kendi: Sen birkaç seçenek var. Tavsiye edilmez. senin C kendi ve FFI ile diyoruz
  • Rulo. Tavsiye edilmez.
  • Kullanım zaten böyle bir ameliyat sunar ve bu tür Gtk veya OpenGL gibi yüksek performans, iyi bir arayüz harcanmasını programcı yüzlerce saat vardır birçok grafik araci biri. Şiddetle tavsiye edilir.

tadını çıkarın!

blit area a b = \(x,y) -> if (x,y) `isInsideOf` area then a (x,y) else b (x,y) 

durumunda elde edilebilecek bir resimden bir alan blitting bu gösterimi ile

Image :: (Int,Int) -> Color 

:

1

bir görüntüyü temsil eden bir doğal fonksiyonel bir şekilde indeks fonksiyonunu kullanarak bir için ya da başka bir dönüşüm gerekli olan, doğrudan koordinatlara uygulanabilir:

translate (dx,dy) image = \(x,y) -> b (x+dx,y+dy) 

Bu sunum size görüntü noktaları ile çalışmanın doğal bir yolunu sunar. ,

quadraticInterpolation :: ((Int,Int) -> Color) -> ((Double,Double) -> Color) 

performans bazı durumlarda acı olabilir: Sen, örneğin, kolayca dikdörtgen olmayan alanlarda çalışmak ve bunun yerine her zamanki görüntü ölçekleme algoritmaları parçası olma ayrı fonksiyonu olarak görüntü interpolasyon yapmak gibi hileler yapabilirsiniz Birden fazla görüntüyü bir araya getirdiğinizde ve sonuçta hesaplamalar yaptığınızda. Bu, her bir ardışık hesaplama için her bir piksel için bir test zinciri ile sonuçlanır. Ancak, hatırat uygulayarak, işlevsel gösterimi geçici olarak bir diziye dönüştürebilir ve bunu dizin işlevine dönüştürebiliriz, böylece ardışık işlemler için performans isabetini ortadan kaldırırız.

Not, belleğe alma işleminde paralelliğin tanıtımı için de kullanılabilir.