草庐IT

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

coder 2023-09-29 原文

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

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

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

但是,很快我发现 GPU 内存也有接近的限制(看起来)。我只能在 Sony XPeria Z5 上保存 1024x1024x50 近似数量的纹理。另一个 Sony XPeria 系列的 1024x1024x70 纹理。 1024x1024x90Huawei P8 等等。

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

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

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

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

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

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

最佳答案

我认为你关心的所有设备都有统一的内存,这意味着你不必担心 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 分配。如果您正在编写 native 代码(许多面向 iOS 和 Android 的应用程序的大部分代码都是用 C++ 编写的),那么它可能不会有太大区别。

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

安卓的话可以看here查看兼容性定义。例如,支持 Marshmallow 的非 watch 设备至少有 512MB。

您可以算出您的纹理需要多少内存,假设 32 位 8888 格式且没有 mipmap,每个纹理为 1024*1024*4bytes=4MB(如果这些假设有误,请更新问题!)。带有其中 50 个的 Sony XPeria Z5 的容量大约为 200MB。华为 P8 和 iPhone6+ 快死在 360MB。

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

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

编辑:此外,在调试器中运行会增加显着的内存开销,但我认为这无法解释那些 Android 设备上丢失的 GB。

关于android - 在 Android 和 iOS 设备上保存纹理的 GPU 内存限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43053983/

有关android - 在 Android 和 iOS 设备上保存纹理的 GPU 内存限制的更多相关文章

  1. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  2. ruby-on-rails - Ruby 检查日期时间是否为 iso8601 并保存 - 2

    我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby​​是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查

  3. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  4. ruby-on-rails - Ruby 中的内存模型 - 2

    ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序

  5. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  6. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  7. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  8. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  9. ruby-on-rails - 有没有一种工具可以在编码时自动保存对文件的增量更改? - 2

    我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功

  10. 键删除后 ruby​​ 哈希内存泄漏 - 2

    你好,我无法成功如何在散列中删除key后释放内存。当我从哈希中删除键时,内存不会释放,也不会在手动调用GC.start后释放。当从Hash中删除键并且这些对象在某处泄漏时,这是预期的行为还是GC不释放内存?如何在Ruby中删除Hash中的键并在内存中取消分配它?例子:irb(main):001:0>`ps-orss=-p#{Process.pid}`.to_i=>4748irb(main):002:0>a={}=>{}irb(main):003:0>1000000.times{|i|a[i]="test#{i}"}=>1000000irb(main):004:0>`ps-orss=-p

随机推荐