【发布时间】:2011-12-07 22:07:30
【问题描述】:
我正在开发一个游戏,我在其中使用了很多可绘制对象。 “drawable”目录拥有超过 10MB 的内存(大约 900 个 drawable)。在每个游戏关卡开始时,我只加载必要的drawables 数组,所以当我绘制它们时,我只引用某些drawables。这将我的可绘制对象的数量减少到大约 300 个,但在某些情况下,甚至可以使用 900 个可绘制对象。即使当我阅读可绘制对象时,它们也会使用超过 40 - 50MB 的内存。我试图在游戏过程中加载它们,但这没用,因为游戏速度慢得令人难以置信。
好的。我忘了添加一些代码 :P 我的游戏是基于 LunarLancher 的,所以代码对你来说并不新鲜。
class GraphicView extends SurfaceView implements SurfaceHolder.Callback
{
class GraphicThread extends Thread
{
public GraphicThread(SurfaceHolder surfaceHolder, Context context, Handlerhandler )
{
...
LoadPixmap(context);
...
}
private void doDraw(Canvas canvas)
{
m_Pixmap[iIndex].setBounds( m_iX, m_iY, m_iX + WIDTH_I, m_iY + HEIGHT_I );
m_Pixmap[iIndex].draw( canvas );
}
}
private void LoadPixmap( Context context )
{
int iID = 0;
Resources res = context.getResources();
for( int iIndex=0; iIndex< m_Objects.size(); ++iIndex )
{
if ( IsPixmapNeeded(m_Objects[iIndex]) )
{
continue;
}
iID = res.getIdentifier("pixmap"+i, "drawable", "com.my.package");
if ( iID != 0 )
{
m_Pixmap[iIndex] = context.getResources().getDrawable(iID);
m_Pixmap[iIndex] = new ScaleDrawable( m_Pixmap[iIndex], 0, WIDTH_I, HEIGHT_I).getDrawable();
}
}
res = null;
context = null;
}
m_Pixmap[] = new Drawable[ FRAMES ];
}
这段代码只是我现在写的一个示例,但我的想法是一样的。
这个
LoadPixmap(context);
当我更新所有变量时也会调用该方法,因此我有机会添加/删除一些我需要使用的可绘制对象。
还有这部分代码
if ( IsPixmapNeeded(m_Objects[iIndex]) )
阻止我加载当前位于 m_Pixmap 数组中的可绘制对象。
我的问题是,处理大量可绘制对象的正确方法是什么?我的问题不是我的代码问题,我宁愿找到一些更好的方法来处理大量可绘制对象。
【问题讨论】:
-
所以,为了澄清。在每个关卡开始时,您会在一个数组中生成并存储超过 900 个可绘制对象。然后,您有某种逻辑来确定需要绘制该数组中的哪些可绘制对象,然后将它们绘制到屏幕上?您是否正在使用每隔几毫秒重新绘制一次屏幕的循环?它是否仅在执行某些操作时重绘?
Can you provide code snippets?