드로어 블을 많이 사용하는 게임을 개발 중입니다. "드로어 블"카탈로그에는 10MB 이상의 메모리 (약 900 개의 드로어 블)가 있습니다. 각 게임 레벨의 시작에서 드로어 블 어레이를 필요한 드로어 블 만로드하고 있습니다. 그리면 드로잉 할 때 특정 드로어 블을 참조합니다. 이것은 약 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 배열에 바로 지금 로딩 드로어 블에 저를 방지합니다.
제 질문은 많은 드로어 블을 처리하는 올바른 방법은 무엇입니까? 내 문제는 내 코드의 문제가 아니며 오히려 많은 drawable을 처리 할 수있는 더 나은 방법을 찾고 싶습니다.
설명을 위해. 각 레벨의 시작 부분에 900 개의 그리기 가능 객체를 생성하고 배열에 저장합니다. 그런 다음 어레이의 드로어 블 객체를 그린 다음 화면에 그리는 데 필요한 논리를 결정합니다. 몇 밀리 초마다 화면을 다시 그려주는 루프를 사용하고 있습니까? 어떤 액션이 실행될 때만 다시 그려지 는가? '코드 스 니펫을 제공 할 수 있습니까? ' – Grambot