2010-11-12 25 views
6

我一直對Snes上的超級馬里奧系列感到驚訝。我認爲這主要是在Z80組裝中製造的。但是由於沒有真正的時鐘,他們究竟如何管理所有那些有組裝並且沒有實時時鐘的動畫事件呢?經典側滾動器是如何實現定時事件和動畫觸發器的?

由於

+0

我不確定您的意思是「實時時鐘」,但依靠Z80作爲通用處理器的控制檯也有專用硬件來製作動畫和播放聲音。 Z80正在向這些訂單提供訂單。 – 2010-11-12 21:56:21

+0

我也很想知道這個!我一直認爲它更像是一個「當X在這裏,Y這樣做」有點兒東西。 – James 2010-11-12 21:57:15

+2

舊遊戲經常圍繞它們運行的​​屏幕的幀速率同步,因此它們每幀更新一次它們的精靈(即50hz或60hz,取決於它是PAL還是NTSC制式) – Laserallan 2010-11-12 21:58:00

回答

5

要記住的一個重要概念是VSync速率。這是電視中的電子槍(或現代電視機中的電子槍)完成繪製屏幕的頻率,並慢慢地移動到屏幕的頂部。

因爲這發生在一個恆定的速率(60次/秒的NTSC,50在PAL)​​,大多數遊戲使用此作爲其計時器,用代碼即大致相當於此:

void main() { 
    while(true) { 
     updateGame(); 
     updateSprites(); 
     waitForVSync(); 
    } 
} 

顯然,這是非常簡單的,但這就是發生了什麼。一些遊戲非常複雜,他們花了很長時間,錯過了VSync時期。在這種情況下,他們會等待第二個VSync,從而以30(/ 25)FPS運行。

有時候,你會注意到NES遊戲的速度減慢(例如)。這是因爲工作負載太重,以至於在單個操作系統中缺少多個VSync時段。

但是,是的,這就是時機對舊遊戲機(實際上,甚至很多新的遊戲機和PC遊戲使用相同的系統,不只是老遊戲機!)

+0

你一直在說這個道德上相當於什麼?我不認爲這意味着你的想法。 – JustJeff 2010-11-13 14:04:02

+0

我正在使用它,使得「X在道義上等同於Y」的意思是,粗略地說,「X與Y不一樣,並且可能完全不同,但是具有相似的目的」。在做了一些研究之後,我意識到我錯誤地使用了它,所以我會將其編輯爲我的答案。 – 2010-11-19 19:16:09

0

的Z80支持許多硬件的中斷 - 這是可能的其中之一被連接到一個週期性定時器(例如每10ms)。一些早期的遊戲機具有與電視掃描刷新相關的時序,所以這可能已經被連接起來了。我不知道SNES,所以我根據其他當代系統的運作情況進行猜測。

維基百科說SNES是一個16位的系統,所以它不是一個Z80,它是8位。 其實它說,它是一個65c816

http://en.wikipedia.org/wiki/Super_Nintendo_Entertainment_System

(上面的鏈接有關視頻同步中斷談判,所以我可能是在右邊線假設你是對實時時鐘正確)

2

在舊硬件上使用的一種非常常見的技術是依賴於用於顯示圖形的相同定時硬件。舊的硬件通過從內存中讀取一個像素值並將其輸出到端口以及一些「同步」信號,將數據從其圖形端口(複合視頻或更常見的RF)中流出來,以控制掃描電子槍電視。

好的一點是,垂直同步信號是讓槍從屏幕底部擺動到頂部的垂直同步信號,通常連接到控制檯CPU上的硬件中斷,並且在那個瞬間,在沒有數據通過視頻發送的時刻,每秒發生29.97次(接近30fps),因爲光束「飛回」到屏幕頂部需要一些時間。視頻內存當時所做的更改將無閃爍!

+1

在大多數較舊的系統中,偶數場和奇數場之間沒有區別,所以視頻幀頻約爲60Hz。同樣值得注意的是,在Atari 2600上,處理器負責產生垂直定時,因此在電視機的容差範圍內,幀率可以高於或低於60Hz。其中一個芯片(「RIOT」)包括一個帶有預分頻器的倒計數器,可以在運行一段代碼之前設置該預分頻器,這需要執行不確定的時間量,但沒有中斷。 – supercat 2010-11-22 23:02:28

2

遊戲,然後和現在一樣,通常運行如何工作要點一個固定的時間步驟循環(請參閱Mike Carons的答案)。最初,這主要是爲了方便;您的渲染無論如何都是同步到顯示刷新率以避免撕裂,也可能每幀運行一次基於時間的處理。現在,大多數遊戲仍然以離散步長提前,這是基礎速率的倍數,通常是50/60 Hz或類似100 Hz - 某些遊戲仍然具有基於VSync的計時,但大多數遊戲只使用常規計時器現在這個。現在我們使用固定時間步長的原因有很多不同:首先,遊戲通常至少進行一定量的物理仿真,而且很難以可變的時間步長穩定地進行物理仿真 - 特別是在實時應用中,例如遊戲,您通過使用更精確的集成方法等,不能輕易地將更多的計算能力投入其中。其次,如果你有任何種類的網絡多人模式,你需要確保遊戲對所有玩家保持同步。如果每個人都處於不同的計時器並以不同的速率處理事件,則幾乎不可能管理(和調試)。強制每個人使用一個共同的時間步驟會使問題更容易管理幾個數量級,因爲您可以安全地假設兩個以相同狀態啓動並獲得相同輸入的玩家在5秒後仍然處於相同狀態,即使玩家看着不同的東西或者擁有不同的機器,所有這些都會影響遊戲運行的實際幀速率(因此也影響遊戲處理事件的速度)。