Temel olarak, 2D bitmapler nasıl oluşturulur?


9

64-bit sözcük adresli bir bilgisayarımız olduğunu ve bunu, bellek eşlemeli bir ekrana ikili görüntü bitmap (aşağıda olduğu gibi) olarak depolanan 5x7 karakter çıkacak şekilde programlamak istediğimizi varsayalım.

resim açıklamasını buraya girin resim açıklamasını buraya girin

Karakter başına 5 x 7 = 35 pikselimiz olduğu için, tek bir kelimede 35 bit kullanarak bir karakter depolayabiliriz. Kelimenin sol tarafından başlayan en küçük bit ve görüntüdeki her piksel yukarıda gösterildiği gibi n. Bit ile temsil edilirse, yukarıdaki "3" sayısı bellekte şu şekilde saklanır: 01110100010000100110000011000101110, ardından 29 kullanılmayan bit 0 olarak ayarlanmıştır.

Karakterler eski / modern bilgisayarlarda bu şekilde saklanıyor mu? Yoksa piksel başına tek bir bayt / kelime mi kullanıyorlar?

Bu şekilde saklanırlarsa, bu verileri bir görüntüye dönüştürmek için montaj / makine kodundaki rutin (bilgisayarın talimat kümesi mimarisinin bitsel, aritmetik ve veri taşıma işlemleri gibi temel talimatlardan başka bir şey kullanmadan) ne kullanırdı? ekran nasıl görünüyor? Şöyle bir şey olur mu?

  1. Belirli bir kayıt defterinde güncellenecek geçerli piksel için x ve y ekran koordinatını saklayın.
  2. Seçilen iki RGB değerini (bu durumda yeşil için 0,255,0 ve siyah için 0,0,0) diğer iki ayrı kayıt defterinde saklayın.
  3. Oluşturulan görüntünün geçerli satırını ve sütununu takip etmek için iki kayıt daha 5 ve 7 olarak başlatılan sayaçlar gibi davranır.
  4. Sütun kaydının 0 olup olmadığını test edin. Değilse, bitmapin LSB'sinin 1 olarak ayarlanıp ayarlanmadığını test edin, ardından sonuca bağlı olarak ilgili RGB değeri x ve y koordinat kaydına kaydedilir, ardından MOV sonucu ekran çıkış yazmacına.
  5. Satır sayacı kaydını 1 azaltın, 0 olup olmadığını test edin. Öyleyse, 5'e geri ayarlayın ve y koordinatını 1 arttırın ve sütun sayacını 1 azaltın.
  6. Bitmap'i 1 bit sola tutarak kaydı kaydırın.
  7. Talimat 4'e JMP.

Bunu yapmanın daha basit veya daha verimli bir yolu var mı? Tek bir küçük metin karakteri oluşturmak kadar basit bir şey bile çok fazla işlem gerektiriyor ve yaklaşık 200 CPU döngüsü gerektiriyor gibi görünüyor.

Son olarak, görüntüleri sıfırdan görüntülemek için makine düzeyinde kodda iyi kitaplar veya kaynaklar var mı, çünkü bu konu üzerinde parlak olduklarından veya kod yüksek düzeyde bir dilde veya hepsi "hile" olan ve temelde en düşük düzeyde neler olup bittiğini açıklamayan makroları kullanan bir derleyici.


3
Grafik Programlama Kara Kitap kesinlikle klasik okunmaya değer olduğunu.
Oldschool

Evet, kitabı Michael Abrash'in ikincisiyim. BÜYÜK bir okuma. Bu kitapta yazılanlara çok daha fazla hile var ama arkasındaki felsefe önemli (bu güne kadar!)
Romain Piquois

Yanıtlar:


7

Makinenizin grafik kartının metin ve grafik modlarını ayırt etmeniz gerekir.

Eski günlerde çoğunlukla metin modu destekleniyordu. Bu modda kart, karakterlerin bitmap tanımını saklamaya ve bunları geçerli imleç konumunda görüntülemeye özen gösterdi. Tek yapmanız gereken, karakterin ASCII kodunu (karakter başına bir bayt) küçük bir metin arabelleğinde sağlamaktı.

Günümüzde, piksele erişilebilen ve desteklenen bazı formatlarda ("en yüksek" modda, piksel başına 3 bayt (RGB)) renk bilgisi yazdığınız yüksek çözünürlüklü tarama tamponu sağlanmıştır.

Başlangıçta, farklı boyutlarda basit (paketlenmiş) ikili bitmapler kullanıldı ve olası sürücü çevirisi ile aygıt sürücüsüne bir istek yoluyla tarama belleğine " karıştırıldı ".

Günümüzde, karakterler çoğunlukla ana hatların çözünürlükten bağımsız bir açıklaması olan vektör çizimleri olarak tanımlanır ve pürüzsüz sonuçlar için kenar yumuşatma içeren karmaşık bir oluşturma işleminden geçmeleri gerekir .

Oluşturulan çıktı, yine blitting ile hızlı görüntüleme için önbelleğe alınabilir.

Genel süreç karmaşıktır, donanım hızlandırılabilir ve işletim sistemi (GUI yönetimi) tarafından diğer grafik ilkel çizim işlemleri ile birlikte şeffaf bir şekilde ele alınır.


1

Kısa cevap EVET, biçiminize ihtiyaç duyuyorsa çok fazla bit manipülasyonu yapmaktan kaçınamazsınız.

Bir bitmap çizmek temel olarak bir pikseli bir kaynaktan hedefe kopyalamak anlamına gelir ve bunu yapmak için gerekenleri yapmanız gerekir. (Alıntı Kaptan Açık)

Daha uzun bir yanıt, bir yazılım rasterleştirici yazarsanız, cpu zamanından tasarruf etmek için bazı algoritma ve hile yapabilmenizdir (kaynağın piksel formatına aynı şekilde sahip olmak için hangi kısmı çizmeniz gerektiğini (şeffaflık optimizasyonu) hedef olarak (doğrudan veya önbellek biçiminde), optimal olarak kopyasını vb. gerçekleştirin ... Temel olarak rasterleştiricinizin çizim döngüsünü düşünün ve CPU zamanından tasarruf etmek için bunları nasıl yeniden yapılandırabileceğinizi görün. (ör. çalışma zamanında üretebilirsiniz şeffaf bir alanı nasıl atlayacağınızı söylemek için sadece A harfini yazdırmak veya kaynak bitmap bilgilerinize meta sahip olmak için bir araya getirici kod parçası ..) Her kullanım durumu CPU talimat seti, tampon formatı, render ilkel (dönen? germe bitmapler? ne tür filtreleme? vb ...), CPU kayıt ve önbellek vb algoritması ...

Yani evet yine de, garip kodlama ve küçük bellek norm olduğu eski günlerde tek piksel yazmak için çok fazla CPU döngüsü. :-) Ama 8 MHZ CPU'lu 16/32 bit makinelerin böyle şeyler yapmasını yasaklamadı: https://www.youtube.com/watch?v=GWwPJU6pp30 (Ve CPU'nun büyük bir kısmı da kullanıldı müzik için)

HW oluşturma durumunda, HW kaynak formattan hedef formata dönüşüm gerçekleştirecek ve SW rasterizer için kullanılabilir hilelerin çoğunu kullanmayacak olsa da, HW'deki genel uygulaması büyük olasılıkla SW uygulamasının çoğunu yenecektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.