2014-11-06 43 views
2

我開始開發一款科學軟件,希望我能夠在多種平臺上運行。我的計劃是使用OpenTK來渲染科學模型和繪圖。截至目前,我有一個使用OpenTK 1.1庫從http://www.opentk.com/(更簡單的OpenTK版本和OpenTK + WindwosForms更復雜的版本)的Windows上運行的原型。我試圖將該原型移植到Android。使用OpenTK建議的跨平臺(Windows和Android)項目設置

似乎Xamarin.Android OpenTK庫所使用的語法與我目前用於Windows的語法幾乎相同(只有OpenGL - > OpenGL ES和GameWindow - > AndroidGameView),所以移植不應該是一個問題。但是,我希望能夠避免複製粘貼方法,並獲得在Windows和Android版本之間共享OpenTK代碼的更持久的解決方案。

我已閱讀了有關跨平臺開發的共享vs PCL方法的Xamarin文檔。但是,我仍然很難找出如何設置一個帶有Android和Windows項目的Visual Studio解決方案以及包含OpenTK的共享代碼。這甚至是可能的,有人可以給我一個如何做的例子嗎?我確實探索了一個我使用OpenTK爲共享Android/iOS項目(http://developer.xamarin.com/content/TexturedCubeES30/)渲染旋轉立方體的例子,但在我的情況下,我需要爲Windows和Android項目使用不同的OpenTK庫。

我還發現這Do the Android and iOS versions of OpenTK have the same API?討論。這與我想要做的非常相似,但在我的情況下,我正在嘗試爲Windows和Android(現在)設置一個項目。

我可以只使用一個從Android和Windows項目中調用的OpenTK庫(哪一個?),以及設置兩個項目的正確方式,以便共享相同的OpenTK代碼。這是我第一次處理編寫跨平臺代碼的問題,所以我有點失落。

編輯:我能夠得到一個使用共享Xamarin項目和編譯器標誌運行的原型,如下所示。代碼在地方的確不是很漂亮,但是我在兩個平臺之間獲得了超過70%的代碼重用性,所以這是值得的。這就是我如何使用,以防有人編譯器標誌正在尋找同樣的事情(從Xamarin論壇信貸SKall):

#if __ANDROID__ 
using OpenTK.Graphics.ES11; 
#else 
using OpenTK.Graphics.OpenGL; 
#endif 

我用了#如果語法類似,那裏有語法之間的微小差異例程。

回答

0

看起來OpenTK似乎並沒有將PCL的邏輯放在首位,所以你的計劃將難以實現。但是,如果你將代碼拆分出來,使得大部分代碼都包含在不依賴底層平臺的類中,那麼您將能夠爲每個平臺創建一個類庫項目並鏈接您的文件平臺特定項目之間。在它包含的類的內部,您將使用#if定義來選擇是使用AndroidGameView還是GameWindow,其他平臺特定類型也一樣。它會使代碼變得醜陋,但這是PCL的替代選擇。

您可以嘗試查看OpenLock代碼在PCL內編譯多少並在運行時注入特定於平臺的內容,但這需要您從中獲得更多的工作。但是,它會使代碼看起來更清晰。

爲了簡化文件鏈接,您可以製作其中一個共享項目並查找其中的所有邏輯。

有關代碼共享這裏的一些詳細信息:http://developer.xamarin.com/guides/cross-platform/application_fundamentals/building_cross_platform_applications/sharing_code_options/

依賴注入:https://en.wikipedia.org/wiki/Dependency_injection

+1

OpenTK桌面版可以轉換爲PCL很輕鬆地(在項目設置'#定義MINIMAL')。但是,Android版本依賴於Xamarin.Android,它不是PCL。使用共享項目是最好的選擇,但我願意接受OpenTK內部可能的解決方案。 – 2014-11-07 10:53:45

+0

是的,我正在探索在任何需要的地方使用#if共享項目方法。我認爲這可能是最簡單的方法。那麼我想我正走在正確的軌道上。我稍後可能會更新我的問題,並對我學到的東西進行一些評論,一旦我得到原型,或遇到任何嚴重問題。 – tovida 2014-11-07 16:58:35