2 poin oleh GN⁺ 2024-12-22 | 1 komentar | Bagikan ke WhatsApp
  • 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 q untuk 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

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 FPS ke 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, stty dipanggil sekali untuk mematikan echo
    • Saat keluar, stty dipanggil sekali untuk menyalakan kembali echo
    • Setelah keluar, sebagian statistik dikumpulkan dengan tool lain

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

 
GN⁺ 2024-12-22
Komentar Hacker News
  • Ini benar-benar bagus. Saya penasaran bagaimana ia menggambar tanpa melakukan echo sekali untuk setiap piksel, dan caranya sangat cerdas
    Karena 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
  • Kalau Anda penasaran apakah ada ray caster yang ditulis dengan MS Batch, ini juga ada: https://github.com/nTh0rn/batch-raycaster
  • Sayang sekali stty membutuhkan fork. Mungkin proyek berikutnya adalah memanggil ioctl yang diperlukan dengan Bash dan rowhammer agar bisa diproses tanpa fork
  • Saya tidak menyangka hal seperti ini bisa dilakukan dengan Bash. Pernah juga merasa cukup mahir memakai Bash di level yang lumayan tinggi, tapi ini benar-benar mengejutkan
    Kemampuan matematika saya tidak cukup untuk memahami implementasinya, tetapi melihatnya saja sudah menyenangkan
  • Skrip Bash saya menghabiskan 300 baris hanya untuk berbagai macam parsing opsi command-line, padahal sebenarnya bisa saja menampilkan game seperti ini sebagai gantinya :-P
  • Saya masih terus tidak paham kenapa kita masih terikat pada shell yang terasa luar biasa lambat seperti ini. Rasanya seperti kegilaan murni
    Saya bisa mengerti bahwa sebagian aplikasi membutuhkan segala macam perilaku unik vt100, tapi mungkin 90% aplikasi hanya menulis ke standard output dan standard error
    Seharusnya kita bisa menampilkan teks ke layar sedikit lebih cepat, lalu memasukkan 10% sisanya ke mode kompatibilitas
    • Shell memang lambat, khususnya Bash, tapi saya kurang paham bagaimana bagian setelah itu tersambung. Shell sama sekali tidak terlibat dalam interpretasi terminal escape sequence, dan terminal modern cukup cepat
      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
  • “bash itu lambat.”
    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
  • Akan bagus kalau ini digabungkan dengan implementasi ps tanpa fork dari penulisnya untuk membuat implementasi psDoom yang hampir tanpa fork
    Terlepas dari candaan, ini benar-benar keren
  • Tentu saja ray caster awk dari 9 tahun lalu juga layak disebut secara terhormat: https://github.com/TheMozg/awk-raycaster/tree/master