2010-06-04 111 views
5

我以前遇到過這個問題多次,想聽聽其他人的經驗和建議是什麼。假設您有一個工作穩定但相對較小的遊戲引擎,只能在一個平臺上運行,並且您希望將其移植到另一個平臺。如何將遊戲引擎移植到另一個平臺?

第一步顯而易見:您將代碼,鏈接到平臺庫而不是舊版本,對項目或目標構建設置進行必要的更改,然後點擊構建。大約出現五到二萬個錯誤。當然有很多重複的東西,但它立即引發了下一個步驟應該是什麼問題?

如何將遊戲引擎移植到另一個平臺,或者由於系統和API設計的固有變化而無法在其他平臺上編譯的平臺特定代碼?你如何克服所有這些錯誤?你如何識別首先應該接近的部分?

一般來說:我應該如何移植現有的源代碼?

我正在尋找關於如何處理源代碼端口的一般建議。假設兩種平臺上的編程語言和編譯器都是相同的,所以它主要是API的改變。

+0

也發現這個,一些有用的意見:http://stackoverflow.com/questions/2664254/how-does-porting-between-linux-and-windows-work – LearnCocos2D 2010-06-04 19:46:34

+1

「第一步是絕對移動所有平臺,將特定的代碼放到代碼庫的一個區域中;這個區域應該只有很少或沒有特定於應用程序的東西,然後爲新的目標操作系統重新編寫代碼的這部分代碼。 – LearnCocos2D 2010-06-04 19:56:06

回答

3

教科書的答案(可能)可能會包裝所有平臺特定的調用,並在整個代碼中使用這些包裝函數而不是特定於平臺的函數。這樣,如果你可以匹配你在兩個平臺上使用一對一的方法(也許說起來容易做起來難),那麼你可以用你的包裝函數來調用哪個特定於平臺的函數,而不是改變其餘的代碼中的邏輯。

假設你有:

void RenderBadGuy(int badGuyID) 
{ 
    // Windows-specific bad-guy rendering code here 
} 

現在,你可以只寫(「G_」是通用)

void G_RenderBadGuy(int badGuyID) 
{ 
    RenderBadGuy(badGuyID); 
} 

這增加了開銷少量到你的引擎,但是這不應該不會破壞你的東西(只是一個額外的函數調用)。

現在,您使用RenderBadGuy的每個地方,只需使用G_RenderBadGuy即可。沖洗並重復所有的方法,現在後來你可以把你的代碼換成類似

void G_RenderBadGuy(int badGuyID) 
{ 
    // now we're rendering on a Mac 
    RenderBadGuy_Mac(badGuyID); 
} 

然後你的主引擎不會改變。

你可能可以做到這一點比這更好,更一般(指向函數,我不知道),但這就是主意。

或者,你可以做一個類似於Java的事情,讓你的庫與一個模塊交談,該模塊反過來知道你的平臺的細節。只需爲每個平臺開發不同的模塊(如VM),並且只開發一次庫。

+0

我知道如果你構建一個遊戲引擎,這是正確的方法,但是如果遊戲引擎已經存在並且在整個地方都有特定於平臺的調用呢? 可能仍然是一個好主意,那麼我最終會得到一堆void函數,我可以稍後用實際代碼填充代碼編譯完成時的錯誤代碼,那是您的意思嗎? – LearnCocos2D 2010-06-04 17:52:08

+0

編輯我的回覆澄清。 – John 2010-06-04 18:52:16

+0

我認爲在RenderBadGuy中簡單地註釋掉「特定於windows」的東西比較容易,因爲它無論如何都不會在目標平臺上編譯,然後我不必更改函數的名稱。這兩個端口不太可能並行開發。我主要關心的是如何讓它在新平臺上運行。但感謝這個想法讓我想到了! – LearnCocos2D 2010-06-04 19:44:04