为什么我的 opengl 输出对于不同的设备不同?

2024-03-08

我创建了一个 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(使用前将#替换为@)

为什么我的 opengl 输出对于不同的设备不同? 的相关文章

  • 如何获取之前的碎片?

    为了在我的应用程序中重用某些片段 我需要知道哪个片段是返回堆栈上的第二个片段 为了做到这一点 我正在使用getFragmentManager getFragments 显示以下错误 但有效 FragmentManager getFragme
  • 在android中通过BLE传输图像

    我使用以下代码传输 1 MB 的图像 如果在每个数据包之间实现线程延迟 则图像将成功传输 如果未设置线程延迟 则所有数据包均从BluetoothGattServer 发送 但BluetoothGattCallback 不会接收所有数据包 任
  • Manifest Merger工具:替换失败

    我正在使用一个使用自己的 android theme 的库 因此在构建时收到以下错误 错误 55 9 任务 contacit processDebugManifest 执行失败 清单合并失败 AndroidManifest xml 中的属性
  • 通过 WhatsApp 发送消息

    由于我发现了一些较旧的帖子 表明 Whatsapp 不支持此功能 我想知道是否发生了变化 以及是否有办法打开与我通过意图发送的号码进行 Whatsapp 聊天 UPDATE请参阅https faq whatsapp com en andro
  • 如何使用Android opencv使图像的白色部分透明

    我无法链接超过 2 个网址 因此我将我的照片发布到此博客 请在这里查看我的问题 http blog naver com mail1001 220650041897 http blog naver com mail1001 220650041
  • Android 如何更改 OnTouchListener 上的按钮背景

    你好 我在 xml 中有一个按钮 我正在使用OnTouchListener在我的活动中获得button按下并释放 但问题是 当我按下按钮时背景颜色没有改变 当我延长可能的活动时OnClickListener背景正在改变 任何人都可以告诉我的
  • ffmpeg视频已压缩但无法在浏览器中播放

    我已经集成了ffmpeg4android lib 视频压缩工作正常 但视频无法在除 safari 浏览器之外的浏览器中播放 上传到服务器后 我使用了以下命令 ffmpeg y i
  • 播放 SoundCloud 曲目

    我可以在 Android 应用程序中播放 SoundCloud 中的曲目吗 我正在尝试这段代码 但它不起作用 String res https api soundcloud com tracks 84973999 stream client
  • 从 React Native Js 代码调用 Android Native UI 组件方法

    我创建了一个 CustomView SignatureView java 它扩展了 LinearLayout 以捕获 Android Native 中的签名 并创建了SignatureCapturePackage java和Signatur
  • 如何为发布而不是调试创建密钥库?扑

    我按照使用此网站部署 flutter 的步骤进行操作https flutter io android release https flutter io android release 当我运行 flutter build apk 时出现此错
  • android EditText 输入类型用于 StreetNumber 字段

    我试图在地址对话框的 streetNumber 字段中选择正确的 inputType 我想先显示数字键盘 然后让用户输入字母字符 对于一些非常特殊的情况 更接近这个的是 inputType datetime 但这不允许输入字母字符 那么如何
  • AudioTrack、SoundPool 或 MediaPlayer,我应该使用哪个?

    如果我需要能够 播放多个音频文件 具有不同的持续时间 例如 5 到 30 秒 独立设置右 左声道的音量 应用声音效果 如混响 失真 那么 我应该使用哪个 API 另外 我在 AudioTrack API 上找不到太多文档 有谁知道在哪里可以
  • Android FragmentTransaction 自定义动画(未知动画师名称:Translate)

    我正在尝试让自定义动画与我的片段一起使用 我已按照在线教程进行操作 但出现以下错误 java lang RuntimeException 未知的动画师名称 翻译 动画的 XML 如下
  • Android:滚动 Horizo​​ntalScrollView 时如何禁用 ScrollView 的垂直滚动?

    我正在开发一个带有带有 ScrollView 的 Activity 的 Android 应用程序 其中包含 Horizo ntalScrollView 等内容 当我触摸 Horizo ntalScrollView 时 我想禁用外部 Scro
  • 在 React Native 中调试应用程序崩溃

    我是 React Native 新手 我正在尝试安装 React Native Facebook SDK 以便我可以使用我的应用程序进行 Facebook 登录 我按照此处列出的步骤操作 https tylermcginnis com in
  • 有关 ListView 自定义行布局项目上的 onClick() 事件的帮助

    我有一个 ListView 其行由我格式化 每行都有 ImageView 和 TextView 的混合 我还实现了自己的适配器 并且能够通过它绘制每一行 现在 我想要这样的东西 用户单击 ImageView 不是行上的其他任何位置 但只有此
  • java.lang.NumberFormatException: Invalid int: "3546504756",这个错误是什么意思?

    我正在创建一个 Android 应用程序 并且正在从文本文件中读取一些坐标 我在用着Integer parseInt xCoordinateStringFromFile 将 X 坐标转换为整数 Y 坐标的转换方法相同 当我运行该应用程序时
  • Android:RecyclerView 不显示片段中的列表项

    有人可以帮我尝试让我的 RecyclerView 出现吗 如果我不在片段中实现它 就会出现这种情况 然而 当我尝试将其实现到片段中时 CarFront 中的其他 XML 代码与 RecyclerView 分开显示 我的日志中收到此错误 E
  • 使用单选按钮更改背景颜色 Android

    我试图通过从单选组中选择单选按钮来更改应用程序选项卡的背景 但是我不确定如何执行此操作 到目前为止我已经 收藏夹 java import android app Activity import android os Bundle publi
  • Android 中带有组的列表视图

    我有一个列表视图 每行都有一些日期和文本 我可以像 iPhone 中那样将这个 listView 分组 组之间有标题吗 在 android 中是否可能 请帮忙 即 我需要在 Listview 行之间有标题栏 以便如果我使用日期对其进行分组

随机推荐