【问题标题】:Library for unrestricted heap memory for bitmaps using NDK on Android [closed]在 Android 上使用 NDK 为位图提供无限制堆内存的库 [关闭]
【发布时间】:2013-08-05 03:59:30
【问题描述】:

根据设计,Android 应用程序可以使用的堆内存量非常有限。 SDK 应用程序的限制在旧设备上低至 16MB。这种设计选择通常是有意义的,因为操作系统试图在内存通常非常低的设备上支持多任务处理 - 所以每个任务都有自己的小部分。

内存限制因设备而异。以三星 Galaxy S2 为例,每个应用程序的大小在 32MB-64MB 之间。此设备具有 1GB 的 RAM,因此单个任务只能使用设备所能提供的大约 5%

值得一提的是,iOS 上的内存策略非常不同。据我所知,iOS 应用程序可以使用多少内存没有外部强制限制。您可以根据需要分配尽可能多的内存,直到系统内存不足。如果你太贪心,其他后台应用会被终止。

让我们解决这个问题 - 这不是讨论哪种内存策略更好。

Android 的内存限制对于某些 类型的应用来说是难以接受的。图形密集型应用程序(例如游戏)需要大量内存来保存位图。在默认限制下,即使是 Web 浏览器也应该很难实现。

resource optimization 不够用时,克服内存限制的标准策略是使用NDK。 Android 中的“本机”堆没有人为限制,其行为与 iOS 上的堆非常相似。使用“本机”堆来保存位图效果很好 - 这实际上是位图 在 Android 2.3.3 及更低版本上保存的方式(尽管 JVM 仍然人为地限制了它们)。

我正在寻找一个 NDK+JNI 库来在“本机”堆中保存无限位图。它的 Java 接口应该与股票位图 API 相同。我不知道有任何为此目的的公共项目,并感谢您帮助找到一个。如果您以前实现过此功能并愿意分享您的代码,我们也将不胜感激。

最终评论:请不要讨论将这样的图书馆向公众开放的道德性。

【问题讨论】:

  • 它的Java接口怎么能和股票位图API一样呢?
  • 当然,它会在自己的新包中,但会提供类似于 Bitmap 和 BitmapFactory 的类,它们的方法与原始类几乎相同。只是为了让界面相似以便于过渡

标签: android memory-management bitmap android-ndk static-libraries


【解决方案1】:

最近 2GB 设备的堆限制约为 192MB。需要大量内存的应用(例如图像编辑器)可以在应用清单中包含 android:largeHeap=true 以将内存增加到更高的限制(目前约为 512MB)。

绕过限制通常是个坏主意。它根据物理内存量、显示大小以及设备在运行大量应用程序时的性能在每台设备上进行校准。请记住,在 Android 上,您的应用程序并不是唯一存在的,并且并非所有物理内存都专门为应用程序保留(很大一部分用于内核,用于多帧图形和视频内容的缓冲区,等等) .

你的应用越大,它被杀死的可能性就越大。内核会非常努力地不杀死前台应用程序,这意味着您将开始挤出后台进程 - 或者导致它们进行如此多的分页和重新启动,从而开始影响您的游戏性能。

说了这么多,我想你正在寻找this

【讨论】:

  • 我喜欢你提供的链接!这是 10 天前发布的新问题+答案。这不是我想要的,因为它主要用于保存和恢复位图(我想直接从本机内存中绘制我的位图)。但是那里的 JNI 代码可以用作我正在尝试做的事情的基础。谢谢!
  • 关于您答案的第一部分,大多数内存问题实际上发生在较旧的设备(Android 2.x)上。这些设备的限制接近 16MB-32MB,这是我计划的主要地方要使用的库。 android:largeHeap 对于这些设备来说也太新了。如果我有 100MB 的堆,我不会有任何问题 :)
猜你喜欢
  • 1970-01-01
  • 2019-10-27
  • 2011-10-01
  • 2011-03-05
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 1970-01-01
相关资源
最近更新 更多