Pada dasarnya, bagaimana cara menghasilkan bitmap 2D?

9

Misalkan kita memiliki komputer 64-bit word-addressable dan kami ingin memprogramnya untuk menghasilkan karakter 5x7 yang disimpan sebagai bitmap gambar biner (seperti yang di bawah) ke tampilan yang dipetakan di memori.

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Karena kita memiliki 5 x 7 = 35 piksel per karakter, kita dapat menyimpan karakter menggunakan 35 bit dalam satu kata. Dengan bit paling signifikan yang dimulai di sisi kiri kata dan dengan setiap piksel dalam gambar diwakili oleh bit ke- n seperti yang ditunjukkan di atas, angka "3" di atas akan disimpan dalam memori sebagai: 01110100010000100110000011000101110, diikuti oleh 29 yang tidak digunakan bit diatur ke 0.

Apakah ini bagaimana karakter disimpan / disimpan di komputer lama / modern? Atau apakah mereka menggunakan byte / kata tunggal per piksel saja?

Jika mereka disimpan dengan cara ini, apa yang akan menjadi rutin dalam kode perakitan / mesin (menggunakan tidak lebih dari instruksi dasar seperti bitwise, aritmatika dan operasi transportasi data dari Arsitektur Set Instruksi komputer) yang digunakan untuk mengubah data ini menjadi gambar pada tampilan seperti? Apakah akan seperti:

  1. Simpan koordinat tampilan x dan y agar piksel saat ini diperbarui dalam register tertentu.
  2. Simpan dua nilai RGB yang dipilih (dalam hal ini 0,255,0 untuk hijau dan 0,0,0 untuk hitam) di dua register terpisah lainnya.
  3. Minta dua register lebih lanjut berfungsi sebagai penghitung yang diinisialisasi ke 5 dan 7 untuk melacak baris dan kolom saat ini dari gambar yang sedang dirender.
  4. Tes jika register kolom bukan 0. Jika tidak, uji apakah LSB bitmap diatur ke 1, lalu DAN masing-masing register nilai RGB dengan register koordinat x dan y tergantung pada hasilnya, maka MOV yang menghasilkan ke register output display.
  5. Kurangi register penghitung baris oleh 1, uji untuk melihat apakah itu 0. Jika itu, kemudian atur kembali ke 5 dan tambah koordinat y dengan 1 dan kurangi penghitung kolom dengan 1.
  6. Geser register yang memegang bitmap 1 bit ke kiri.
  7. JMP untuk instruksi 4.

Apakah ada cara yang lebih sederhana atau lebih efisien untuk melakukan ini? Tampaknya bahkan sesuatu yang sederhana seperti rendering satu karakter teks kecil membutuhkan cukup banyak operasi dan akan memakan waktu sekitar 200 siklus CPU.

Akhirnya, apakah ada buku atau sumber daya yang bagus tentang kode tingkat mesin untuk menampilkan gambar dari awal, karena saya belum dapat menemukannya karena mereka mengabaikan topik khusus ini atau kode tersebut ditulis dalam bahasa tingkat tinggi atau assembler menggunakan makro, yang semuanya "curang" dan tidak menjelaskan apa yang secara fundamental terjadi di tingkat terendah.

pengguna1735
sumber
3
The Graphics Pemrograman Black Book ini tentunya layak dibaca klasik. Banyak sihir hitam oldschool di dalamnya;)
glampert
Ya, saya buku kedua oleh Michael Abrash. Ini adalah membaca HEBAT. Ada lebih banyak trik di lengan untuk apa yang tertulis dalam buku ini tetapi filosofi di balik itu penting (bahkan sampai hari ini!)
Romain Piquois

Jawaban:

7

Anda harus membedakan mode teks dan grafik dari papan grafis mesin Anda.

Di masa lalu, sebagian besar mode teks didukung. Dalam mode ini papan mengurus menyimpan definisi bitmap dari karakter dan menampilkannya pada posisi kursor saat ini. Yang harus Anda lakukan adalah memberikan kode ASCII karakter (satu byte per karakter) dalam buffer teks kecil.

Saat ini, disediakan buffer raster resolusi tinggi, yang dapat diakses piksel dan Anda dapat menulis informasi warna dalam beberapa format yang didukung (dalam mode "tertinggi", 3 byte (RGB) per piksel, untuk megapiksel atau lebih).

Awalnya, bitmap biner (dikemas) sederhana dengan berbagai ukuran digunakan dan " dicoreng " ke memori raster melalui permintaan ke driver perangkat, dengan kemungkinan terjemahan format.

Saat ini, karakter sebagian besar didefinisikan sebagai gambar vektor , yang merupakan deskripsi bebas resolusi dari garis besar, dan perlu menjalani proses rendering kompleks yang mencakup antialiasing untuk hasil yang halus.

Output yang diberikan dapat di-cache untuk tampilan cepat, lagi dengan blitting.

Keseluruhan proses ini kompleks, dapat dipercepat perangkat keras, dan ditangani oleh sistem operasi (manajemen GUI) secara transparan, bersama dengan operasi menggambar primitif grafis lainnya.

Yves Daoust
sumber
1

Jawaban singkatnya adalah YA, Anda tidak dapat menghindari banyak manipulasi bit jika format Anda membutuhkannya.

Menggambar bitmap pada dasarnya berarti menyalin piksel dari sumber ke tujuan dan Anda harus melakukan apa yang diperlukan untuk melakukannya. (Mengutip Kapten Jelas)

Jawaban yang lebih panjang adalah bahwa jika Anda menulis rasterizer perangkat lunak, Anda dapat memiliki beberapa algoritme dan trik untuk menghemat waktu cpu Anda (dengan mengetahui bagian mana yang TIDAK PERLU DILAKUKAN (pengoptimalan transparansi), dengan memiliki format piksel sumber yang sama sebagai tujuan (secara langsung atau dalam bentuk cache), secara optimal melakukan memcopy, dll ... Pada dasarnya pertimbangkan loop gambar rasterizer Anda dan lihat bagaimana Anda dapat merestrukturisasi mereka untuk menghemat waktu CPU. (mis: Anda dapat menghasilkan pada saat runtime a sepotong kode assembler hanya khusus untuk mencetak huruf A atau memiliki meta ke info bitmap sumber Anda untuk memberi tahu Anda cara melewati area transparan, dll.) Setiap kasus penggunaan mungkin memiliki solusi yang berbeda berdasarkan pada set instruksi CPU, format buffer, algoritma rendering primitif Anda (rotating? stretching bitmap? seperti apa filtering? dll ...), register CPU dan cache dll ...

Jadi ya, itu MENGAMBIL banyak siklus CPU untuk menulis satu piksel di masa lalu ketika penyandian aneh & memori kecil adalah norma. :-) Tapi itu tidak melarang mesin 16/32 bit dengan 8 MHZ CPU untuk melakukan hal-hal seperti itu: https://www.youtube.com/watch?v=GWwPJU6pp30 (Dan sebagian besar CPU digunakan juga untuk musik)

Dalam hal rendering HW, HW akan melakukan konversi dari format sumber ke format tujuan dan sementara itu tidak akan menggunakan banyak trik yang tersedia untuk SW rasterizer, implementasi generiknya di HW kemungkinan besar akan mengalahkan sebagian besar implementasi SW.

Romain Piquois
sumber