我创建了一个 Android 应用程序,用于绘制直线、圆。通过在 OpenGLES 2.0 中使用 GLSurfaceView,就像 Auto cad 应用程序一样。
该应用程序与 Google Nexus 7 配合得很好,从某种意义上说,如果我们画一条线,然后画一个圆,则该线不会在表面视图中被擦除。但三星 Galaxy Note II 的情况就完全不同了。
在绘制圆之前绘制的线将被擦除。也就是说,每次我们绘制一条新的直线或圆时,前一个都会被删除。我一次只能绘制一张图像。我需要的是与 Samsung Galaxy Note II 中的 Google Nexus 7 中获得的输出相同的输出。即我想一次在 GLSurfaceView 中绘制多个图像。
笔记 :
Google Nexus 7 和三星 Galaxy Note II 中的 Android 操作系统均为 Jelly Bean 4.2。但这两种设备的 GPU 不同。 Google Nexus 7 GPU 是 ULP GeForce,三星 Galaxy Note II 是 Mali400MP。
这会是 Surfaceview 输出渲染的问题吗?
编码时我们应该考虑 GPU 吗?
谁能告诉我为什么不同设备中输出不同的问题?
编码时我们应该考虑 GPU 吗?没办法,OpenGL API 是应用程序和硬件之间的一层。
对于桌面图形来说,这在很大程度上是正确的,因为所有 GPU 都是直接渲染器,但是,在移动图形中情况并非如此。
Mali GPU 使用基于图块的即时模式渲染。
对于这种类型的渲染,帧缓冲区被划分为大小为 16 x 16 像素的图块。多边形列表生成器 (PLB) 将应用程序中的输入数据组织到多边形列表中。每个图块都有一个多边形列表。当图元覆盖图块的一部分时,称为多边形列表命令的条目被添加到图块的多边形列表中。
像素处理器获取一个图块的多边形列表,并在开始处理下一个图块之前计算该图块中所有像素的值。由于这种基于图块的方法使用快速的片上图块缓冲区,因此 GPU 仅将图块缓冲区内容写入每个图块末尾的主内存中的帧缓冲区。非基于平铺的即时模式渲染器通常需要更多的帧缓冲区访问。因此,基于图块的方法消耗更少的内存带宽,并有效地支持深度测试、混合和抗锯齿等操作。
另一个区别是渲染缓冲区的处理。立即渲染器将“保存”缓冲区的内容,有效地允许您仅在渲染场景中绘制先前存在的差异。然而,该功能在马里可用,但默认情况下并未启用,因为如果使用不当,可能会导致不良影响。
有一个 Mali GLES2 SDK 示例,介绍如何使用 GLES2 SDK 中正确提供的“EGL Preserve”here http://malideveloper.arm.com/develop-for-mali/sdks/opengl-es-2-sdk-for-android/
基于 Geforce ULP 的 Nexus 7 按预期工作的原因是,作为基于即时的渲染器,它默认保留缓冲区,而 Mali 则不然。
来自 Khronos EGL 规范:
EGL_SWAP_BEHAVIOR
指定使用eglSwapBuffers 发布表面的颜色缓冲区的效果。 EGL_BUFFER_PRESERVED 值表示颜色缓冲区内容不受影响,而 EGL_BUFFER_DESTROYED 表示颜色缓冲区内容可能会被操作破坏或更改。
*EGL_SWAP_BEHAVIOR 的初始值由实现选择。*
Mali 平台上 EGL_SWAP_BEHAVIOUR 的默认值为 EGL_BUFFER_DESTROYED。这是由于在渲染新帧之前必须从内存中获取先前的缓冲区并将其存储在最后以及带宽消耗(这对移动设备的电池寿命也非常不利)相关的性能影响。我无法对 Tegra SoC 的默认行为做出肯定的评论,但是,对我来说很明显它们的默认行为是 EGL_BUFFER_PRESERVED。
为了澄清 Mali 对于 Khronos GLES 规范的立场 - Mali 完全符合要求。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)