我计划编写一个Java 3D游戏,可以在PC和Android上运行。不幸的是,貌似没有适用于这两个平台的通用OpenGL API。
这些API是否存在显著差异?我能否在两个版本中使用相同的3D代码?这是一个好主意吗?
我计划编写一个Java 3D游戏,可以在PC和Android上运行。不幸的是,貌似没有适用于这两个平台的通用OpenGL API。
这些API是否存在显著差异?我能否在两个版本中使用相同的3D代码?这是一个好主意吗?
Android支持OpenGL ES 1.0,它与OpenGL 1.3重叠,因此这应该是可行的,但并不像仅仅在运行时替换jar文件那么简单。
尽可能地重用应用程序在两个平台上的代码是一个好主意。总之,最好的做法是将代码与外部依赖项(如OpenGL)隔离开来,即使您没有特别需要OpenGL ES支持。您永远不知道未来您可能要将应用程序移植到哪个API/平台上。
有两个可用的选项。
第一种方法是将OpenGL实现隐藏在应用程序其余部分使用的接口后面,然后提供单独的Jogl和Android实现。根据您运行的平台,您可以使用工厂模式在运行时选择正确的实现。
由于OpenGL ES和OpenGL非常相似,只要您坚持使用公共函数,就不需要太高的维护工作量。
另一种选择是尝试使用具有配置文件支持的Jogl2。它们似乎正好提供了您需要的功能,但Jogl2仍处于测试版。
本页底部讨论了一下配置文件: http://kenai.com/projects/jogl/pages/FAQ
配置文件允许Java应用程序以一种允许与多个OpenGL版本同时兼容的方式编写。由于OpenGL ES(用于嵌入式系统的GL)具有与OpenGL本身重叠的功能,因此它开放了向桌面和嵌入式实现添加甚至桥接配置文件的机会。
您可能需要阅读此http://michael-bien.com/mbien/entry/jogl_2_opengl_profiles_explained了解有关配置文件的详细信息。
这个项目已经完成。虽然API有所不同,但功能上有共同的部分。我们最终编写了一个简单的预处理器,将JOGL代码转换为ES版本,并使用Eclipse自动化转换。
几年前,JOGL-ES已经合并到了JOGL 2.x中,现在您可以在桌面和移动环境(Android)中使用JOGL。
Java3D和Android OpenGL API之间实际上有相当大的区别。首先,Java3D是对3D的更高级抽象。即使您使用类似JOGL的东西,API也会有一些差异。您最好将代码库中的实际3D绘图实现抽象出来,可以共享其余逻辑,但然后具有处理OpenGL / 3D绘图的平台特定代码。