2am*_*2am 3 c++ android opengl-es android-ndk
所以这里是交易。我在 Windows [Win32] 上使用 OpenGL API 已经大约 3 年了。我在同一个中编写了多个着色器。
现在我想将我的项目移植到Android 上。我的问题是,如果我想使用 C++ [NDK] 编写项目,并使用 OpenGL ES 是否可以?
我得到的简短回答是“是”,但是,这是正确的方法吗?我使用 Java 会更好吗?因为我正在使用 NDK,所以性能是否会下降,因为我的目标是基于 VR 的 OpenGL 应用程序性能是主要因素?
是的,这是多个问题,但它们指出了类似的问题,即在现实项目中使用 NDK 是否实用。
您的应用程序有多少是用 C++ 编写的,有多少是用 Java 编写的,这取决于您。每个 JNI 调用都有相关的开销,因此在决定如何拆分 Java 和本机代码时,您可能需要记住这一点(例如,用 C++ 编写整个渲染循环将每帧只产生一次 JNI 调用,而编写通过 Java 包装器调用 OpenGL API 的渲染循环可能会导致每帧数千次 JNI 调用)。什么可能被认为是“正确的”取决于您的具体要求。
至少,您需要获取 a Surface(从SurfaceHoldera 提供的SurfaceView)或 a SurfaceTexture(从 a 获取TextureView)并通过 JNI 将其传递到您的本机应用程序,您可以在其中使用ANativeWindow_fromSurface或ANativeWindow_fromSurfaceTexture(请参阅此处)来获取本机窗口,您可以使用它创建 OpenGL ES 表面和上下文。您可能希望将 JNI 调用封装在侦听SurfaceHolder或SurfaceTexture回调的 Java 类中。例如:
public class GlSurfaceHolder {
private SurfaceHolder mSurfaceHolder;
private SurfaceHolder.Callback mSurfaceHolderCallback;
public GlSurfaceHolder(SurfaceHolder surfaceHolder) {
mSurfaceHolder = surfaceHolder;
mSurfaceHolderCallback = new SurfaceHolder.Callback() {
// JNI calls in here
}
mSurfaceHolder.addCallback(mSurfaceHolderCallback);
}
};
Run Code Online (Sandbox Code Playgroud)
如果您不需要这种级别的控制,您可以考虑使用GLSurfaceView,它SurfaceView管理自己的 OpenGL ES 表面、上下文和渲染循环。其缺点GLSurfaceView是它不必要地耦合了一大堆表面上不相关的事物。从单一职责原则的角度来看,解耦这些函数不仅更加整洁,而且还允许您在单独的线程中执行渲染(这当然需要与 UI 线程同步,但可能具有性能优势)。
如果您甚至不关心任何运行 Java 端的应用程序,则可以使用NativeActivity便利类,它将前面提到的所有功能以及其他一些内容捆绑到 Android Activity 中。这是快速而肮脏的选择。
| 归档时间: |
|
| 查看次数: |
1754 次 |
| 最近记录: |