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



我正在创建一个基于Open GL ES 3.0的Android应用程序,该应用程序必须迎合各种设备。

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

我的纹理大小是1024x1024。保存纹理并在需要时再次显示它们对于它的实现部分来说都很好。

但是,很快我就发现GPU内存也有严格的限制(看起来)。我只能在索尼 XPeria Z5上保存大约1024x1024x50数量的纹理。1024x1024x70另一个索尼XPeria系列上的纹理。1024x1024x90华为P8等。

另外,我发现iOS设备上的textures/GPU memory也有限制。我无法在iPhone 6+上保存更多1024x1024x90纹理!

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

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

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

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

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

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

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

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

您可以在此处查看不同的iOS设备有多少内存。

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

您可以计算出纹理需要多少内存,假设 32 位 8888 格式且没有 mipmap,每个纹理为 1024*1024*4bytes=4MB(如果这些假设是错误的,请更新问题!索尼XPeria Z5拥有50个,大约200MB正在消亡。华为P8和iPhone6+正在以360MB的速度消亡。

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

粗略的数学计算在iPhone6 +上大致正确(1GB RAM,您可以使用360MB),但索尼XPeria Z5和华为P8都有巨大的3GB RAM。TBH,我不知道你为什么能用这么少的。

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

最新更新