merhaba arkadaşlar ilgi için teşekkürler.
wizofwor, sorun için detaylı bir analiz hazırlattım, aşağıya bırakıyorum:
Ne kusuru, güzel bir soru, ve tahminin yarı yarıya doğru. Grafikler döneme uygun, orada haklısın. Döneme uymayan şey, aynı anda hareket eden nesnelerin sayısı ve her bölümün taşıdığı ses miktarı. Ölçtüğüm rakamlarla anlatayım.
Önce bir düzeltme. Oyun stok A1200'de çalışıyor: Heliobane-NoFast, 68EC020, 2 MB chip RAM ve fast RAM olmayan makine için derlenmiş sürüm. O 2 MB'ın neredeyse tamamını kullanıyor, bazı efektleri dışarıda bırakıyor (bunu derleme yapıyor, oyuncunun bir şey kapatması gerekmiyor) ve en yoğun çatışmalarda yavaşlıyor. Fast RAM (ve 68030) isteyen sürüm, bütün efektleriyle akıcı olan sürüm.
YÜK NEREDEN GELIYORAmiga sürümü, PC oyununun bir portu; sıfırdan Amiga için tasarlanmış bir oyun değil. PC oyunu önce, Amiga sınırları hiç düşünülmeden tasarlandı. Port için kural da şu: aynı oyun kalacak. Aynı düşmanlar, aynı mermi desenleri, aynı skorlar. Oyun mantığı C'ye taşındı ve PC sürümüyle tik tik karşılaştırarak test ediyorum; aynı girdiyle oynanan bir bölüm iki tarafta da aynı skorla bitiyor. Yani yoğunluğu sessizce azaltamıyorum. PC 160 mermi atıyorsa Amiga da 160 mermi atıyor.
PC oyunu da yoğun. World 1'in son iki bölümünde zirvede ekranda 157–160 düşman mermisi, artı oyuncunun 110'a kadar kendi atışı var. Bosslar (Herald'lar) büyük: Hungering Heart 176×160 piksel, World 3'teki First Mouth 240×176; oyun alanı ise 240 piksel genişliğinde. Her sprite tek başına 1992'den çıkmış gibi görünüyor. Sayıları öyle değil.
BIR KARE NASIL ÖLÇÜLÜYORPAL ekran saniyede 50 kare, her karede 313 satır çiziyor; bütün işi bu satırlarla ölçüyorum. Oyun görüntüyü iki karede bir güncelliyor, yani 25 fps (oyun mantığı yine saniyede 50 tik çalışıyor). Böylece bir görüntüye 626 satırlık süre düşüyor.
Ekran AGA dual playfield: her biri 4 bitplane'lik iki katman. Arka katman uzak arka plan ve yıldızlar. Ön katman yakın arka plan; bütün düşmanlar, mermiler, atışlar, toplanabilirler ve patlamalar blitter ile bu katmana, 4 bitplane'in hepsine çiziliyor, o tampon bir sonraki kullanımda yeniden siliniyor. Gemi ve yan panel donanım sprite'ı.

Stok A1200'de 8×8'lik tek bir mermi yaklaşık 2,65 satır tutuyor: silme, çizme ve blit'i hazırlayan CPU'nun payı. 150 mermi ve 20 düşmanla bütçeyi ilk ölçtüğümde şöyle çıkmıştı:
Çizim tek başına kareyi dolduruyor. Bu sayılarda oyun mantığı, müzik ve yan panel yanına sığmıyor; yoğun anlarda toplam 830–910 satır. World 1'in ilk bölümü daha hafif (aynı anda en fazla 10 düşman, 119 mermi de sadece boss sırasında) ve stokta baştan sona 25 fps tutuyor; en kötü kare 626 satırın 605'i.
BLITTER VE CPU TAHMININYakın, bir farkla. Stok A1200'de tek bir bellek yolu var. Görüntü, blitter ve CPU hepsi chip RAM'den geçiyor ve fast RAM olmadığı için CPU'nun kodu ve verisi de chip RAM'de. Blitter meşgulken CPU yolun boşalmasını bekliyor. Ölçtüğüm kadarıyla bir blit sürerken oyun mantığı yolun aşağı yukarı üçte birini alabiliyor. Bu yüzden iki şey denedim:
- Küçük mermileri blitter yerine CPU ile çizmek: CPU chip RAM'e ancak yaklaşık 3,3 renk saatinde bir erişebiliyor, CPU'nun çizdiği bir mermi blitter'ın iki katı sürdü. Bıraktım.
- Blitter çizerken CPU oyun mantığını çalıştırsın diye bir blit kuyruğu: denediğim her varyantta stok makinede daha yavaştı. Fast sürümde kullanılıyor.
Fast RAM'in megahertz'den daha önemli olmasının nedeni de bu. Aynı mermi testinde (80 mermi, 20 düşman) stok 68020 ortalama 438 satır harcadı. Fast RAM'li bir 68030, 14 MHz'de 339, 50 MHz'de 336 satır harcadı. Kazancın neredeyse tamamı CPU'yu chip yolundan çıkarmaktan geldi, saat hızından değil. Gerçek oyunda oyun mantığının payı o testtekinden büyük, orada saat hızı da işe yarıyor.
"Baştan almadan optimize edilemiyor" kısmına gelince: çok şey optimize edildi. Çizim döngüsü assembly ve 68020'nin 256 baytlık komut önbelleğine sığıyor (bir mermi 4,75 satırdan 2,65 satıra indi). Boş arka plan üzerindeki nesneler maskesiz düz kopya olarak çiziliyor, bu maskeli blit'in yarı süresi; oradaki silmeler de temizleme. Blitter kopyalarken CPU eski mermilerin bir kısmını kendisi temizliyor. Büyük bosslar şeritler halinde doğrudan temiz arka planın üzerine çiziliyor. Her bölümün kodu bölümle birlikte diskten yükleniyor. Oyunu değiştirmeden değişemeyen şey, ekrandaki nesne sayısı.
RAM'I NE KAPLIYORStok A1200'de her şey 2 MB chip RAM'de duruyor: kod, oyun durumu, grafikler, müzik, seslendirme ve ekran tamponları. Her bölüm diskten tek bir bloğa yükleniyor; blok 912.896 bayt, en büyük bölüme göre ayarlı. World 1'deki bir bölümde kabaca şunlar var:
- İki arka plan katmanı, 221 KB. Tam bitmap'ler, 768 satır yüksekliğinde: 512 satırlık resim artı ilk 256 satırı bir kez daha. Böylece kaydırma sadece bir işaretçiyi oynatmak, hiçbir şey yeniden çizilmiyor.
- Seslendirme: en büyük kalem. Telsiz diyalogları seslendirilmiş; 8 kHz'de bölüm başına 240–408 KB, artı boss repliklerine 183 KB'a kadar. 3. bölümde 8 kHz'de 555 KB seslendirme vardı, bloğun yarısından fazlası.
- İki MOD, bölüm müziği ve boss müziği, birlikte yaklaşık 156 KB.
- Düşmanlar, ara bosslar ve Herald, 31–145 KB. Heart tek başına 103 KB.
- Ortak grafikler (mermiler, atışlar, toplanabilirler, patlamalar) 91 KB, bölümün kendi kodu 3–15 KB.
Bu bloğun yanında ön katmanın çift tamponlama için iki çizim tamponuna ihtiyacı var, 2 × 98 KB. Silme, temiz katmanı geri kopyalayarak yapılıyor; bu, her nesnenin altını kaydedip geri koymaktan %39 hızlı ölçüldü, bedeli o 96 KB'lık temiz kopyayı bellekte tutmak. Sonra programın kendisi (yan panelin sprite verisi, gemi, ses efektleri ve oyun durumuyla birkaç yüz KB) ve AmigaOS ile Workbench'in tuttukları geliyor.
Sıkışık olan kısım şu: bölüm bloğu ve iki çizim tamponu, 1.109.536 baytlık tek bir boş alana birlikte sığmak zorunda. İkondan başlatınca Workbench'in arkasında bıraktıklarıyla geriye 1.106–1.112 KB kalıyor, yani pay birkaç KB. Oyunun sabit disk imajını bağlamak, dosya sistemi için yaklaşık 12 KB chip RAM alıyor ve bu tek başına bir bölümün açılmamasına yetebiliyor.
Stokta sığdırmak için yaptıklarım:
- Seslendirme 8 kHz yerine 5,5 kHz (%31 daha az). Bununla her bölüm sığdı.
- Her bölümün kodu, hepsi bellekte durmak yerine bölümle birlikte diskten yüklenen bir modül (yaklaşık 25 KB geri kazanç).
- Oyun çalışırken Workbench ekranı kapalı; oyun sonu müziği gerektiğinde diskten yükleniyor.
- Konuşmacı portresi paneli sadece fast sürümde: 11,4 KB'ı, ikondan başlatmanın o zamanki 5,5 KB'lık payından fazlaydı.
- Salvage silahlarının replikleri stokta yok.
Fast sürümde kod, tablolar ve seslendirme fast RAM'e gidiyor; bir replik çalınacağı zaman 64 KB'lık bir chip tamponuna kopyalanıyor. 8 kHz seslendirmeyi ve bütün efektleri böyle tutabiliyor.
STOK A1200 SÜRÜMÜNÜN VAZGEÇTIKLERI- Yıldız katmanı (karede yaklaşık 40 satır).
- Patlama parçacıkları ve kıvılcımlar: stok her patlamanın sadece kendi animasyonunu çiziyor, aynı anda en fazla 8; fast sürüm PC'nin tam setini, 64'e kadar.
- Yakın parallax katmanı (kayalar, kabarcıklar, çizgiler), su, ısı ve plazma bölümlerindeki raster dalgalanması, vuruş parlaması ve dönen asteroitler.
- Konuşmacı portreleri.
- World 2'de: 6. bölümün parlaması, rüzgâr çizgileri, hız çizgileri (karede 44 satır), şimşek yaylarında daha az nokta; bosslar kendi birimlerinin altında çiziliyor.
Bunlara rağmen yavaşlıyor. World 1'de 1. bölüm 25 fps tutuyor; 2. ve 3. bölümler sürenin %2,5 ve %1,8'inde, 4. ve 5. bölümler %19,6 ve %24,5'inde yavaşlıyor, bossların en ağır evrelerinde. World 2'de şimdiye kadar: 6. bölüm %1,1, 7. bölüm %26,7 (Rimebound çatışması), 8. bölüm %14,2 (Storm Choir), 10. bölüm %2,8. Fast sürüm ölçülen hiçbir bölümde yavaşlamadı. Yavaşlama benim tercihim: bir an zamanında çizilemediğinde, mermi düşürüp oyunu değiştirmek yerine bütün oyun bir anlığına yavaşlıyor, arcade makinelerinde olduğu gibi.
STOK A1200'DE 50 FPSOyun 50 Hz ekranda çalışıyor ama iki sürümde de iki karede bir yeni görüntü gösteriyor. Her karede yeni görüntü demek 626 yerine 313 satır demek. Testte stok A1200, 20 düşman ve yaklaşık 20 mermiyle 50 fps tutuyor (30 mermide 44 fps'e iniyor). Fast RAM'li 68030 bile 20 düşmanla ancak 40 kadar mermi taşıyor. Yani 50 fps, iki makinede de başka bir tasarım demek:
- düşman mermileri 160'lık zirveden kabaca 20–30'a, oyuncu atışları da çok daha aza;
- büyük bosslar her karede blit'lenmek yerine bir arka plan katmanına gömülüp donanım kaydırmasıyla hareket ettirilir;
- nesne katmanı için 3 bitplane, 15 yerine 7 renk; bu her blit'ten aşağı yukarı dörtte birini düşürür (tahmin: blit süresi bitplane sayısıyla büyüyor).
Bu bir yeniden yapım olurdu: desenler ve skorlar artık PC oyunuyla aynı olmazdı.
A500 YA DA A500+A500'de 7 MHz'lik bir 68000 (komut önbelleği yok, 16 bitlik yol) ve OCS çipseti var; A500+'ta ECS. Orada dual playfield en fazla 3+3 bitplane, yani katman başına 15 yerine 7 renk. Sprite'lar 16 piksel genişliğinde. A500'de 512 KB chip RAM var (alışılmış trapdoor genişlemesi chip RAM değil, blitter ve görüntü onu kullanamıyor); A500+'ta 1 MB. Sahiplerin çoğu disketten çalıştırıyor.
Bellek. Bugün tek bir bölüm 913 KB'lık bloğa, 197 KB'lık çizim tamponlarına ve programa ihtiyaç duyuyor; AmigaOS'un payından önce 1,4 MB ya da daha fazla chip RAM. A500+'ta toplam 1 MB var. Şunlar gerekirdi:
- seslendirme yok, ya da birkaç kısa replik: açık ara en büyük tasarruf;
- bölüm başına tek MOD, ortak sample'larla;
- arka planlar tam bitmap yerine tile'lardan, 3 bitplane ile;
- daha az kareli, daha küçük bosslar. Heart (103 KB) ve First Mouth (149 KB) tek başlarına bir A500+'ın belleğinin %10–15'i ederdi;
- kendi yükleyicisi ve disk değiştirme ekranları olan bir disket sürümü. Stok verisi bugün 6,7 MB, sıkıştırılmış haliyle bile 3 disket.
Hız. Oyun mantığı 68020 için yazıldı: 64 bit sonuçlu 32×32 bit çarpmalar ve 68000'de olmayan komutlarla yazılmış biraz 68020 assembly'si. Önbellek olmadan ve 32 bit aritmetiği adım adım yaparak aynı kodun 68000'de 2–3 kat yavaş çalışmasını beklerim. Bu bir tahmin, ölçmedim. 68020'de bile oyun mantığının iki tiki yoğun anlarda 160–240 satır tutuyor.
Sprite'lar. AGA'da 64 piksel genişliğindeki sprite'lar gemiyi (32×32, 15 renk) ve 80 piksellik yan panelin tamamını taşıyor. OCS'de gemi tek başına 8 sprite'ın 4'ünü alıyor; yan panelin playfield'a çizilmesi ya da yeniden tasarlanması gerekirdi.
Yani bir A500 sürümü aynı dünyada geçen yeni bir oyun olurdu: aynı bölümler ve hikâye, 7+7 renge yeniden çizilmiş grafikler, küçük bosslar, 20–30 mermi, o makine için baştan yazılmış desenler. Taşınabilir C oyun mantığı ona bir iskelet verebilir, dengesini veremez. Planlanmış değil. Bir gün yaparsam bu porttan değil, tasarımdan başlarım.