【问题标题】:Android OpenGL lag every x frameAndroid OpenGL 滞后每 x 帧
【发布时间】:2017-02-03 07:16:18
【问题描述】:

我是安卓游戏的开发者。

我创建了一个 GLSurfaceView 并在 OnDrawFrame(GL10 gl) 中绘制了一些东西 如下所示

    void OnDrawFrame(GL10 gl)
    {
         frame_limit_wait();
         game_logic();
         draw_game();
    }

一切都很好,但奇怪的是,绘制n帧时(发生在GC_EXPLICIT/paused 92ms)会导致游戏有点暂停,在应用程序中还可以,但在流畅的游戏中不是。

原来我是用SurfaceView和Thread更新的游戏,运行流畅。

如果在 draw_game() 下方添加一行,例如“system.gc()”,它似乎可以工作,但我感觉有点慢。 与其他游戏引擎相比,我的游戏结局运行缓慢。

如何解决延迟问题?

编辑:我已经解决了这个问题。 只需初始化一次原生 Float Buffer,然后使用 put 和 position(0) 修改 Buffer 内容。

【问题讨论】:

    标签: android opengl-es


    【解决方案1】:

    垃圾收集器正在运行并阻止您的框架。我建议仔细查看在函数 frame_limit_wait()、game_logic() 和 draw_game() 中执行的代码,并尽一切可能防止初始化新对象。

    最常见的技术包括:

    • 使用字段而不是局部变量
    • 使用 for(int i; i
    • 确保在绘制框架时没有进行额外的处理。

    如果这仍然不起作用,那么您可以尝试将一些处理卸载到单独的线程或考虑使用 NDK 并编写本机代码。使用 C++,您根本不必担心 GC。但是,这两种方法都会使您的代码相当复杂。

    【讨论】:

    【解决方案2】:

    尝试在单独的线程中运行您的 game_logic(),draw_game() 代码,以便当它在 frame_limit_wait() 中等待时,可以以更好的方式为 GC 提供服务。

    我的意思是尝试在单独的线程中运行渲染/更新代码,而不是使用主线程。

    【讨论】:

    • 其实说,我不关心GC,但我关心延迟,谢谢!
    • 我发现gc已经出现了旧的SurfaceView,但工作正常,没有滞后;当我更改为 GLSurfaceView 时,它在 GC 暂停时很有意义。
    猜你喜欢
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 2021-07-26
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多