【问题标题】:Android, openGL lag in jni when touching screenAndroid,触摸屏时jni中的openGL滞后
【发布时间】:2011-07-11 09:06:59
【问题描述】:

我目前正在 Android 平台上测试我的游戏所需的所有功能。我只修改了 hello-gl2 示例代码,并在两个渲染通道中添加了一些纹理、VBO、FBO 和简单着色器。

问题是,当我让应用程序在不触摸屏幕的情况下运行时,我的速度约为 35-45 fps。但是如果我开始连续触摸屏幕,渲染就会开始滞后!那么这是一个问题,因为输入和渲染在同一个线程中(正如 a 认为的那样?),甚至可以修复吗?如果我不能解决这个延迟问题,我的游戏可能无法运行得足够好,无法正常玩。 (是有一些重渲染的东西)

//提前致谢!

【问题讨论】:

    标签: android java-native-interface opengl-es-2.0 android-ndk lag


    【解决方案1】:

    我对 android 开发相当陌生,但发现触摸处理程序也非常滞后。默认示例是新建一个对象并经常这样做——这势必会让垃圾收集器生气。通过调用'Thread.sleep(10);',我设法让它以一种不那么滞后的方式执行。在运行函数内部。

    我想用对象的循环缓冲区替换“new Runnable”会提高性能,但我还没有对此进行调查。我的触摸事件似乎发生在单独的线程上,这可能会导致并发症。

    Override public boolean onTouchEvent(final MotionEvent event)
        {
            queueEvent(
    
    
            new Runnable()
            {
                public void run()
                {
    
                    int action = event.getAction();
                    //do your handling here
                    try
                    {
                        Thread.sleep(10);
                    } catch (InterruptedException e)
                    {
    
                        e.printStackTrace();
                    } 
    
                }
            });
            return true;
        }
    

    【讨论】:

    • 啊,我看到你提到了 Jni。抱歉,此答案仅适用于 Java 代码。我还没试过用 Jni 做一个完整的游戏循环。
    • 好吧,根据我的阅读,除非您使用 android 2.3,否则您无法在 jni 中进行完整的游戏循环,我使用的是 2.0,但我并没有尝试完成整个游戏在c。我只调用了一个 jni 函数来模拟游戏并用 c 代码渲染所有内容。然后我返回到正常的 android java 代码。我计划在 java 中获取输入并通过 jni 调用发送它,并在 jni 中完成我的整个游戏。所以我基本上需要知道的是如何在考虑到表演的情况下解决这个问题。
    • 你的方法听起来和我的相似;我有一些用于缓冲区处理例程的 jni 代码,但其余的目前在 Java 中。你有没有试过在那里放一点延迟?它可能会阻止您的游戏被触摸消息淹没。
    • 当我调用 sleep 时,我的渲染停止。所以显然 hello-gl2 示例没有在单独的线程中呈现。我查看了一些假设在不同线程中运行的其他代码示例,但它们都不是完整的代码,我无法理解如何让渲染器在它自己的线程中运行...... gaah!任何治疗将不胜感激”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-06
    相关资源
    最近更新 更多