2014-11-06 46 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