用于在Android和Android上保存纹理的GPU内存限制iOS设备

时间:2017-03-27 18:34:21

标签: android ios opengl-es gpu

我正在创建一个基于Open GL ES 3.0的Android应用,它必须适应各种设备。

由于我的应用程序中存在某些要求,我必须在我的应用程序运行时在RAM上保留大量图像数据。由于Android手机对每个应用CPU内存使用量有限制或heap memory size限制,我决定在我的应用程序运行时将所需的图像数据保留为GPU内存上的纹理。

我的纹理尺寸为1024x1024。保存纹理&在需要时再次显示它们对于它的实现部分都可以正常工作。

但是,很快我发现GPU内存也有关闭限制似乎)。我只能在 Sony XPeria Z5 上保存1024x1024x50近似纹理数量。另一个 Sony XPeria 系列上的1024x1024x70纹理。 华为P8 上的1024x1024x90,依此类推。

此外,我发现textures设备上的GPU memory / iOS也有限制。我无法在1024x1024x90 !!

上保存更多iPhone 6+纹理

这里的数字不准确但非常接近。我提出这个问题的目的是了解 Android设备上的应用程序允许多少GPU内存

GPU内存是否允许以某种方式与CPU内存相关的Android应用,因为此link here表示?

Android应用可以通过Manifest中声明的属性请求large heap。同样,我可以通过某种方式为我的应用程序申请更多GPU内存吗?

纹理真的存储在GPU内存上还是存储在CPU内存中?

iOS设备上与GPU内存限制相关的任何信息以及android都会有所帮助。

1 个答案:

答案 0 :(得分:2)

我认为您所关注的所有设备都具有统一内存,这意味着您不必担心GPU和CPU内存之间的区别。从您的角度来看,最好将其视为相同的RAM池。

  

Android应用可以通过Manifest中声明的属性请求大堆。同样,有什么方法可以为我的应用程序请求更多GPU内存吗?

大堆是指Java分配。如果您正在编写本机代码(许多针对iOS和Android的应用程序的大部分代码都是用C ++编写的)那么它可能没什么区别。

您可以看到不同的iOS设备有多少内存here

对于Android,您可以查看here以查看兼容性定义。例如,支持Marshmallow的非手表设备至少有512MB。

你可以计算你的纹理需要多少内存,假设32位8888格式没有mipmap,每个纹理是1024 * 1024 * 4bytes = 4MB(如果这些假设是错误的,请更新问题!)。其中50款索尼XPeria Z5的耗电量约为200MB。华为P8和iPhone6 +的死亡率为360MB。

您不应期望能够在智能手机上的所有RAM附近使用。有一个需要运行的操作系统和其他应用程序,并且没有像您在桌面操作系统上看到的基于存储的虚拟内存。根据经验,在操作系统关闭应用程序之前,您可以使用大约30%-50%的系统内存。绝对是iOS,而且我相信Android也会在你的内存使用率过高时发送你的应用警告。

关于iPhone6 +(1GB RAM,你可以使用360MB)的背后数学算法,但索尼XPeria Z5和华为P8都拥有巨大的3GB内存。 TBH,我不知道为什么你能用这么少的东西。

编辑:此外,在调试器中运行会增加显着的内存开销,但我觉得它不能解释这些Android设备上缺少的GB。

相关问题