Google AdSense

2014年11月28日 星期五

預估 Atari 2600 模擬器的效能需求

計算

  • 基於前次失敗,為了確認可行性,在此先預估一下 Atari 2600 模擬器的效能需求。Atari 2600 模擬器主要應該由三部分構成。第一是 CPU,可以執行遊戲中的指令;第二是 TIA,用來將一格一格的顏色顯示到電視;第三是計時器,方便程式設計師寫程式
    1. CPU
      Atari 2600 的 CPU 是 MOS Technology 6507,時脈是 1194720(1.19M) Hz,以 TAX 這個指令來計算,這個指令作用是將暫存器 A 的資料存到暫存器 X,並更新旗標 N 和 Z,花費兩個 clock cycle。對於模擬器來說,這個指令需要的動作包括:讀取 PC,根據 PC 讀取記憶體取得 opcode,分析 opcode,呼叫對應 function,讀取暫存器 A,寫入暫存器 X,檢查資料是否小於零,寫入旗標 N,檢查資料是否等於零,寫入旗標 Z,計算下次 PC,寫入 PC;總計 3 次 read,4 次 write,1 次 hash,1 次 function call,2 次 if,1 次 add,這些動作必須在 1.67 微秒內完成
    2. TIA
      TIA 的時脈是 3584160(3.58M) Hz,每一個 clock cycle 畫一個像素。由於 TIA 比較類似於狀態機,如果不改變狀態的話,它就只會一直畫同個顏色,因此如何實作將會大幅影響效能。目前先假設成每個 clock cycle 讀取一次電子槍位置,讀取一次顏色,寫入該顏色到該位置,計算下次電子槍位置,寫入電子槍位置;總計 2 次 read,2 次 write,1 次 add,這些動作必須在 0.28 微秒內完成
    3. 計時器
      Atari 2600 內建四種速度的計時器,最快的計時器速度等同 CPU。假設成一次讀取,一次計算,一次寫入,總計 1 次 read,1 次 sub,1 次 write,這些動作必須在 0.84 微秒內完成
  • 以上總計,在 1.67 微秒內,CPU 需要完成 12 個動作,TIA 需要完成 30 個動作,計時器需要完成 6 個動作;假設每個動作都只需要 1 個 clock cycle,則要模擬這三樣東西,需要 28673280(28.67M) Hz 的 CPU。因為 Python 大概比 C++ 慢 100 倍,如果盡量精簡,應該有機會成功,我想我會再嘗試一次

回顧

  • 當時我對 Atari 2600 不夠瞭解,所以有蠻多誤會。重新評估 TIA 的部分,由於每個像素都得計算全部物件一次,才能確認有沒有碰撞發生。物件共有 PLAYER0,PLAYER1,MISSILE0,MISSILE1,BALL,PLAYFIELD 六種,每種物件還有各種狀態,所以每個物件最少需要三次讀取和比較(資料,狀態,顏色),六個物件就是 36 個動作;碰撞計算共有十五種,每次碰撞計算要讀取兩個物件並做一次比較,總共就是 45 個動作;電子槍本來是歸電視管的,為了方便算在 TIA 頭上,實務上使用雙軸定位比較容易,所以多三個動作,總共 8 個動作;這樣算起來,在 1.67 微秒內,CPU 需要完成 12 個動作,TIA 需要完成 534 個動作,計時器需要完成 6 個動作;假設每個動作都只需要一個 clock cycle,則要模擬這三樣東西,需要 327353280(327.35M) Hz 的 CPU。因為 Python 大概比 C++ 慢 100 倍,所以純 Python 結果注定悲劇

相關文章

沒有留言:

張貼留言