Adaptive Tile Refresh milik Commander Keen
(fabiensanglard.net)- Adaptive Tile Refresh (ATR) adalah teknik scrolling yang dipakai Commander Keen 1~3 untuk menghindari refresh layar penuh EGA yang lambat, dengan menggambar ulang hanya tile yang berubah alih-alih seluruh layar
- Mode EGA
Dhmenyimpan layar 320x200 16 warna dengan membaginya ke dalam 4 plane (C0~C3), dan jika seluruh layar 32KiB ditulis setiap frame melalui bus ISA, hasilnya hanya sekitar 5fps sehingga sulit mencapai refresh 60Hz - ATR menangani pergeseran vertikal dan horizontal di dalam layar virtual menggunakan register
CRTC_START,OFFSET, danPEL, lalu saat menyentuh tepi melakukan jolt untuk mengembalikan acuan layar dan menimpa hanya tile yang diperlukan ke VRAM - Biaya jolt ditentukan oleh jumlah tile yang harus digambar ulang; pada contoh Commander Keen 1, dari 250 tile hanya 40 tile yang berubah sehingga hanya 16% dari seluruh layar yang digambar ulang, dan desain map dengan banyak tile berulang sangat menentukan performa
- Commander Keen 4~6 beralih dari ATR ke metode yang memanfaatkan wraparound aperture VRAM 64KiB untuk terus melakukan panning sambil menggambar hanya strip tepi yang baru terlihat, tetapi pada sebagian kartu Super VGA muncul masalah kompatibilitas karena bisa masuk ke memori yang belum diinisialisasi
Batas bandwidth yang dihadapi di EGA
- Commander Keen berjalan paling baik di PC dengan EGA (Enhanced Graphic Adapter), dan pemrograman grafis dilakukan melalui register konfigurasi serta jendela memori 64KiB yang dipetakan ke VRAM
- EGA menyimpan data internal dalam 4 plane
C0,C1,C2,C3C0menyimpan bit paling rendah (LSB) dari setiap nilai piksel 4-bitC3menyimpan bit paling tinggi (MSB)- Setiap plane terdiri dari 200 baris, masing-masing 40 byte per baris
- Struktur 4 bank ini dirancang untuk menyediakan bandwidth yang cukup agar bisa mengikuti layar CRT, dan CRTC membaca 4 byte secara paralel
- Mode EGA
Dhyang dipakai Commander Keen menyediakan resolusi 320x200 dan 16 warna- Tidak memakai pendekatan seperti mode
10hyang menyusun ulang tinta dari 64 nilai warna - Di mode
Dh, warna palet tetap bisa diubah dalam 16 warna dasar, dan ini dipakai untuk efek fade in/out sederhana di Commander Keen
- Tidak memakai pendekatan seperti mode
Adaptive Tile Refresh menghindari redraw layar penuh
- Bottleneck utama yang diselesaikan ATR adalah bandwidth
- Menulis nilai 4-bit untuk layar 320x200 piksel, sekitar 32KiB, di setiap frame adalah beban yang terlalu besar bagi bus ISA
- Loop sederhana yang memperbarui seluruh layar setiap kali hanya bertahan di kisaran 5 frame per detik
- EGA juga punya cara untuk menulis ke 4 bank sekaligus, tetapi meski berguna untuk menghapus layar atau mereplikasi kolom seperti di Wolfenstein 3D, itu tidak cocok untuk masalah scrolling di Commander Keen
Scrolling mulus dengan register
- ATR mula-mula membuat layar virtual yang lebih besar dari layar tampilan di dalam VRAM, lalu menggerakkan area tampilan dengan mengubah nilai
CRTC_STARTyang menentukan dari mana CRTC mulai membaca - Scrolling vertikal relatif sederhana
- Dengan menambahkan masing-masing 16 baris di atas dan bawah layar tampilan, setiap plane memakai
40 x 232 = 9,280byte - Saat layar digeser satu baris ke atas,
CRTC_STARTdinaikkan 40 byte - Saat layar digeser satu baris ke bawah,
CRTC_STARTditurunkan 40 byte
- Dengan menambahkan masing-masing 16 baris di atas dan bawah layar tampilan, setiap plane memakai
- Scrolling horizontal memakai kombinasi register
OFFSETdanPEL- Jika
OFFSETdiatur ke 2, padding 16 byte ditambahkan di antara baris sehingga ada ruang 16 piksel di kiri dan kanan layar virtual - Jika
CRTC_STARTdinaikkan 1, karena struktur plane layar akan bergerak dalam satuan 8 piksel sehingga terlalu kasar Horizontal Pel Panning, yaitu registerPEL, dapat melewati hingga 7 bit setelahCRTC_START, sehingga memungkinkan scrolling horizontal per piksel
- Jika
- Pergerakan horizontal nyata dilakukan dengan menyesuaikan
CRTC_STARTmemakai hasil pembagian koordinat dengan 8, lalu mengaturPELdengan sisa koordinat tersebut (% 8)
Jolt dan pembaruan parsial per tile
- Saat mencapai tepi layar virtual, ATR melakukan jolt untuk memusatkan kembali layar virtual
- Jika seluruh layar digambar ulang, proses ini memakan sekitar 200ms dan frame rate turun ke 5fps, jadi jolt bekerja dengan menimpa hanya tile yang berubah alih-alih melakukan redraw penuh
- Level Commander Keen dibuat dari tile 16x16
- Saat artis menggambar tile, sistem build memberi setiap tile sebuah ID unik
- Desainer level menyusun map dengan menempatkan ID tile di editor 2D
- Engine melacak ID tile apa yang ada di layar virtual
- Pada saat jolt, ID tile dari keadaan layar virtual saat ini dibandingkan dengan keadaan target yang sudah dipusatkan kembali
- Tile yang sama dilewati
- Hanya tile yang berbeda yang ditimpa ke VRAM
- Efisiensi jolt berbanding terbalik dengan jumlah tile yang harus digambar ulang, sehingga desainer game harus menyusun tilemap agar banyak tile berulang
- Pada contoh Commander Keen 1, ketika bergerak mulus ke kanan lalu layar virtual habis dan terjadi jolt 16 piksel ke kiri, dari 250 tile hanya 40 tile yang berubah
- Rasio yang digambar ulang hanya 16% dari seluruh layar
- Di atas latar belakang, ada layer sprite
- Engine menyimpan daftar koordinat tile kotor yang tertimpa sprite
- Di setiap frame baru, daftar kotor itu ditelusuri untuk memulihkan tile latar lalu menggambar ulang sprite
Double buffer dan drifting pada trilogi kedua
- Untuk menghindari artefak visual, seluruh sistem diduplikasi menjadi dua framebuffer
- Saat CRTC membaca satu buffer, penulisan bisa dilakukan ke lokasi VRAM lain pada buffer kedua
- Setiap buffer memakai
(320 + 32) * (200 + 32) * 4 / 8 = 40,832byte - Total double buffer menjadi
40,832 * 2 = 81,664byte, melebihi 64KiB pada kartu EGA asli IBM
- Menurut VileR, hanya papan IBM EGA asli yang dibekali 64KiB, sementara sebagian besar klon EGA yang muncul sekitar 1986~1987 sudah memakai 256K, dan saat Commander Keen dirilis hampir tidak ada kartu EGA dengan kapasitas di bawah 256K
- Commander Keen 1~3 menampilkan pola berulang yang dibutuhkan ATR dengan cukup jelas di layar, tetapi ciri yang sama tidak terlalu menonjol pada Commander Keen 4~6
- Trilogi Keen kedua memanfaatkan perilaku wraparound saat
CRTC_STARTmencapai ujung blok 64KiB lalu kembali ke awal blok- Layar terus melakukan panning sambil menggambar hanya baris strip tepi yang baru terlihat
- Karena jolt hilang, kebutuhan untuk membuat bidang berulang dengan warna serupa juga berkurang
- Pendekatan ini lebih merupakan penyempurnaan untuk menghilangkan jolt daripada penambahan fitur baru
- Kedua elemen double buffer drift di ruang VRAM dengan kecepatan yang sama sehingga tidak saling bertumpuk
- Dalam kebanyakan kasus, cara ini bekerja dengan baik
- Pada sebagian kartu Super VGA, muncul masalah
- Pada kartu dengan implementasi non-standar dan memori lebih besar, alih-alih wraparound dari akhir ke awal, sistem bisa masuk ke memori nyata yang belum diinisialisasi
- Daripada menangani tiap kartu non-standar secara terpisah, Carmack memilih solusi yang lebih mudah: saat mencapai ujung layar, ia menerima adanya hitch dan menyalin seluruh layar ke atas
- Teknik drifting ini mungkin membuat pendekatan menyimpan tile dan sprite di VRAM untuk memanfaatkan salinan cepat VRAM-to-VRAM menjadi tidak memungkinkan, tetapi karena jumlah yang perlu digambar tiap frame sangat sedikit, kemungkinan besar hal itu bukan masalah besar
1 komentar
Opini Hacker News
Kelancaran scrolling di Commander Keen 4~6 tidak tertandingi oleh game lain di PC selama bertahun-tahun, bahkan setelah game-game beralih ke grafis 256 warna
Berkat kerja teknis luar biasa John Carmack dan seni palet 16 warna Adrian Carmack, id pada dasarnya membuat game platform PC dengan tampilan terbaik selama suatu periode pada 1990-an
Adrian Carmack bukan kerabat Carmack yang lebih terkenal itu, tetapi menurut saya ia adalah maestro tersembunyi palet 16 warna
Laju peningkatan grafis dan gameplay benar-benar luar biasa
Perubahan dari game pertama: https://en.wikipedia.org/wiki/Commander_Keen_in_Invasion_of_...
Perubahan hingga game terakhir: https://en.wikipedia.org/wiki/Commander_Keen_in_Goodbye,_Gal...
Saya memainkannya sendiri saat masih kecil waktu itu, dan sempat lupa bahwa semuanya terjadi secepat itu
Bukan bermaksud meremehkan Commander Keen, tetapi visual dan mekanika game PoP terasa tak tertandingi menurut standar saat itu
Saat pertama memainkannya sekitar usia 7 tahun, kesannya seperti sihir, dan sampai sekarang masih menjadi game platform favorit saya, jadi memang ada bias
Tentu saja PoP sama sekali tidak punya scrolling, dan bagian itu adalah ilmu hitamnya Commander Keen
“Karena memori lambat, gambar ulang hanya yang berubah” sekarang hampir terasa seperti ide yang sudah jelas
Meski begitu, optimisasi di episode 4~6 tetap menarik. Menarik juga bahwa di episode 1~3 mereka melakukan seluruh pekerjaan karena asumsi bahwa buffer tidak melakukan wrapping, padahal sebenarnya buffer itu wrapping sehingga pekerjaan tersebut menjadi sia-sia
Saya pernah membuat game berbasis tile dengan DirectX 5 di Windows 98, dan pada awalnya mengimplementasikan cara yang mirip dengan yang dijelaskan di tulisan ini
Situasinya sedikit lebih sederhana karena layar tidak melakukan scrolling, tetapi banyak tile bisa saja perlu digambar ulang
Pada akhirnya saya membuang semua kode itu, karena saat memprofil biaya menggambar seluruh layar pada kartu RIVA TnT, waktunya terlalu kecil bahkan untuk diukur
Saya bersyukur melewatkan era EGA dalam pengembangan PC. Kalau berada di masa itu, rasanya saya tidak akan pernah menyelesaikan apa pun
Mengoptimalkan dengan bit shift alih-alih perkalian, menulis kode inti dalam assembly, lalu seiring prosesor berkembang menulis 16 bit atau 32 bit sekaligus
Karena sumber daya yang saya punya sedikit, saya terus belajar dari buku perpustakaan daerah dan floppy disk berisi file txt
Saya terlalu muda dan kurang pengalaman sehingga tidak pernah menyelesaikan apa pun, tetapi saya berhasil membuat scrolling vertikal yang mulus, scrolling horizontal hampir berjalan, dan juga mengimplementasikan double buffering untuk kubus 3D yang berputar. Itu termasuk depth buffering, matematika, sampai menggambar poligon per baris
Lalu DirectX muncul dan titik kontak dengan mesin menghilang; kubus 3D berputar menjadi terlalu mudah sehingga tidak menyenangkan lagi
Bus melebar dari 8 bit menjadi 16/32 bit, kartu grafis mendukung posted writes sehingga CPU tidak perlu terlalu lama menunggu, dan CPU juga makin cepat, sehingga sistem yang cepat bisa menulis layar 640x480x256 dengan lebih dari 300 frame per detik
Dalam kasus ini, mungkin itu adalah buffer memori sistem yang di-cache dan salinan DMA, atau mungkin blitter yang menangani penggambaran. Namun bahkan pada era Windows 98, di antara kartu 3D kelas bawah ada juga yang akses CPU-nya sangat lambat, hanya sedikit lebih baik daripada kartu bus ISA lama
Karena resolusi layar menjadi terlalu tinggi, sekarang ada bagian yang agak berbalik lagi. Walaupun bisa menggambar ulang seluruh layar 4K pada 60 frame per detik, sulit menyebutnya efisien
Game biasanya masih menggambar ulang semuanya, tetapi compositor desktop melakukan cukup banyak optimisasi, misalnya menetapkan layer secara dinamis ke hardware plane untuk mengurangi area yang digambar ulang
Saya bekerja di perusahaan game lain pada periode yang sama, dan secara mandiri menemukan teknik scrolling seperti pendekatan kedua itu
Saya tidak menganggapnya sesuatu yang begitu mencengangkan. Kalau waktu itu sedang memecahkan masalah yang sama, kemungkinan besar orang akan sampai pada kesimpulan serupa
Saya juga membuat driver audio PWM sendiri untuk memutar sampel suara lewat PC speaker, dan sepertinya semua orang lain juga melakukan hal serupa
PC tidak mendapat cukup cinta sebelum kami semua pindah ke konsol. Demo seperti 8088 MPH dari Hornet masih membuat saya bersemangat
Itu memang bukan syarat wajib untuk game yang menyenangkan, tetapi kelancaran yang ditunjukkan Keen, terutama pada hardware kelas rendah seperti di bawah 10MHz, benar-benar membuka mata pada masa itu
Pasti ada tak terhitung penemuan hebat yang tidak dikenal selama ribuan tahun
Saya juga “menemukan” sesuatu yang mirip 10 tahun sebelum LinkedIn muncul, tetapi tidak berhasil mengomersialkannya. Menurut saya sebagian besar penemuan tidak pernah dikenal luas
Karena itu banyak startup dimulai oleh dua orang: satu ahli dan satu pebisnis
Jadi itu tidak salah. Penemuan ini mungkin saja bukan sesuatu yang istimewa, tetapi menjadi istimewa karena gabungan kebaruan, kegunaan, dan komersialisasi yang berhasil
Dalam buku luar biasa Masters of Doom, Keen dijelaskan sebagai game ala Mario, yaitu game side-scrolling
id menawarkan teknologi ini kepada Nintendo sebagai opsi untuk mem-porting Mario ke PC, tetapi Nintendo menolaknya, dan karena itulah Keen lahir
Itu adalah lompatan besar bagi game PC, dan membuka era baru game PC
Namun yang masih belum benar-benar saya pahami adalah, apa yang begitu berbeda antara teknologi NES dan PC sehingga Nintendo bisa menerapkan side-scrolling beberapa tahun lebih awal daripada PC
Dalam mode grafis EGA, Anda bisa menggambar apa pun yang diinginkan—garis, lingkaran, piksel individual, dan sebagainya—dan memang dibuat untuk dipakai seperti itu
Namun scrolling tidak gratis. Memori harus disalin langsung, dan seperti yang ditunjukkan artikel yang ditautkan, jika dipaksakan secara kasar, karena batas bandwidth bus ISA hasilnya hanya sekitar 5 frame per detik
NES dan konsol game 8/16-bit lainnya tidak dibuat untuk menggambar apa pun secara arbitrer. Mereka dibuat untuk merender tile
Anda cukup mendefinisikan kisi tile latar belakang dan memberikan offset scroll. Sprite juga bekerja mirip, tetapi bisa bergerak secara independen. Semua ini tersedia “gratis” pada 60 frame per detik
Kekurangannya adalah tidak mudah merender sesuatu secara arbitrer. Misalnya, untuk mewarnai satu piksel individual di suatu tempat, diperlukan workaround yang cukup parah
Jadi ini bukan masalah yang “ditemukan” Nintendo lebih dulu daripada IBM; IBM membuat sistem grafis serbaguna yang disesuaikan untuk komputer serbaguna dan grafis statis, serta menyediakan kontrol halus atas setiap piksel. Kalau melihat kartu EGA, itu perangkat yang cukup besar dengan banyak silikon
Sebaliknya, Nintendo membuat sistem grafis khusus yang jauh lebih sederhana dan disesuaikan untuk menggeser tile
Ketika Nintendo tidak menerimanya, mereka membuat aset baru yang kemudian menjadi Keen
Video port-nya ada di sini: https://youtu.be/1YWD6Y9FUuw
Untuk sisi NES, https://www.nesdev.org/wiki/PPU tampaknya titik awal yang bagus
Tantangan utamanya bukanlah “menemukan cara melakukan side-scrolling” itu sendiri, melainkan menyesuaikan engine game side-scrolling agar bekerja dengan baik dalam ruang memori dan batasan bandwidth dari sistem yang sama sekali berbeda
Karena game dibuat berbasis sprite dengan layer, cara untuk “mengakselerasi” 2D ini cukup masuk akal
Dalam wawancara John Carmack oleh Lex Fridman, mereka membahas semua inovasi utama di setiap game
Episodenya benar-benar menarik, jadi kalau punya waktu saya sangat merekomendasikannya. Durasinya kira-kira 5 jam
Saya juga merekomendasikan dua wawancaranya yang lain
Todd Howard: https://www.youtube.com/watch?v=H9AAnV59ddE
Guido van Rossum: https://www.youtube.com/watch?v=-DVyjdw4t9I
Saya masih ingat masa ketika saya percaya tahu hampir semua elemen rahasia di Commander Keen Goodbye Galaxy
Teman-teman sekolah sering bertanya kepada saya tentang rahasia level yang mereka mainkan di komputer sekolah sepulang sekolah
Begitu melihat fabiensanglard.net, saya langsung memberi rekomendasi
Kalau ada yang tahu blog game klasik lain yang teknis dan mendalam, saya ingin mereka membagikannya
https://nicole.express/ dan https://sudden-desu.net/ juga termasuk favorit saya
Saya memahami bagaimana scrolling vertikal bekerja jika titik awal framebuffer disesuaikan per scanline, tetapi awalnya tidak jelas bagaimana scrolling horizontal bisa dilakukan tanpa membengkokkan framebuffer secara parah
Setelah berpikir sedikit lagi, saya menyadari ini mirip menggambar gambar di sisi sebuah silinder. Di mana pun tepi kiri gambar digambar, selalu ada cara untuk memutar silinder lalu mengatur register CRTC_START dan PEL agar seluruh gambar terlihat jelas
Bagian yang mengatakan bahwa “ketika mencapai tepi layar, sebagai solusi sederhana mereka menerima sedikit tersendat dan menyalin seluruh layar ke atas” juga menarik
Saya ingat ketika memulai Keen biasanya muncul pesan seperti “VGA compatibility mode enabled”, dan saya selalu penasaran apa maksudnya
Commander Keen benar-benar gim kecil yang menggemaskan
Sepertinya saya harus mencari cara untuk menjalankannya lagi
Tapi sebaiknya bagaimana menjalankan ini? Setelah jadi “orang dewasa”, saya sudah sekitar 20 tahun tidak memakai Windows; bagaimana cara memainkannya di Debian?
Saat itu komputer kira-kira 10 kali lebih mahal daripada konsol, jadi biasanya karena orang dewasa punya pandangan kuat tentang apa yang seharusnya dilakukan anak-anak
Dibandingkan gim-gim NES dan Genesis, gim ini kurang berjiwa. Dulu saya menyukainya, tetapi ketika baru-baru ini mencobanya lagi di DosBox, saya merasa jelas sekali tidak sebanding
Beberapa tahun lalu saya mengimplementasikan metode kedua, tetapi menggambar tepi depan saja pun sangat lambat
Namun, saya menulisnya dalam C, dan tidak pernah benar-benar mempelajari pemrograman assembly dengan baik
https://github.com/geon/kate/blob/master/src/platform/dos/eg...