首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mt4j和Processing库:清理图像资源

mt4j和Processing库:清理图像资源
EN

Stack Overflow用户
提问于 2012-10-10 16:47:34
回答 5查看 906关注 0票数 4

我在一个相当大的项目中使用mt4j库,其中的场景是定期推送和弹出的;mt4j使用处理库来处理图像。

我们使用loadImage()方法加载图像,但我不知道在弹出场景时如何从内存中删除这些图像;我们实际上存在内存问题,因为在应用程序运行期间使用的内存会增加。

你有什么想法吗?

谢谢Jérémy

编辑:

我刚刚写了一个ImageManager类:

代码语言:javascript
复制
package managers;

import java.util.HashMap;
import java.util.Map;

import org.mt4j.MTApplication;

import processing.core.PImage;




public class ImageManager {

private static ImageManager mImageManager = null;

protected MTApplication mApp;
protected Map< String, PImage > mImages;

protected PImage mTempImg;

private ImageManager( MTApplication app ) {
    mApp = app;
    mImages = new HashMap< String, PImage >();
}

public static synchronized ImageManager getInstance( MTApplication app ) {
    if( mImageManager == null ) {
        mImageManager = new ImageManager( app );
    }

    return mImageManager;
}

/**
 * Load or retrieve img in memory
 * 
 * @param path Path to the image
 * @return <PImage> the image
 */
public PImage getImage( String path ) {
    // Search for image
    if( mImages.containsKey( path ) ) {
        System.out.println( "ImageManager::getImage : image found !" );
        mTempImg = mImages.get( path );
    } 
    else {
        System.out.println( "ImageManager::getImage : image not found, loading" );
        mTempImg = mApp.loadImage( path );
        mImages.put( path, mTempImg );
    }

    return mTempImg;
}
}

这就是我的问题:我认为它可以帮助我解决内存问题,但我仍然看到每次加载图像时内存都会增加。一个用法示例:

代码语言:javascript
复制
ImageManager imgManager = ImageManager.getInstance( (MTApplication) app );
            PImage image = imgManager.getImage( getPathToIcons() + imagesNames[i] );
            //PImage image = app.loadImage(getPathToIcons() + imagesNames[i]);
            mSceneImages.add( image );

有什么想法吗?谢谢

编辑2:事实上,这个方法工作得很好:)问题解决了!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-10-11 18:23:47

编辑:最后我试着一次删除图片,但是它不能清理内存...好像还有其他一些我找不到的参考文献...有没有办法确保清理内存?

我对这个问题的解决方案: ImageManager类

代码语言:javascript
复制
package managers;

import java.util.HashMap;
import java.util.Map;

import org.mt4j.MTApplication;

import processing.core.PImage;




public class ImageManager {

private static ImageManager mImageManager = null;

protected MTApplication mApp;
protected Map< String, PImage > mImages;

protected PImage mTempImg;

private ImageManager( MTApplication app ) {
    mApp = app;
    mImages = new HashMap< String, PImage >();
}

public static synchronized ImageManager getInstance( MTApplication app ) {
    if( mImageManager == null ) {
        mImageManager = new ImageManager( app );
    }

    return mImageManager;
}

/**
 * Load or retrieve img in memory
 * 
 * @param path Path to the image
 * @return <PImage> the image
 */
public PImage getImage( String path ) {
    // Search for image
    if( mImages.containsKey( path ) ) {
        System.out.println( "ImageManager::getImage : image found !" );
        mTempImg = mImages.get( path );
    } 
    else {
        System.out.println( "ImageManager::getImage : image not found, loading" );
        mTempImg = mApp.loadImage( path );
        mImages.put( path, mTempImg );
    }

    return mTempImg;
}
}
票数 0
EN

Stack Overflow用户

发布于 2012-10-11 01:01:39

或者只是重复使用它们?首先是image1 = loadImage(oneImage),然后是image1 = loadImage(anotherImage)?

票数 2
EN

Stack Overflow用户

发布于 2012-10-11 05:52:40

对于java中的内存泄漏,您可以查看packratting。除了运行,我还没有找到一个很好的处理解决方案

top -s 5

(在unix系统上)并监视内存使用情况,直到它挂起。我最近在一个datavis项目中工作,我在一个ArrayList中创建了可能数以千计的blitts (在我的例子中,是在opengl中使用的文本图像)。最初,我在每次加载数据时都在动态地重新创建这些数组,这导致了“内存泄漏”。

在我的例子中,我尝试清空对象引用,并专门调用垃圾收集器。我认为这可能与这样一个事实有关,即处理过程可能每秒调用您的void 60+ ()方法的次数,但它似乎从未释放过引用。

为了纠正这个问题,我只在setup方法()中加载了所有图像/创建了一次blits,并且仅在有新数据时才将新项附加到ArrayList。

在此之前,我只是在运行时重新创建整个ArrayList,因为它看起来足够快,但在长时间运行时出现了可怕的内存泄漏问题。

现在我只是被分配给这个引用,而不是每次都创建一个新的对象和ArrayList。它的效率要高得多,而且不会遇到同样的内存问题。

例如,如下所示(在循环中运行数千次):

代码语言:javascript
复制
tempImage = imageArrayList.get(i); // just assigns a reference, does not create a new object

而不是像这样:

代码语言:javascript
复制
tempImage = loadImage("image.jpg"); // this creates a new object every time it is called
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12815434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档