我一直在为我正在尝试构建的游戏开发一个简单的基于图块的地形生成系统,但遇到了一些障碍。我正在尝试开发一种新方法来选择和存储单个图块所需的位图。我有一个非常简单的方法,在我运行世界绘图之前,所有位图都已加载,并且位图是根据它是哪种类型的图块来选择的。
不幸的是,当我在瓷砖和世界类型上添加变化时,选择过程可能会变得相当复杂。因此,将数据存储在 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”是我认为导致我的问题的原因,因为它为每个草瓦加载一个新的位图,而不仅仅是指向一个预加载的位图。