2010-08-04 2 views
3

저는 꽤 많은 시간 동안 수색을 해왔으며, 제 질문에 간결하고 확실한 답변을 찾을 수 없었습니다. 나는 스포츠 필드 (모든 피치 라인 포함)를 화면에 그릴 필요가있는 애플리케이션을 가지고있다. 지금까지 SurfaceView를 확장하고 LunarLander 데모의 나머지 부분도 복사했습니다. 올바른 치수로 피치를 그려야하는 모든 데이터가 소켓에서 제대로 수신되고 있습니다. 그러나 onDraw() 함수의 분당, 에뮬레이터에서 상당히 느린 프레임 속도 (예 : ~ 10fps)를 일으키는 각 프레임마다 모든 선을 그립니다. 여기에 내 onDraw() 함수가 있습니다 :안드로이드에서 2D 드로잉을 효율적으로 수행합니다.

@Override 
public void onDraw(Canvas canvas) { 
canvas.drawARGB(255,0,144,0); 
canvas.drawLine(canvas, getFirstLine(), mPaint); 
canvas.drawRect(canvas, getFirstRect(), mPaint); 
canvas.drawRect(canvas, getSecondRect(), mPaint); 
... 
canvas.drawRect(canvas, getSecondRect(), mPaint); 
drawAnimatedObjects(); 
} 

이 배경 위에 서클과 다른 위치를 그립니다. 내 질문은 어떻게하면 더 효율적으로 만들 수 있습니까? 응용 프로그램 초기화시 선을 그릴 수 있고 모든 프레임을 다시 그릴 필요가없는 방법이 있습니까?

도움 주셔서 감사합니다.

+0

OpenGL ES는 캔버스를 사용하는 것보다 효과적입니다. 당신이 그 길을 갈 수 있다면, 그만한 가치가 있습니다. API 데모 프로젝트에는 2D 드로잉 데모가 몇 가지 있습니다. –

+1

실제 기기에서 테스트 해 보셨습니까? 에뮬레이터 그래픽 성능은 실제 장치에서 볼 수있는 것을 대표하지 않습니다. – adamp

답변

10

초기화 할 때 비트 맵으로 변경하지 않고 캔버스 드로잉을 확실히 캐싱 한 다음 onDraw()에 비트 맵을 그립니다. 그것은 시간을 많이 렌더링하는 데 도움이됩니다. 예 :

Bitmap mField = null; 

void init() 
{ 
    mField = new Bitmap(...dimensions...); 
    Canvas c = new Canvas(mField); 
    c.drawRect(...); 
    ... 
} 

void onDraw(Canvas c) 
{ 
    c.drawBitmap(mField); 
} 
+0

대단히 감사합니다. 그것은 끝까지 도움이 된 것 같습니다. –

0

스포츠 필드가 정적입니까, 아니면 화면 위로 스크롤합니까? 정적 인 경우 한 번 빌드하고 매번 다시 그려지는 이미지로 저장하는 것이 좋습니다. 또 다른 문제 : 에뮬레이터는 최신 장치와 비교할 때 매우 느립니다. 실제 성능을 확인하려면 최소한 G1 이상에서 성능을 점검해야합니다.

관련 문제