關(guān)于多線程實(shí)現(xiàn)模擬器的思考

學(xué)習(xí)了關(guān)于復(fù)古游戲機(jī)模擬器的實(shí)現(xiàn)方法后溉瓶,我就有了一個思考万矾,為什么我見到的大部分模擬器都是單線程實(shí)現(xiàn)的(這里單線程指的是對CPU伤疙、MMU银酗、中斷、DMA徒像、定時器等硬件的模擬都塞在一個線程里面)(也有可能是我孤陋寡聞黍特,我只研究過比較古老的游戲機(jī)模擬器,沒有研究像3DS和Switch這種較新的模擬器)锯蛀?

雖然大部分復(fù)古游戲機(jī)的性能都很弱灭衷,現(xiàn)在的個人電腦的CPU和旗艦手機(jī)的SOC的單核性能來模擬這些游戲機(jī)綽綽有余,但是對于低成本的嵌入式SOC旁涤,情況就不一樣了翔曲,某些嵌入式SOC雖然單核性能弱,但也是多核架構(gòu)的劈愚,如果能充分利用多核的性能部默,那也是能夠流暢運(yùn)行的(理論上)。

更何況造虎,受到工藝的限制傅蹂,目前摩爾定律所描述的單核主頻的提升已經(jīng)舉步維艱了,將來模擬性能更強(qiáng)的多核游戲機(jī)算凿,模擬器的性能會更加受限份蝴。

那么多線程實(shí)現(xiàn)模擬器的挑戰(zhàn)在哪里?

我搜索過很多資料氓轰,但沒有一個確切的答案婚夫。有說多線程同步狀態(tài)太麻煩的,有說多線程性能不好的署鸡,但我覺得這些都不是本質(zhì)的原因案糙。

無論是單核的GB限嫌、GBA還是雙核的NDS,它們的硬件可以說都是并行地運(yùn)行的时捌,在硬件層面上對于內(nèi)存的讀寫操作本質(zhì)上就是沒有并發(fā)安全一說怒医,數(shù)據(jù)競爭問題那是軟件需要解決的問題。按這個道理來說奢讨,多線程模擬多個硬件似乎問題不大稚叹?

經(jīng)過我一段時間以來,閑來無事就稍微思考一下的習(xí)慣拿诸,我認(rèn)為是以下原因扒袖,以及解決辦法。

首先亩码,很多復(fù)古游戲機(jī)模擬器都使用的解釋執(zhí)行季率,類似rboy、mGBA等描沟,melonds支持JIT蚀同,但也是后面才加的。解釋運(yùn)行的好處是跨平臺很方便啊掏,畢竟使用代碼模擬opcode蠢络。但這里會有一個問題,比如rboy里面一段LD BC, d16的操作:

let v = self.fetchword();
self.reg.setbc(v);

這里模擬一個簡單的指令就需要兩個步驟迟蜜,更別說這些步驟可能編譯出來更多的真實(shí)機(jī)器的匯編指令刹孔。我們要想模擬復(fù)古游戲機(jī)的單個指令的原子性,就必須保證解釋執(zhí)行這個指令的原子性娜睛。

要怎么保證解釋執(zhí)行指令的原子性髓霞?加鎖?用channel的方式畦戒?

要知道就算是古老的Gameboy方库,他的CPU主頻只有4194304 Hz,但通過加鎖的方式來保證原子性障斋,那一秒鐘就會有4194304次加解鎖操作纵潦,要是用channel的方式就會有4194304次內(nèi)存復(fù)制的操作,可以實(shí)現(xiàn)(我試過)垃环,但是性能會非常差邀层,掉幀掉出天際了。

那還有別的辦法嗎遂庄?

我突然想到一個思路是放棄解釋執(zhí)行寥院,改成用JIT,但前提是JIT能夠?qū)⒂螒驒C(jī)的指令一比一翻譯成目標(biāo)機(jī)器的指令涛目,這樣就可以保證模擬指令的原子性了秸谢。但是JIT有個缺點(diǎn)凛澎,就是跨平臺性很差,需要針對每種真實(shí)機(jī)器的CPU指令集都做一遍翻譯估蹄。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末塑煎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子元媚,更是在濱河造成了極大的恐慌轧叽,老刑警劉巖苗沧,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刊棕,死亡現(xiàn)場離奇詭異,居然都是意外死亡待逞,警方通過查閱死者的電腦和手機(jī)甥角,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來识樱,“玉大人嗤无,你說我怎么就攤上這事×梗” “怎么了当犯?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長割疾。 經(jīng)常有香客問我嚎卫,道長,這世上最難降的妖魔是什么宏榕? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任拓诸,我火速辦了婚禮,結(jié)果婚禮上麻昼,老公的妹妹穿的比我還像新娘奠支。我一直安慰自己,他們只是感情好抚芦,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布倍谜。 她就那樣靜靜地躺著,像睡著了一般叉抡。 火紅的嫁衣襯著肌膚如雪枢劝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天卜壕,我揣著相機(jī)與錄音您旁,去河邊找鬼。 笑死轴捎,一個胖子當(dāng)著我的面吹牛鹤盒,可吹牛的內(nèi)容都是我干的蚕脏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼侦锯,長吁一口氣:“原來是場噩夢啊……” “哼驼鞭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起尺碰,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤挣棕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后亲桥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體洛心,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年题篷,在試婚紗的時候發(fā)現(xiàn)自己被綠了词身。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡番枚,死狀恐怖法严,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情葫笼,我是刑警寧澤深啤,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站路星,受9級特大地震影響溯街,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜奥额,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一苫幢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧垫挨,春花似錦韩肝、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至哲泊,卻和暖如春剩蟀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背切威。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工育特, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓缰冤,卻偏偏與公主長得像犬缨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子棉浸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內(nèi)容