在 Android 和 iOS 设备上保存纹理的 GPU 内存限制
GPU memory limit for saving textures on Android & iOS devices
我正在创建一个基于 Open GL ES 3.0
的 Android 应用程序,它必须满足各种设备的需求。
由于我的应用程序中的某些要求,当我的应用程序处于 运行 时,我必须在 RAM 上保留大量图像数据。因为,android 手机对每个应用程序有限制 CPU 内存使用或 heap memory size
限制,我决定在我的应用程序运行时将我需要的图像数据作为纹理保留在 GPU 内存上。
我的纹理尺寸是1024x1024
。保存纹理并在需要时再次显示它们对于它的实现部分来说一切正常。
但是,我很快发现 GPU 内存也有 接近限制(看起来)。我只能在 Sony XPeria Z5 上保存大约 1024x1024x50
个纹理。 1024x1024x70
另一个 Sony XPeria 系列的纹理。 1024x1024x90
华为 P8 等等。
此外, 我发现 iOS
设备上的 textures
/GPU memory
也有限制。我无法在 iPhone 6+
!!
上保存更多的 1024x1024x90
纹理
这里的数字不准确,但非常接近。我 objective 提出这个问题是为了了解 在 android 设备 上允许应用程序使用多少 GPU 内存。
GPU 内存是否允许与 CPU 内存相关的 android 应用以某种方式 如此 link here 指示?
Android 应用程序可以通过在清单中声明的 属性 请求 large heap
。同样,有什么方法可以为我的应用请求更多 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 个的 Sony XPeria Z5 的容量大约为 200MB。华为 P8 和 iPhone6+ 在 360MB 时快要死了。
您不应该期望能够使用智能手机上接近所有 RAM 的任何地方。有一个 OS 和其他需要 运行 的应用程序,并且没有像您在桌面 OS 上看到的那样基于存储的虚拟内存。根据经验,在 OS 关闭您的应用程序之前,您可能会使用大约 30%-50% 的系统 RAM。 iOS 当然,我也相信 Android,当您的内存使用率过高时向您的应用发送警告。
粗略计算在 iPhone6+(1GB RAM,您可以使用 360MB)上大致正确,但索尼 XPeria Z5 和华为 P8 都有巨大的 3GB 内存内存。 TBH,我不知道为什么你能用这么少的东西。
编辑:此外,运行调试器中的 ning 会增加显着的内存开销,但我认为这无法解释那些 Android 设备上丢失的 GB。
我正在创建一个基于 Open GL ES 3.0
的 Android 应用程序,它必须满足各种设备的需求。
由于我的应用程序中的某些要求,当我的应用程序处于 运行 时,我必须在 RAM 上保留大量图像数据。因为,android 手机对每个应用程序有限制 CPU 内存使用或 heap memory size
限制,我决定在我的应用程序运行时将我需要的图像数据作为纹理保留在 GPU 内存上。
我的纹理尺寸是1024x1024
。保存纹理并在需要时再次显示它们对于它的实现部分来说一切正常。
但是,我很快发现 GPU 内存也有 接近限制(看起来)。我只能在 Sony XPeria Z5 上保存大约 1024x1024x50
个纹理。 1024x1024x70
另一个 Sony XPeria 系列的纹理。 1024x1024x90
华为 P8 等等。
此外, 我发现 iOS
设备上的 textures
/GPU memory
也有限制。我无法在 iPhone 6+
!!
1024x1024x90
纹理
这里的数字不准确,但非常接近。我 objective 提出这个问题是为了了解 在 android 设备 上允许应用程序使用多少 GPU 内存。
GPU 内存是否允许与 CPU 内存相关的 android 应用以某种方式 如此 link here 指示?
Android 应用程序可以通过在清单中声明的 属性 请求 large heap
。同样,有什么方法可以为我的应用请求更多 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 个的 Sony XPeria Z5 的容量大约为 200MB。华为 P8 和 iPhone6+ 在 360MB 时快要死了。
您不应该期望能够使用智能手机上接近所有 RAM 的任何地方。有一个 OS 和其他需要 运行 的应用程序,并且没有像您在桌面 OS 上看到的那样基于存储的虚拟内存。根据经验,在 OS 关闭您的应用程序之前,您可能会使用大约 30%-50% 的系统 RAM。 iOS 当然,我也相信 Android,当您的内存使用率过高时向您的应用发送警告。
粗略计算在 iPhone6+(1GB RAM,您可以使用 360MB)上大致正确,但索尼 XPeria Z5 和华为 P8 都有巨大的 3GB 内存内存。 TBH,我不知道为什么你能用这么少的东西。
编辑:此外,运行调试器中的 ning 会增加显着的内存开销,但我认为这无法解释那些 Android 设备上丢失的 GB。