- Raycaster yang diimplementasikan dengan Bash, sebuah demo pseudo-3D berbasis terminal yang dapat berputar dan bergerak dengan tombol panah, serta keluar dengan
q - Implementasinya pada dasarnya merupakan port dari tutorial raycasting Lode Vandevenne, dengan semua matematika ditangani menggunakan operasi bilangan bulat berskala 64K tanpa floating point
- Keterbatasan terbesar adalah performa Bash; jika menjalankan perintah untuk setiap piksel atau menyimpan status layar sebagai array/string, sulit untuk menampilkannya dalam waktu satu frame
- Untuk tampilan terminal, digunakan Unicode half block serta warna foreground/background 24-bit, yang secara efektif menggandakan resolusi vertikal, tetapi memiliki batasan harus mengetahui warna piksel yang berdekatan
- Dalam roadmap saat ini, fluid movement, decent framerate, parallel rendering, kitty keyboard protocol, prototipe awal sound, dan lainnya sudah selesai; sementara textures, sprites, enemies, particles, multiplayer, dan lainnya belum selesai
Raycaster terminal yang dibuat dengan Bash
- Proyek ini adalah raycaster yang berjalan di Bash, merender tampilan pseudo-3D di dalam terminal
- Kontrolnya menggunakan tombol panah untuk berputar dan bergerak, serta
quntuk keluar - Lebih banyak screenshot dan video tersedia di album Imgur
- Implementasinya pada dasarnya adalah port dari tutorial raycasting Lode Vandevenne
Kendala yang membuat implementasinya sulit
- Masalah terbesar adalah Bash itu lambat
- Penulis menyatakan bahwa bahkan jika hanya perlu menjalankan satu perintah untuk setiap piksel, sulit mendapatkan acceptable frame rate
- Menyimpan status layar sebagai array warna juga bermasalah karena akses ke elemen array acak memakan waktu linear
- Menyimpan status layar sebagai satu string panjang pun, bahkan dengan
LANG=C, akses ke karakter ke-n memakan waktu linear, sehingga hanya membaca untuk dump ke layar bisa memakan waktu lebih lama dari satu frame
- Bash tidak memiliki dukungan floating point maupun akses ke library fungsi matematika
- Semua matematika ditangani dengan bilangan bulat
- Nilai bilangan bulat diperbesar dengan skala 64K untuk perhitungan
- Jika satu karakter di terminal dipakai seperti satu piksel, hasilnya tidak enak dilihat, sehingga digunakan Unicode half block
- Dengan menentukan warna foreground dan background yang berbeda, resolusi vertikal secara efektif digandakan
- Tidak ada cara untuk memperbarui hanya salah satu dari dua warna dalam satu sel
- Tidak ada cara untuk menanyakan warna sel saat ini, dan di Bash query seperti itu pun terlalu lambat
- Karena itu, setiap kali menulis piksel, warna piksel yang berdekatan harus diketahui
Masalah terminal serta input/output
- Memperbarui seluruh terminal sekaligus dengan Bash, bahasa yang lambat, bukanlah hal sederhana
- Sebagian besar terminal tidak dirancang untuk video game, sehingga tidak bisa menguji status tombol yang sedang ditekan
- Biasanya hanya input dari satu tombol yang sedang ditekan yang bisa diperoleh
- Input berulang di-debounce dengan lambat, dan batas input beruntun juga rendah, sehingga bisa terjadi situasi hanya mendapatkan sekitar 5–6 karakter per detik
- Input beberapa tombol non-modifier secara bersamaan juga sulit diperoleh
- Penulis menyatakan bahwa kitty keyboard protocol menyelesaikan masalah ini
- Mengisi terminal dengan warna membutuhkan banyak data
- Pada ukuran font umum penulis, terjadi sekitar 10MB I/O per detik
- Bash tidak menggunakan satu syscall saat mencetak string yang berisi beberapa newline
- Proyek ini tidak mencetak
\n, melainkan memindahkan kursor dengan cara lain
- Proyek ini tidak mencetak
FAQ dan persyaratan menjalankan
- Jika tampilan rusak saat ukuran jendela diubah, terlalu berkedip, atau terlihat buruk di terminal tertentu, penulis meminta agar membuka issue
- Jika CPU menjadi sangat panas atau komputer lama melambat, disarankan menurunkan resolusi atau mengatur variabel lingkungan
FPSke kurang dari 30- Microsoft Defender diketahui sangat menurunkan performa, sehingga disarankan untuk dinonaktifkan
- Penulis menjawab bahwa ini tidak berjalan di Bash sebelum 5.2
- Kodenya bukan Bash murni sepenuhnya
- Saat mulai,
sttydipanggil sekali untuk mematikan echo - Saat keluar,
sttydipanggil sekali untuk menyalakan kembali echo - Setelah keluar, sebagian statistik dikumpulkan dengan tool lain
- Saat mulai,
Status roadmap
- Item yang selesai
-
semi-accurate pseudo 3d
- fluid movement
- decent framerate
- parallel rendering
- 24 bit colours
- kitty keyboard protocol
- framerate-independent speed
- sound, tetapi masih berupa prototipe yang sangat awal
- dynamic wall colours
- dynamic map, saat ini belum diubah oleh event, tetapi secara teknis disebut dinamis
- basic animations effects for walls
- basic on-screen minimap
- Item yang belum selesai
-
mouse support
- textures
- sprites
- objects/enemies
- particles
- better perf
- multiplayer
-
1 komentar
Komentar Hacker News
echosekali untuk setiap piksel, dan caranya sangat cerdasKarena gamenya bukan 3D “sungguhan”, ray tracing hanya perlu dijalankan sekali per kolom, lalu cukup menggambar beberapa baris yang sesuai dengan langit, rumput, dan objek sebenarnya
Caranya adalah mencetak ke terminal string “gambar piksel ini lalu pindah satu sel ke bawah” dengan pengulangan string sebanyak yang diperlukan
Ini memang bukan untuk Bash, tapi saya sempat berpikir untuk membuat mesin rendering voxel di lingkungan lain dengan sumber daya komputasi terbatas, dan sepertinya saya pasti bisa menemukan sesuatu yang berguna di sini
VoxelCanvas.jsjuga mungkin menarik. Itu file JavaScript, dan memakai ide ray casting yang sama: https://github.com/EngineersNeedArt/Mooncraft2000sttymembutuhkan fork. Mungkin proyek berikutnya adalah memanggilioctlyang diperlukan dengan Bash dan rowhammer agar bisa diproses tanpa forkKemampuan matematika saya tidak cukup untuk memahami implementasinya, tetapi melihatnya saja sudah menyenangkan
Saya bisa mengerti bahwa sebagian aplikasi membutuhkan segala macam perilaku unik
vt100, tapi mungkin 90% aplikasi hanya menulis ke standard output dan standard errorSeharusnya kita bisa menampilkan teks ke layar sedikit lebih cepat, lalu memasukkan 10% sisanya ke mode kompatibilitas
Bahkan di terminal selebar 350 kolom, animasi bisa dirender, dan dengan mempertimbangkan batasannya, hasilnya sangat mulus
Lagi pula, premis tulisan ini sendiri adalah bahwa Bash adalah bahasa yang tidak cocok untuk ray casting. Mirip seperti menulis bubble sort dengan CSS
Tidak ada yang menghalangi gagasan “memasukkan 10% sisanya ke mode kompatibilitas”. Cukup periksa apakah string hanya berisi karakter normal dan gunakan fast path
Masalahnya, dalam rendering teks perangkat lunak sebenarnya tidak ada fast path. Kita tetap harus menangani hal-hal seperti ligatur
Itu salah satu alasan saya tidak memakai Bash untuk scripting. Saya juga tidak memakainya secara interaktif
Beberapa distro Linux populer juga menghindari Bash sebagai shell scripting
pstanpa fork dari penulisnya untuk membuat implementasi psDoom yang hampir tanpa forkTerlepas dari candaan, ini benar-benar keren
awkdari 9 tahun lalu juga layak disebut secara terhormat: https://github.com/TheMozg/awk-raycaster/tree/master