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

我正在创建一个基于Open GL ES 3.0的 Android应用程序,它必须满足各种设备的需求.

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

我的纹理大小是1024×1024.保存纹理&在需要时再次显示它们对于它的实现部分一切正常.

但是,我很快就认为GPU内存也有接近限制(看起来如此).我在Sony XPeria Z5上只能保存1024x1024x50近似纹理数.另一款索尼XPeria系列的1024x1024x70纹理.华为P8上的1024x1024x90等.

此外,我发现iOS设备上的纹理/ GPU内存也有限制.我无法在iPhone 6上保存更多1024x1024x90纹理!

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

GPU内存是否允许以某种方式与CPU内存相关的Android应用程序,如此link here所示?

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

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

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

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

Android apps can request for large heap by a property declared in Manifest. Likewise, Is there some way I can request for more GPU memory for my app ?

大堆是指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%的系统RAM.绝对是iOS,而且我相信Android也会在内存使用率过高时发送应用警告.

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

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

点赞