2011-12-07 6 views
4

드로어 블을 많이 사용하는 게임을 개발 중입니다. "드로어 블"카탈로그에는 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을 처리 할 수있는 더 나은 방법을 찾고 싶습니다.

+4

설명을 위해. 각 레벨의 시작 부분에 900 개의 그리기 가능 객체를 생성하고 배열에 저장합니다. 그런 다음 어레이의 드로어 블 객체를 그린 다음 화면에 그리는 데 필요한 논리를 결정합니다. 몇 밀리 초마다 화면을 다시 그려주는 루프를 사용하고 있습니까? 어떤 액션이 실행될 때만 다시 그려지 는가? '코드 스 니펫을 제공 할 수 있습니까? ' – Grambot

답변

0

비트 맵 팩터 리를 사용하여 비트 맵을로드 할 수 있습니까?

그렇다면,

당신이 (계정 BitMap.recycle 고려하십시오);

또한 모든 휴대 전화에 이러한 이미지의 메모리를 할당 할 수있는 충분한 VM 예산이 있는지 확인하십시오.

bitmapfactory를 사용하고 있지 않다면 kk입니다.

관련 문제