在 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 中加载图像?的主要内容,如果未能解决你的问题,请参考以下文章