Zig ile yazılmış bir Game Boy Advance oyunu
(jonot.me)Neden Zig ile Game Boy Advance oyunu yazıldı?
-
Game Boy Advance'in çekiciliği
Game Boy Advance modern bir CPU'ya (32 bit ARM, çok sayıda register) sahip olsa da eski tarz karo tabanlı bir renderer kullanır. Bu, NES'in 80'lerde kullandığı yönteme benzer. Nintendo'nun karo tabanlı son sistemlerinden biri olarak afin dönüşüm, saydamlık, sprite efektleri gibi çeşitli özellikler sunar. -
Neden Zig dili seçildi?
Başlangıçta Game Boy Advance projesi C++ ile başlatılmış olsa da ilk tam oyun Zig ile yazıldı. Zig hâlâ beta sürümünde olmasına ve Game Boy Advance'in çıkışından 15 yıl sonra ortaya çıkmış bir dil olmasına rağmen, gömülü programlama için uygun özellikler sunuyor.
Toolchain
-
Linux ve devKitPro
Linux kullanırken paket yönetimiyle ilgili zorluklar yaşandı ve Nintendo DS için 3D sahneler oluştururken devKitPro kullanmak gerekti. Bu araç; GCC toolchain'i, kütüphaneler ve geliştirme araçlarını içeriyor. ArchLinux paket yöneticisi üzerinden kurulmasının yarattığı ek uğraş da var. -
Zig'in avantajları
Zig, cross-compilation işini kolaylaştırır ve karmaşık bir paket yöneticisi kurmayı gerektirmez. Zig'in build sistemi,build.zigdosyasındakibuildfonksiyonunu çalıştırarak derlemeyi yürütür. Bu da build sürecini sadeleştirir ve hataları azaltır.
Packed Structs
- Packed Structs'un önemi
Game Boy Advance, üst düzey API çağrıları olmadan register'lar üzerinden donanımı kontrol eder. Zig'in packed struct özelliği, bellek yerleşimini optimize ederek donanım kontrolünü kolaylaştırır. Bu, Game Boy Advance programlaması için son derece faydalı bir özelliktir.
Comptime
- Compile time kod çalıştırma
Zig, kodu compile time aşamasında çalıştırabilme özelliği sunar. Bu sayede veriler runtime'da sıkıştırılmak yerine compile time sırasında sıkıştırılabilir. Zig'in bu özelliği, verilerin kolayca sıkıştırılmasını sağlar.
Standart kütüphane
- Zig'in esnek standart kütüphanesi
Zig'in standart kütüphanesi generics desteği sunar ve bellek ayırma fonksiyonları, parametre olarak bir allocator alabilir. Bu da özel bellek ayırma yöntemlerinin kullanılmasına imkân tanır. Zig'in standart kütüphanesi, donanım kısıtlarının olduğu ortamlarda da esnek biçimde kullanılabilir.
Sorunlar
-
Inline assembly
Zig inline assembly'yi destekler, ancak yalnızca tek bir çıktı mümkündür. Bu, GBA'nin BIOS fonksiyonlarında birden fazla değerin çıktı olarak alınması gerektiğinde sorun yaratır. -
Thumb kodu / ARM kodu
Game Boy Advance'in CPU'su ARM modu ve Thumb modunu destekler. Zig içinde ARM ve Thumb modları açıkça belirtilemez. -
Tuhaf bellek
Game Boy Advance'in video belleğine 8 bit birimlerle yazılamaz; bu da grafiklerin bozulmasına yol açar. Zig, bellek kopyalama sırasındamemcpykullanarak optimizasyon yapar, ancak bu durum GBA'nin "tuhaf belleği" ile çakışabilir.
1 yorum
Hacker News yorumları
volatilekullanımı da sorunu çözmüyorsa, derleyiciye hata bildirimi yapılması öneriliyormemcpyile değiştiren bir optimizasyon yapabiliyor. Bunun yalnızca kullanıcı alanında gerçekleşeceği düşünülmüştü ve-nostdlibseçeneğinin bunu otomatik olarak ele alması bekleniyordu