【问题标题】:Android - How to know maximal size/dimensions of the image that the device can loadAndroid - 如何知道设备可以加载的图像的最大尺寸/尺寸
【发布时间】:2014-10-25 10:11:51
【问题描述】:

我的问题可能不是很正确,但让我详细描述一下。我使用 cocos2d-x(使用 opengl-es 2 渲染)游戏引擎在 Android 设备上显示图像。在某些情况下,当图像尺寸非常大时,图像不会被显示。他们只是被跳过。但我看到图像的大小小于我的设备 VRAM 的大小。使用/dev/graphics/fb0:How to measure VRAM consumption on Android? 使用此方法进行检查。所以我的文件大小是532,042 bytes,它的尺寸是2160x1224,我的vram大小是3072000 bytes。为什么设备不处理此图像?标准和限制是什么?如何查看设备的限制?

【问题讨论】:

标签: android opengl opengl-es cocos2d-x


【解决方案1】:

为什么设备不处理此图像?

因为可以在 RAM 中放置多少与可以处理的单个数据块的最大大小之间存在差异。每个 GPU 对它可以处理的图像的最大尺寸都有一定的限制。 RAM 的大小只是告诉您,那里可以容纳多少张图像。 然而 OpenGL 的内存模型是纯粹抽象的,VRAM 的数量并不能告诉您可以加载多少纹理。数据可以并且将在需要时换入和换出 VRAM。实际限制实际上是整个系统可用的内存量。

我不能告诉你 Cocos2D,但在 OpenGL 和 OpenGL-ES 中,你可以使用 glGetInteger OpenGL-ES glGetInteger reference 查询各种纹理类型支持的最大尺寸。在您的情况下,您可能对值GL_MAX_TEXTURE_SIZE 感兴趣。 请注意,对于 GL_TEXTURE_1D 和 GL_TEXTURE_2D 以外的纹理目标,必须查询不同的值。

【讨论】:

  • 这完全正确。我刚刚从您的回答中独立地发现 GL_MAX_TEXTURE_SIZE 是限制,我的设备有 2048,因此没有处理 2160x1224。但是现在我不明白这个约束来自哪里?它是纯粹的 opne-gl 约束吗?为什么会有这样的限制?
  • @Narek:因为 GPU 根本无法处理更多。这是一个实现限制(其他实现可能有完全不同的限制),在大多数情况下,限制是由硬件的能力强加的。您设备中的 GPU 根本无法处理更多。
  • 这是硬件限制 (GPU)。某些 GPU 只能处理高达 1024x1024 的纹理。大多数支持高达 2048x2048。高端(即 iPad 2 及更高版本)可以做到 4096x4096。所有 GPU 都是如此,不仅是移动设备,还包括控制台和台式电脑。
  • 伙计们,但据我所知,GPU 的处理能力应该与 VRAM 大小一样多,不是吗?
  • @Narek:不。VRAM 基本上是 GPU 的缓存。但是应用纹理涉及一种特殊的数据处理,它由特殊硬件(纹理提取和插值单元 TFIU)实现,它(即使在可编程 GPU 上)是当前 GPU 设计中的硬连线硅片。 GPU 的这个特殊部分的设计和实现固有地限制了纹理单元可以处理的纹理中的像素数量。如果 TFIU 的设计在一维上限制为 2048 像素,那么就是这样。没办法。
猜你喜欢
  • 1970-01-01
  • 2011-10-14
  • 2014-03-07
  • 2015-05-21
  • 1970-01-01
  • 2012-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多