【问题标题】:using NDK for Android to write OpenGL code使用 NDK for Android 编写 OpenGL 代码
【发布时间】:2017-04-03 07:03:17
【问题描述】:

所以这就是交易。 我已经在 Windows [Win32] 上使用 OpenGL API 大约 3 年了。 我在同一个中编写了多个着色器。

现在我想将我的项目移植到 Android 上。 我的问题是,如果我想使用 C++ [NDK] 编写项目,并使用 OpenGL ES,是否可以?

我得到的简短回答是“是”,但是,这是正确的方法吗? 我最好使用Java吗?是否有任何性能下降,因为我使用的是 NDK,因为我的目标是基于 VR 的 OpenGL 应用程序性能是主要因素?

是的,这是多个问题,但它们指向类似的问题,将 NDK 用于实际项目是否实用。

【问题讨论】:

    标签: android c++ opengl-es android-ndk


    【解决方案1】:

    这取决于您用 C++ 编写多少应用程序以及用 Java 编写多少应用程序。每个 JNI 调用都有相关的开销,因此在决定如何拆分 Java 和本机代码时可能需要牢记这一点(例如,在 C++ 中编写整个渲染循环将导致每帧只调用一个 JNI 调用,而编写你的通过 Java 包装器调用 OpenGL API 的渲染循环可能会导致每帧数千次 JNI 调用)。什么可能被视为“正确”取决于您的具体要求。

    至少,您需要获得Surface(来自SurfaceHolder,由SurfaceView 提供)或SurfaceTexture(从TextureView 获得)并通过JNI 到您的本机应用程序,您可以在其中使用ANativeWindow_fromSurfaceANativeWindow_fromSurfaceTexture(请参阅here)获得一个本机窗口,您可以使用它创建您的OpenGL ES 表面和上下文。您可能希望将 JNI 调用封装在侦听 SurfaceHolderSurfaceTexture 回调的 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);
        }
    };
    

    如果您不需要这种级别的控制,您可以考虑使用GLSurfaceView,这是一个SurfaceView,它管理自己的OpenGL ES 表面、上下文和渲染循环。 GLSurfaceView 的缺点是它不必要地耦合了一大堆表面上不相关的东西。从single responsibility principle 的角度来看,解耦这些函数不仅更简洁,它还允许您在单独的线程中执行渲染(这当然需要与 UI 线程同步,但可能具有性能优势)。

    如果您甚至不关心任何运行 Java 端的应用程序,您可以使用 NativeActivity 便利类,它将所有前面提到的功能以及其他一些东西捆绑到一个 Android 活动中。这是快速而肮脏的选择。

    【讨论】:

      【解决方案2】:

      简短的回答是肯定的,您可以将 NDK 用于实际项目。如果您使用 NativeActivity,您可以拥有一个完全没有 Java 代码的应用程序。许多游戏都是用 Unity 引擎构建的,并且所有的 OpenGL 都是用 C++ 完成的,没有性能问题。实际上,the opposite is true,但在现实生活中,Java-to-GL 包装器的性能损失非常低。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-25
        • 1970-01-01
        • 2012-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多