【问题标题】:Hardware scaling the OpenGL surface with NativeActivity使用 NativeActivity 硬件缩放 OpenGL 表面
【发布时间】:2012-12-27 19:12:45
【问题描述】:

我们正在尝试在原生屏幕尺寸为 1080p 的设备上运行复杂的 OpenGL 应用。不幸的是,该设备的 3D 芯片组对于这种尺寸的帧速率来说还不够好。

我们更愿意以 720p(或更低)渲染,然后进行硬件加速放大以填满屏幕。

我知道 Android 可以自动处理 2D 内容(使用 ANativeWindow_lock() 和朋友)。有没有办法自动为 3D 内容执行此操作?

【问题讨论】:

  • 渲染到更小尺寸的 FBO - 然后将其内容渲染到全屏对你有用吗?
  • 是的,但如果可能的话,我真的很想避免这种情况 --- Android 上的屏幕外表面是一团糟:blog.vlad1.com/2010/07/01/… 它会爆炸成一百万种不同的难以测试的代码路径。因此,我渴望内置机制......
  • 我已经多次使用 FBO,但从未发现它们有任何问题。在任何情况下,它们都是以较小分辨率 AFAIK 渲染的唯一方法。使用 FBO 只会添加 FBO 创建代码 - 渲染到 FBO - 并且毕竟将 FBO 复制到屏幕缓冲区。不应该有太多的逻辑使得测试比没有 FBO 更难。
  • 我也建议使用 FBO。恕我直言,这将是您问题的最佳解决方案。一个技巧-以RGBA格式创建FBO-某些硬件显然不支持RGB FBO-带有Mali的galaxy s2。还要记住当应用程序进入后台时上下文丢失 - 当应用程序恢复时您必须重新创建 FBO。
  • 不幸的是,FBO 在这里不合适 --- 我不允许在应用程序的 GL 上下文中添加东西,而是必须创建一个新的;所以它必须是pbuffers。这就是为什么我想完全避免整个问题......关于失去上下文,你不会相信我们必须处理多少代码。有时它甚至可以工作。

标签: android opengl-es native-activity


【解决方案1】:

对于 GLSurfaceView,使用:

surfaceView = new GLSurfaceView(this);
surfaceView.getHolder().setFixedSize(1280, 720);

对于 NativeActivity,使用:

int32_t ret = ANativeWindow_setBuffersGeometry(window, 1280, 720, 0);

在以下博文中找到了这个:

Android Developers Blog - Using the Hardware Scaler for Performance and Efficiency

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多