Tekrar merhaba Retrojen ailesi. Bu ne biçim başlık demeyin.
Retrojen’e Alcofribas’ın ikinci davetiyle, ikinci kez üye olmuş bulunmaktayım (sistem ilk üyeliğimi etkinsizlikten silmiş)
Madem bir fırsat daha verildi, bu defa iyi kullanayım ve şöyle etkili bir giriş yapayım dedim…
Ahem...
Bir süre önce YouTube’daki Bisqwit kanalında “bu iş bu kadar kolay mıymış?” dedirten şu videoyu izlemiştim.
https://www.youtube.com/watch?v=HQYsFshbkYw&t=188sArkadaş
prototyping için Basic kullanıyordu. Ben de acaba bu kodu
AMOS’a port etsem Amiga’da nasıl çalışır diye düşündüm ve satır satır aktarmaya başladım. Tabi ufak değişiklikler de yaptım. Bisqwit videosunun
2:51’nci saniyesinde
VectorCrossProduct adlı bir formül kullandığını, bunu Vikipedi’den öğrendiğini ve tam olarak nasıl çalıştığını kendisinin de anlamadığını
“karaBüyü gibi bir şey” diyerek belirtiyor. Formüle bakınca açıkçası ben de pek bir şey anlamadım, ancak bu formülle neyin amaçlandığını (sanırım) anladım ve aslında bir sürü çarpma ve bölme işlemine neden olan bu formülün aslında gerekli olmayabileceğini düşünerek, sadece tek bir çarpma ve bölmeden oluşan çok daha basit bir trigonometri formülüyle aynı işi hallettim. Bir de
Inkey$ yerine çok daha hızlı çalışan
Scancode kullandım.
Sonra basit bir harita oluşturup denemelere başladım. Baktım oldukça hızlı çalışıyor. Acaba buna texture mapping eklesem performans nasıl olur diye düşünmeye başladım. Daha önce
texture mapping ile ilgili hiç araştırma yapmamıştım. Ama kafamda nasıl yapıldığına dair tahminler vardı. O tahminlerimi bir değerlendireyim bakayım ne performans alacağım dedim. Bir sürü deneme yanılmadan sonra o da oldu. Tabi performans pek düşük. Standart A1200’de saniyede 0.5 kare ancak çizebiliyordu.
060 A1200’de de saniyede 5 kare falan çizebiliyor sanırım. (tabi timer.device’ı açıp benchmark kodu yazmaya üşendim, göz kararı söylüyorum bunu
)…
Sonra acaba bu kodu C’ye aktarsam ne kadar performans artışı olur diye düşünmeye başladım. Kullandığım komutlara göre AMOS her bir piksel için önce
p2c sonra
c2p çevrimi yapıyor olmalıydı. C’de bitleri
(texture bitMap’inden, ekran bitMap’ine) doğrudan kopyalayarak bu çevrimleri aşabilirim ve hızlanır diye düşündüm. Hem C'ye geçince döngüler falan da daha hızlı çalışırdı herhalde. Bu sıralar C/C++ dillerinde kendimi geliştirmeye çalıştığım için güzel de bir antrenman olacaktı benim için.
Tabi bu bir sürü destek kodu yazmayı gerektirdi. AMOS’ta tek satır ile halledilebilen,
DoubleBuffered ekran açmak ve bir
ILBM brush dosyasını yüklemek için 600 küsur satır ilave kod yazmak gerekti.
Sonra dedim belki çok hızlı çalışırsa oyun falan yaparım bundan, iyisi mi harita koordinatlarını bir metin dosyasından
parse ederek yükleyeyim dedim. 700 küsur satır da o tuttu iyi mi?
Yaptığım envai çeşit mantık ve söz dizimi hatasını gidermekle geçen bir hafta ardından sonunda çalıştırdım. Saniyede 10 kareye falan çıktık galiba.
Sonra bildiğim optimizasyonları uyguladım. Gereken fonksiyonları inline etmek, matematik işlemlerinde sadeleştirmeler, dinamik değişkenlerin
DCache’de hit olması için
MemoryPool kullanmak vs, vs… Derken saniyede 20 kareye falan çıkmış olabiliriz. Tabi bu 60Mhz 060 bir makinede, 4 renkli 100x100 bir ekranda, zemin ve tavan texture’ları olmadan.
https://www.youtube.com/watch?v=-jg18aASQFoBenzer bir grafik motoru kullanan Gloom oyunu bu makinede, 64 renkli, tam ekranda (320x256), tavan ve zemin döşemeleri dahil 30 kare saniye verebiliyor.
Şöyle üstün körü baktığım birkaç makalede okuduğum kadarıyla, texture mapping için bazı aproksimasyonlar varmış. Düz Amiga’larda dişe dokunur kare saniyelere ulaşmak için sanırım onları öğrenmem ve uygulamam gerekiyor. Ha tabi geliştirilmiş Amiga’lar daki FPU’dan yararlanır hale getirmek de lazım. Tabi bunlar uzun, zorlu ve pek çok şey öğrenmemi gerektiren işler. Bakalım zamanla nereye varır bu macera?
Alcofribas'a teşekkürler ve her birinize tekrar selamlar arkadaşlar. Fikir ve yorumlarınızı bekliyorum.
Not: Kaynak kod paylaşmadım. Şimdi konunun gerçek uzmanı NightLord falan burada, görürse falan rezil olmayayım.
Şaka şaka… isteyen olursa paylaşırım ama önce biraz derleyip toparlasam iyi olur.