在 J2ME 中加载图像?

Posted

技术标签:

【中文标题】在 J2ME 中加载图像?【英文标题】:Loading Images in J2ME? 【发布时间】:2009-05-28 09:09:35 【问题描述】:

我对 J2ME 上的概念并不陌生,但我有点懒惰,我不应该这样做: 最近我的应用程序一直在将图像加载到内存中,因为它们是糖果......

Sprite example = new Sprite(Image.createImage("/images/example.png"), w, h);

我不确定这是不是最好的方法,但它在我的摩托罗拉 Z6 上运行良好,直到昨晚,当我在旧三星手机上测试应用程序时,图像甚至无法加载,需要多次尝试启动要显示的线程。屏幕一直是白色的,所以我意识到它必须是关于图像加载的东西,我做得不太好......有没有人可以告诉我如何在我的应用程序中正确地制作加载程序?.

【问题讨论】:

您能否更清楚地了解您要从图像中实现的目标或其他内容 【参考方案1】:

我不确定您到底在寻找什么,但您所描述的行为听起来就像您遇到了 OutOfMemory 异常。尝试减少图像的尺寸(堆使用基于尺寸)并查看行为是否停止。这会让您知道它是否真的是 OutOfMemory 问题或其他问题。

其他提示:

    从最大到最小加载图像。这有助于堆碎片化,并为最大的图像提供最大的堆空间。 卸载(设置为空)按照您加载和垃圾收集的相反顺序执行此操作。确保在调用 GC 后使用 Thread.yield()。 确保只加载您需要的图像。从应用程序不再处于的状态中卸载图像。 由于您正在创建精灵,因此您可以为一张图像创建多个精灵。考虑创建一个图像池以确保您只加载一次图像。然后只需将每个 Sprite 对象指向它需要的池中的图像。您在问题中的示例似乎很可能多次将同一图像加载到内存中。这很浪费,可能是 OutOfMemory 问题的一部分。

【讨论】:

感谢福斯塔!真的很有帮助,图像池的东西,我以前用过,但在桌面游戏中使用 Java2D,所以再做一次不会有问题。我仍然需要稍微完善一下,我需要知道如何构建我的应用程序。最近我的应用程序是线程化的,我有两个画布,每个都实现了 Runnable,一个用于菜单,另一个用于游戏玩法,我这样做了吗? 我的 J2ME 游戏一直由 1 个画布和多个游戏状态组成。然后画布的 run() 具有更新循环。考虑到状态永远不会同时存在,确实不需要拥有多个 Canvas 实例。查看 Martin Wells 的 J2ME 游戏编程。这是一本很棒的书,对你很有用。【参考方案2】:

使用电影图像(一个图像中定义尺寸的一组图像)并使用逻辑一次将它们拉出。

因为它们被分组到一个图像中,您可以节省每个图像的标题空间,从而可以减少使用的内存。

这种技术首先用于 MIDP 1.0 内存受限设备。

【讨论】:

【参考方案3】:

使用不反复加载图像的Fostah方法,我制作了以下类:

public class ImageLoader 
    private static Hashtable pool = new Hashtable();

    public static Image getSprite(String source)
        if(pool.get(source) != null) return (Image) pool.get(source);
        try 
            Image temp = Image.createImage(source);
            pool.put(source, temp);
            return temp;
         catch (IOException e)
            System.err.println("Error al cargar la imagen en "+source+": "+e.getMessage());
        
        return null;
    

所以,每当我需要一张图片时,我都会先向池中请求它,或者直接将其加载到池中。

【讨论】:

以上是关于在 J2ME 中加载图像?的主要内容,如果未能解决你的问题,请参考以下文章

在 j2me 中加载屏幕

图像在 iframe 中加载后未从缓存中加载

在缓存中加载 Div 背景图像 [重复]

如何在haskell(光泽)中加载图像数组?

在 Picasso 图像加载器中加载位图图像会减慢列表视图中的滚动速度

如何等待在画布中加载图像