Super Nintendo Video Sistemi Tasarımını Anlamak
(fabiensanglard.net)- SNES videosu, 1990’ların başındaki CRT TV ve NTSC sinyalinin sınırları içinde 256x224 ekran, 60.098Hz kare hızı ve blanking aralıklarına uyacak şekilde tasarlanmıştı
- CRT, piksel ızgarası değil; elektron tabancası, RGB sinyali ve HSYNC/VSYNC ile tarama çizgileri çizer; progressive ve interlace de senkronizasyon sinyali konumlarındaki farkla ayrılır
- Ayrı bir video osilatörü koyamayan SNES, 21.47727MHz ana saatini bölerek 5.3693175MHz dot clock üretir ve 262 satır・341 dot kombinasyonuyla NTSC standardı 59.94Hz’den farklı olarak 60.098Hz’e ulaşır
- Temel mod, 262 satırın 224 görüntü satırı ve 38 satır VBLANK, 341 dot’un 256 dot görüntü ve 85 dot HBLANK olarak düzenlenmesiyle PPU’nun sprite line buffer işlemleri için zaman ayırır
- PAL SNES, 50Hz・312.5 satırlık ortama uygun farklı bir osilatör ve 240 satırlık overscan modu sunsa da çoğu oyun 224 satıra göre tasarlandığından siyah bantlar ve %17 daha yavaş çalışma yaygındı
CRT TV’nin tasarımı sınırladığı noktalar
- SNES’in görüntü çıkışı için temel hedefi standart CRT TV idi; dönemin TV’leri anten üzerinden NTSC analog yayın alır ya da AUX girişiyle harici görüntü kabul ederdi
- Sıradan TV’lerdeki yardımcı giriş, sarı kompozit video konnektörü ile beyaz ve kırmızı stereo ses konnektörlerinden oluşurdu
- CRT, saniyede yaklaşık 15.000 çizgi çizebilen 15kHz sınıfı bir çizgi çizme aygıtı olarak görülebilir
CRT piksellerle değil, tarama çizgileri ve sinyallerle çalışır
- CRT’nin içinde üç elektron tabancası vardır; elektronlar dikey ve yatay mıknatıslar tarafından yukarı-aşağı ve sağa-sola saptırılır
- Elektronun kendisinin rengi yoktur; maske, her elektron tabancasından gelen elektronları doğru renk fosfor şeridine ulaştırır
- CRT’de piksel yoktur ve slotlar da piksel değildir
- Yüksek çözünürlüklü TV’lerde slotlar daha küçüktür; bu da aynı renk sinyalinin yatay yönde daha sadık biçimde ifade edilmesini sağlar
- CRT, beş sinyali dört kablo üzerinden alır
- Red, Green, Blue sinyalleri doğrudan ilgili elektron tabancalarına bağlanır
- Üç RGB hattında sinyal yoksa elektron ateşlenmez ve siyah görüntülenir
- Beyaz hat, Composite Sync(CSYNC) olarak HSYNC ve VSYNC’i birlikte taşır
- CRT VSYNC üretmez; harici sistemin gönderdiği senkronizasyon sinyalini alarak elektron tabancası konumunu hizalar
Progressive ve interlace arasındaki fark
- CRT bir satırı soldan sağa çizer; HSYNC aldığında ekranın solundaki X=0 konumuna döner
- VSYNC aldığında ekranın üstündeki Y=0 konumuna geri döner
- Elektron tabancası sağa hareket ederken aşağı doğru eğimli bir yol izler; HSYNC’ten sonraki bir sonraki satır, önceki satırın altına çizilir
- VSYNC son HSYNC ile aynı anda gerçekleşirse alan aynı konuma çizilir ve progressive tarama olur
- VSYNC iki HSYNC arasında gerçekleşirse bir sonraki alanın çizgileri önceki alanın çizgileri arasına girer ve interlace olur
- Interlace dikey çözünürlüğü iki katına çıkarır, ancak her satırın yenileme oranını yarıya düşürür
- NTSC yaklaşık 30Hz’de iki alan gönderdiğinden CRT, interlacing için satır aralığını ayırmıştı; progressive çizimde siyah scanline aralıkları görünür
NTSC özellikleri ve basit tasarım önerisinin sınırları
- SNES tasarımının NTSC TV’lerin işleyebileceği değerlere yakın olması gerekiyordu
- En-boy oranı: 4:3
- Alan başına satır sayısı: 262.5
- Bir satırdaki dot sayısı: 341.25
- Alan frekansı: 59.94Hz
- Siyah-beyaz NTSC başlangıçta 60Hz’di; ancak renkli NTSC, geriye dönük uyumluluğu koruyup renk eklerken artefaktlardan kaçınmak için frekansı %0,1 düşürdü
- Basitçe 262 satır progressive, 350 dot ve 59.94Hz seçilerek 5.496.498Hz dot clock gerektirilebilir
- Ancak bu tasarım gerçek SNES’e uymuyordu
- Maliyet kısıtları nedeniyle video sistemine özel bir osilatör konamazdı; alt sistemler ana osilatörü bölerek kullanmak zorundaydı
- CRT, ekran geri dönüşü sırasında da elektron tabancasını ateşlemeye devam edebileceğinden overscan ve blanking işlemleri gerekiyordu
Blanking ve dikey çözünürlük seçimi
- Elektron tabancasının konumu yatay ya da dikey olarak sıfırlanırken elektron ateşlemeye devam ederse görünür artefaktlar oluşur
- TV, ekrandan biraz daha büyük bir görüntü gösteren overscan uygular; bunun miktarı TV’den TV’ye değişir
- VSYNC ve HSYNC’ten sonra elektron tabancasının konumu kısa süre sallandığından, kararlı bir düz çizgi elde edilene kadar elektron ateşlemeyi durduracak zamana ihtiyaç vardır
- VSYNC’ten sonra elektron ateşlemenin durdurulduğu aralık VBLANK’tir
- HSYNC’ten sonra elektron ateşlemenin durdurulduğu aralık HBLANK’tir
- Dönemin rakip sistemleri de blanking kullanıyordu
- Capcom CPS-1: 262 satır, VBLANK 38 satır, görüntü 224 satır, 59.6294fps
- Sega Genesis: 262 satır, VBLANK 38 satır, görüntü 224 satır, 59.9227fps
- Neo-Geo AES: 264 satır, VBLANK 40 satır, görüntü 224 satır, 59.18fps
- SNES 262 satırı 224 görüntü satırı + 38 blank satır olarak böler
- 224, 16’ya tam bölündüğü için 16x16 tile tabanlı grafik pipeline’ıyla iyi uyum sağlar
Yatay çözünürlük ve 60.098Hz
- SNES, 21.47727MHz ana saatini 4’e bölerek 5.3693175MHz dot clock kullanır
- Kare hızı, satır sayısı, bir satırdaki dot sayısı ve dot clock birbirine bağlıdır
- Hedef kare hızı 59.94Hz ve 262 satır girildiğinde satır başına yaklaşık 342 dot çıkar; ancak kompozit çıkışın taşıyıcı artefaktları nedeniyle Nintendo mühendisleri 341 dot kullanmak zorundaydı
- Bu kombinasyonda SNES’in kare hızı 5.3693175MHz / (341 * 262) = 60.098Hz olur
- 60.098Hz, NTSC’nin 59.94Hz değerinden farklı olsa da CRT’nin tolerans aralığı içinde çalışır
256x224’ün temel ekran olmasının nedeni
- Bir satırdaki 341 dot’un tamamı görüntü alanı olarak kullanılamaz; titremeyi, artefaktları ve TV overscan’ini gizlemek için HBLANK gerekir
- 224 satırda 4:3’e yakın görüntü genişliği 224 * 4/3 = 298 dot’tur
- Tilemap pipeline’ı 16x16 tile kullandığından olası değerler 304, 288, 272, 256, 240 gibi değerlerdir
- 304 dot, ekran bozulmasının neredeyse olmadığı değere yakındır
- PPU’nun HBLANK sırasında sprite line buffer’ı doldurması gerektiği kısıtı da vardı
- 304 dot görüntü seçilirse HBLANK 37 dot, yaklaşık 7µs ile sınırlı kalır
- En fazla 128 sprite verisini getirmek için daha uzun süre gerekmiş olması muhtemeldir
- Nihai seçim 256 görüntü dot’u + 85 HBLANK dot’u oldu
- PPU, HBLANK sırasında yaklaşık 16µs elde eder
- Görüntü alanının en-boy oranı 4:3 değil 8:7 olduğundan CRT’de gösterilirken hafif bir bozulma oluşur
Yüksek çözünürlük modunun tavizleri
- Temel SNES video yapılandırması overscan çözünürlüğü 341x262, görüntü çözünürlüğü 256x224, kare hızı 60.098Hz’dir
- Oyunların %99’u bu yapılandırmayı kullandı; ancak SNES’te dikey ya da yatay çözünürlüğü iki katına çıkaran yüksek çözünürlük modları da vardır
- 448 satırlık dikey çözünürlük, son HSYNC’ten yarım satır sonra VSYNC göndererek interlace kare oluşturmakla elde edilebilir
- Bu durumda bir satır 60.098/2 = 30.049Hz ile yenilenir
- Titreme oluşur ve iyi görünmez, ancak dikey çözünürlük artar
- Yatay çözünürlüğü iki katına çıkarmak daha zordur çünkü gereken dot clock yoktur
- SNES ikinci alanı yatayda biraz kaydırarak noktaların önceki alanın noktalarının arasına gelmesini sağlar
- Sonuç olarak yarı kare hızı ve ciddi renk bulaşması ortaya çıkar
- fullsnes.txt, çeşitli oyunlardaki yüksek çözünürlük kullanım örneklerini derler
- Donkey Kong Country 1’in Nintendo logosu: 512x224, BgMode5
- Seiken Densetsu 2 ayar ekranı: 512x224, BgMode5
- RPM Racing: intro ve oyun içi 512x448, BgMode5+Interlace
- Ranma 1/2 örneğinde gerçek çözünürlük aslında 256x224’tür; interlace yanlışlıkla açık kaldığı için gereksiz titreme oluşur
PAL, SECAM ve Avrupa sürümü SNES’in sorunu
- Avrupa TV’leri NTSC değil PAL kullanır; Fransa’da SECAM de kullanılmıştır
- PAL ortamı tam olarak 50Hz ve alan başına 312.5 satır bekler
- PAL SNES, NTSC’nin 21.4772700MHz değeri yerine 17.7344750MHz osilatör taşır
- S-CLK çipi 6/5 işlemi yapar ve tekrar /4 bölerek 5.32034250MHz dot clock üretir
- Yalnızca 224 satırlık grafik kullanıldığında görüntü alanının üstünde ve altında büyük siyah bantlar oluşur
- Bunu azaltmak için görüntü satırlarını 240’a çıkaran bir overscan modu vardı
- Ek 16 satır, bir tile yüksekliğine karşılık gelir
- Pratikte çoğu oyun 224 satıra göre üretildiğinden bu mod neredeyse hiç kullanılmadı
- Toplam sadece 12 oyun kullandı
- Super Mario World, PAL’de dikey görüş alanını artırarak buna yanıt verdi
- NTSC ve PAL’in ikisi de 4:3 en-boy oranı kullandığından PAL görüntüsü NTSC’ye göre dikeyde biraz daha sıkıştırılır
- Birçok oyunun kodu, VSYNC’in 60.098Hz yerine 50.00697891Hz’de gerçekleştiğini hesaba katmadı; sonuç olarak oyunlar amaçlanandan %17 daha yavaş çalıştı
Çıkış sinyali ve AV konnektörü
- Yukarıda gördüğümüz RGB ve senkronizasyon sinyalleri CRT’yi doğrudan süren saf sinyallerdir; ancak gerçek TV’lerin çoğunda CRT’ye doğrudan sinyal verilemezdi
- Birçok TV’nin arkasında yalnızca sarı kompozit giriş vardı; bazı üst düzey modeller S-Video girişi sunardı
- SNES, CRT’ye yönelik sinyali hem kompozite hem de S-Video’ya dönüştürür
- AV konnektörü sinyalleri atmadan çeşitli çıkış biçimleri sağlar
- Red, Green, Blue
- C-Sync
- Luminance ve Chrominance tabanlı S-Video
- Composite Video
- +5V DC
- Ground
- Left Audio, Right Audio
- Avrupa TV’lerinde, özellikle Fransız TV’lerinde çoğu zaman SCART konnektörü bulunurdu; bu yöntem CRT’ye daha doğrudan sinyal veren kabloların yapılmasını mümkün kıldı
- Sonuç olarak Avrupalı kullanıcılar %17 daha yavaş ve siyah bantlı oyunları yüksek görüntü doğruluğuyla oynayabildi
1 yorum
Hacker News yorumları
224 büyük olasılıkla rastgele seçilmiş bir sayı değil. 16’ya tam bölündüğü için (224/16=14), grafik işleme hattındaki tilemap yapısıyla iyi uyum sağlıyor.
Çocukken oyun programlamayı öğrenmeye çalışırken bir şeyleri kurcalamıştım; bunu ancak çok sonra anladım ve o zaman taşlar yerine oturdu. CGA/EGA/VGA’da 320x200 modları yaygındı; NES ve SNES ise 256x224 kullanıyordu ve bu aslında büyük ölçüde TV kısıtlarına yakındı.
Buna karşılık arcade Pac-Man 288x224’tü; bu yüzden PC’deki Pac-Man klonları hiçbir zaman “doğru” görünmüyordu, hatta Namco’nun yaptığı NES Pac-Man sürümü bile uymuyordu. Harita karoları küçülüp karakterler devleşiyor, Game Boy/Tengen sürümlerindeki gibi kaydırmalı bir dünyaya dönüşüyor ya da bozulma ve özgün olmayan harita gibi tavizler devreye giriyordu; evde “arcade” oyunu oynamaya çalışınca tuhaf ve bunaltıcı geliyordu.
Makine mimarisini ve sprite’ların nasıl çalıştığını öğrendikten sonra, sonunda başka bir seçenek olmadığı sonucuna varmak benim için büyük bir aydınlanma oldu. PC’deki o çözünürlükte piksellerin kare olmadığı gerçeğini de işin içine katınca konu daha da karmaşıklaşıyor.
O zamandan beri Pac-Man portlarına ya da klonlarına her baktığımda hemen dünya boyutunu, tile boyutunu ve sprite boyutunu hesaplamaya başlıyorum.
Yine de bu overscan TV’den TV’ye değişiyordu; modern TV’ler ve emülatörler genelde 240 satırın tamamını gösterir.
SNES’in dikey çözünürlüğü, yazıda belirtildiği gibi 224 satır ya da 240 satır olarak ayarlanabiliyordu. Çoğu oyun 224 satır kullandı; çünkü bu, dikey blanking süresini uzatarak PPU’ya grafik aktarmak için daha fazla zaman sağlıyordu.
Rodrigo Copetti’nin SNES mimarisi yazısına da bakmaya değer: https://www.copetti.org/writings/consoles/super-nintendo/
59.94Hz’in garip bir sayı olduğu doğru, ama bildiğim kadarıyla 30Hz elektrik şebekesi diye bir şey yok. NTSC’nin tasarlandığı Kuzey Amerika ve bazı bölgeler 60Hz elektrik şebekesi kullanır.
https://en.wikipedia.org/wiki/Mains_electricity_by_country
Siyah-beyaz TV’de üretilen en yüksek frekans yatay tarama frekansıydı ve bu da kare hızının bir katıydı. 3.579545MHz taşıyıcı kullanan NTSC renk sinyali eklenince TV’nin içindeki en yüksek frekans çok daha yükseldi; donanımı basit tutmak için daha düşük frekanslar hâlâ bu en yüksek frekansın, yani renk taşıyıcısının bölenleriyle uyumlu tutuldu. Bunun sonucunda kare hızı saniyede 59.94 alan oldu.
PAL bölgelerinde oyunların 50.00697891Hz VSYNC’e göre uyarlanmamış olması ve bu yüzden 60.098Hz standardına göre %17 daha yavaş çalışması kısmı bana çok dokundu.
Bu yalnızca Super Nintendo’ya özgü bir konu değil ama Mega Drive’da (Genesis) Sonic the Hedgehog’u ilk gördüğüm ya da oynadığım zamanları hatırlatıyor. Master System sürümüne göre hantal ve yavaş gelmişti, pek etkilenmemiştim; ancak YouTube ortaya çıktıktan sonra NTSC ile PAL arasındaki hız farkının ne kadar büyük olduğunu anladım. Sadece oyun hızı değil, müzik de PAL’de berbat duyuluyor.
16-bit döneminde de PAL’i ve “kara kutu” ihtiyacını biliyordum ama farkın bu kadar büyük olduğunu bilmiyordum. O dönemin konsol dergileri çoğu oyunda farkın küçük olduğunu söylüyordu sanki; istisna olarak SNES DooM’da NTSC sürümünün ekranı daha büyüktü.
Çocukken NES Punch-Out’ta iyiydim; Mr. Dream’i ya da Mike Tyson’ı 1. rauntta yenebiliyordum. Şimdi düşününce PAL sürümünü oynuyormuşum. ABD’de bir turnuvaya katılsaydım 1. rauntta paramparça olurdum ve birinin bana tuzak kurduğuna kesin inanırdım.
Örneğin daha düşük kare hızında Samus ve mermiler bir karede daha fazla piksel hareket ettiği için nesnelerin içinden geçmek kolaylaşıyor; bu kapı glitch’i yalnızca PAL’de mümkün: https://www.youtube.com/watch?v=RvyIwtO_qgM
Samus’un fizik sabitleri ve animasyon zamanlaması yeni kare hızına göre ayarlanmıştı, ancak düşmanlar, ara sahneler ve diğer çevre öğeleri ayarlanmamıştı. Bu yüzden PAL’de Samus NTSC ile aynı hızda hareket ederken dünyanın geri kalanı daha yavaş hareket eder. Bu sayede Bombs’u alıp kapı kilitlenmeden hemen önce odadan çıkarak mini boss’u atlamak mümkün olur: https://www.youtube.com/watch?v=R3t8TIIj7IM
NTSC sürümünde aynı skip karmaşık hazırlık ve art arda onlarca kare hassasiyetinde giriş gerektiriyor; bugüne kadar yalnızca bir kişi başarabildi: https://www.youtube.com/watch?v=jcKUMk5g8Wk
NTSC (solda) ile PAL’in (sağda) en kısa araç destekli speedrun karşılaştırması da var: https://www.youtube.com/watch?v=KD_-thqcB5s İki koşu neredeyse sona kadar aynı rotayı kullanıyor ve NTSC sürümü neredeyse her odada daha hızlı; ancak keyfi kod çalıştırma hazırlığı tamamen farklı olduğundan PAL sonuçta daha önce bitiyor. NTSC koşusu, kapıyı tetiklemeden içinden geçip sınırların dışına çıkarak bellek bozulması yaratmak için çok yavaş bir duraklatma/devam ettirme dizisi yapmak zorunda. Buna karşılık PAL sürümü, oyunun animasyon sistemindeki bir yarış durumunu kullanarak tamamen ekran içindeyken keyfi kod çalıştırmayı başarabiliyor. Bu, dikenlerin geri tepme zamanlayıcısı ile Samus’un yere iniş animasyonu arasındaki bir yarış; yalnızca Samus’un zamanlaması PAL için düzeltildiği, dikenlerinki düzeltilmediği için PAL’de yalnızca bu bağlamda istismar edilebilen bir zamanlama ortaya çıkıyor.
Dreamcast çıkınca, TV desteklediği sürece ilk kez 50Hz ile 60Hz arasında geçiş yapabilen oyunlar ortaya çıktı. Ayrıca bu farkı doğru yansıtmayan oyunlarda 50Hz’e geri dönerek oyunu daha kolay hâle getirmek de mümkündü; Crazy Taxi’nin 50Hz’de çok daha kolay olduğunu hatırlıyorum.
Bu kadar farklı oyunların aynen satılmış olması garip geliyor, ama neden böyle bir tercih yapıldığını tamamen anlıyorum. Çocukken Mario’nun her yerde Mario, Sonic’in de her yerde Sonic olduğunu doğal olarak varsayardım.
Bu farkların 3D konsol döneminde sona erip ermediğini merak ediyorum. Çünkü o dönemden itibaren render işlemi ile oyun mantığı çoğunlukla artık tamamen birbirine bağlı değildi.
Orijinal metinde bir yazım hatası var gibi. Görüntü oranını 8:6 demiş, ama bu 4:3 ile aynı; hesaplamaya göre doğrusu 8:7 olmalı.
256x224, yani 8:7 çıkış çözünürlüğünün yaklaşık 4:3’e, tam olarak da 64:49 görüntüye esnetilmesi kısmı eksik kalmış gibi.
SNES’in nokta hızı yaklaşık 5.37MHz; bu, ATSC standardının tanımladığı yaklaşık 6.13MHz kare piksel hızından daha yavaş. Tam olarak 8/7 oranında daha yavaş olduğu için pikseller yatayda 8/7 oranında esner; 8:7 çözünürlük de (8/7)(8/7)=64/49’a esneyerek 64:48=4:3’e yaklaşır.
“4:3’e yakın bir görüntü oranı için 224(4/3)=298 görünür nokta gerekir” hesabında, yukarıdaki unsur dikkate alınınca katsayı (4/3)/(8/7)=7/6 olur. Böylece 224*(7/6)=261.33... görünür nokta gerekir; bu da gerçekte seçilen 256’ya çok daha yakındır.
Ben RF çıkışına bir anahtar kutusu bağlayıp SNES ile TV anteni arasında sırayla seçim yapıyordum.
Sonradan video mühendisi olunca buna gülebildim, ama o zamanki çocuk hâlimin görüntü kalitesinin ne kadar berbat olduğunu bilmemesi iyi olmuş.
8:7 çizim en-boy oranı, ROCKMANX3 / Mega Man X3 gibi SFC/SNES’in diğer platformlara yapılan portlarında da görülüyor
PSX/Saturn/PC sürümleri, orijinal çizimleri esnetmeden korumak yerine 8:7’yi 4:3’e uydurmak için bölüme göre dikey boşluklar eklemiş. Orijinal sürüme alışık olunca oynarken epey rahatsız ediyor; Saturn sürümünün ekran görüntülerine bakınca her şeyin biraz fazla ince göründüğünü görebilirsiniz: https://segaretro.org/Mega_Man_X3
Fabien’in böyle yazıları yazmasının ne kadar sürdüğünü merak ediyorum. Gerçekten çok fazla ayrıntı var ve düzenlemesi de temiz
SNES çözünürlüğünün ne kadarının konsol donanımında sabit olduğunu, ne kadarının ise kartuşun yönlendirebileceği alan olduğunu merak ediyorum
Örneğin kendi yardımcı işlemcisi olan, sprite yüklemesi gerekmeyen ve üzerinde kendi saati de bulunan bir kartuş varsa teorik olarak bir satırda yatayda 256 pikselden fazlasını çıktı olarak verebilir miydi?
Yardımcı işlemci varsa kendi başına bir kare render edip bunu bir sonraki satırın tile’larının okunacağı bellek konumuna koyabilir. SuperFX’in kabaca böyle yaptığını sanıyorum
Ama sonuçta pikselleri fiilen çizen, renk sayısı gibi şeyleri işleyen PPU olduğu için nihai olarak PPU’nun kısıtlarına bağlı kalır