Android 需要减少加载的位图数量(静态位图引用?)

Android 需要减少加载的位图数量(静态位图引用?),android,out-of-memory,stack-overflow,terrain,Android,Out Of Memory,Stack Overflow,Terrain,我一直在为一个游戏开发一个简单的基于瓷砖的地形生成系统,我正在尝试构建一个游戏,但遇到了一些障碍。我正在尝试开发一种新的方法来拾取和存储我需要的位图,以用于各个瓷砖。我有一个非常简单的方法,在运行world绘图之前加载所有位图,并根据它是哪种类型的平铺选择位图 不幸的是,选择过程可能会变得相当复杂,因为我添加了瓷砖和世界类型的变体。因此,在tile对象中存储该数据以及确定它将是哪个tile所需的所有规则似乎是一个好主意 我遇到的问题是,此方法导致我为每个磁贴加载位图的副本,而不仅仅是加载指向位图

我一直在为一个游戏开发一个简单的基于瓷砖的地形生成系统,我正在尝试构建一个游戏,但遇到了一些障碍。我正在尝试开发一种新的方法来拾取和存储我需要的位图,以用于各个瓷砖。我有一个非常简单的方法,在运行world绘图之前加载所有位图,并根据它是哪种类型的平铺选择位图

不幸的是,选择过程可能会变得相当复杂,因为我添加了瓷砖和世界类型的变体。因此,在tile对象中存储该数据以及确定它将是哪个tile所需的所有规则似乎是一个好主意

我遇到的问题是,此方法导致我为每个磁贴加载位图的副本,而不仅仅是加载指向位图的指针。这反过来又消耗了我的内存,导致我的GC有点失控

我要寻找的是一种简单的方法,创建指向将要使用的不同位图的静态指针,然后在平铺对象中引用这些指针,而不是加载位图的新副本。我遇到的问题是,如果没有对上下文的引用,我就无法加载位图,而且我也不知道如何在静态方法中引用上下文

有人对如何解决这个问题有什么想法吗

这是我的tile类,以及tile类型类的一个示例,它们几乎都是相同的

瓷砖: 包com.psstudio.hub.gen

import java.io.Serializable;

import android.graphics.Bitmap;

public class Tile implements Serializable
{
/****
 * Create a BitmaHolder class that uses a case for which field type it isn, and then 
 * loads all applicable bitmaps into objects.  The individuak tile types then reference
 * those objects and return bitmaps, which are ultimately stored in this super class.
 */
double elevation = 0.0;     //tile's elevation

int type = 0;       //tile's type
int health = 0;     //tile's health - used for harvestable tiles (trees, stone, mountain, etc.)
Bitmap bitmap;          //pointer to the bitmap

public void setTile(Bitmap _bitmap, double _elev, int _type){
    bitmap = _bitmap;
    elevation = _elev;
    type = _type;
}
public void setBreakableTile(Bitmap _bitmap, double _elev, int _type, int _health){
    bitmap = _bitmap;
    elevation = _elev;
    type = _type;
    health = _health;
}

}
瓦型草:

package com.psstudio.hub.gen.tiles;

import java.util.Random;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

import com.psstudio.hub.R;
import com.psstudio.hub.gen.Tile;

public class Grass extends Tile {
Bitmap holder;
BitmapFactory.Options bFOptions = new BitmapFactory.Options();  //used to prevent bitmap scaling

Random r = new Random();

public Grass(Context context, int mapType, Double elevation){
    super.setTile(pickBitmap(context, mapType), elevation, 4);
    pickBitmap(context, mapType);

}

public Bitmap pickBitmap(Context context, int mapType){
    bFOptions.inScaled = false;

    switch(mapType){        
    case 1:                 //Forest Type 1
        holder = BitmapFactory.decodeResource(context.getResources(), R.drawable.grass, bFOptions);
        break;
    }

    return holder;
}
}

holder=BitmapFactory是我认为导致我的问题的原因,因为它正在为每个草瓷砖加载一个新位图,而不仅仅是指向一个预加载的位图。

好的,我设法找到了一种方法来做我需要的事情。我不知道这是否是最合适的方式,但它能满足我的需要

我创建了一个BitmapLoader类,该类根据世界类型加载图像,然后将它们存储到静态位图中,然后由分幅引用


这不是最优雅的解决方案,但它完成了任务^^

我可以问一下如何从loader类引用这些位图吗?我已经做了一个没有这样一个加载器的游戏,但是它会消耗内存。我还在使用位图持有者类开发另一个类,但我很好奇您发现什么最有效;每次drawBitmaploader.firstStaticBmp时调用的公共静态位图,还是在surfaceview位图bmp=loader.firstBmp中创建bmp,还是使用弱引用?@MacD我使用的方法可能不是一个好方法,但我创建了一个类:BitmapLoader,并在其中添加了“静态BitmapLoader”。当我创建BitmapLoader的新实例时,我加载给定字段的分幅,然后设置“loader=this”,然后在游戏中的任何位置都可以执行:“bitmap=BitmapLoader.loaded.loadedBitmap”,其中loadedBitmap是存储我要查找的位图的公共变量。就像我说的,我不确定这是一个多么好的主意,但它为我所尝试的工作。希望有帮助,抱歉花了这么长时间,我刚看到关于你的帖子的通知。