gpt4 book ai didi

java - 摩托罗拉手机上的 J2ME 应用程序中的图像加载问题

转载 作者:行者123 更新时间:2023-11-30 07:39:38 27 4
gpt4 key购买 nike

在 J2ME 应用程序中加载图像的标准方法是使用 Image.createImage 方法,推荐的图像格式是 PNG。

现在,J2ME 规范并未对该方法的实现或图像的内存表示形式作出任何限制,因此每个供应商都有不同的实现。

尤其是摩托罗拉有这个非常糟糕的实现,其中 PNG 在图像创建时被完全解码为 ARGB 字节数组。这意味着尺寸为 176x208 的 8K png 加载时占用的峰值内存约为 170K,而 Image 对象本身使用的内存约为 145K!在诺基亚、索尼爱立信等其他手机上,相同的图像只需要大约 16K 就可以加载和存储在内存中。我不知道他们使用了什么智能优化,但出于某些不可理解的原因,摩托罗拉的 JVM 没有。

这对我的 J2ME 应用程序造成了严重破坏,几乎不可能在摩托罗拉手机上运行一个像样的版本。我尝试了各种解决方法,例如使用图像的 gzip 压缩 ARGB 字节数组并在绘制期间将其放气,但这会导致绘制速度减慢 10 倍!

有人知道这个问题的解决方法吗?具有摩托罗拉所缺乏的智能的 J2ME 开源 PNG 图像解码器?或者是否可以对 PNG 图像做一些事情来减少它的内存占用? (我目前使用的是索引模式 PNG)欢迎任何指点......

高里

最佳答案

关于索尼爱立信的一件事。不要给他们太多的信任。它们在加载图像时也会占用 (image_width x image_height x bytes_per_pixel) 内存。

来自 SE J2ME 开发人员文档,“所有图像都以每像素 16 位 RGB 格式存储在手机内存中,可能具有每像素 1 位或 8 位 alpha channel 。 "所以,至少 2 个字节。不同之处在于索尼爱立信手机(我不能代表诺基亚)有一个单独的图像内存块,在将图像加载到堆中之前首先填充图像(您可以通过使用 Runtime.getRuntime().freeMemory 包装负载来看到这一点()...堆大小只会增加几个字节,这是新对象的大小)。

这并不是在为摩托罗拉辩护,因为我确实在从 SE 手机移植到摩托罗拉手机时遇到了麻烦,但这并不是因为 SE 能够找到一种以更优化的方式在堆中存储图像的方法。摩托罗拉只是将所有内容都存储在堆中,这就是您用完速度更快的原因。

较小的图像是一个好主意,不仅在解码器部分,而且从堆碎片的角度来看。它将允许图像适合较小的内存块而不是较大的连续 block 。

关于java - 摩托罗拉手机上的 J2ME 应用程序中的图像加载问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/265213/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com