마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

SurfaceView 깜빡임.

0 추천

surfaceView를 이용해서 비트맵을 연속적으로 뿌려주고 있는데요 계속해서 깜빡임이 생깁니다. 어디가 문제일까요?

이전에 그렸던 비트맵을 유지하고 계속해서 새로운것을 그리려면 이전에 그렸던걸 저장을 해놔야 한다고 하는데요. 비트맵을 어레이 리스트에다가 넣어 놓고 불러오면 딜레이가 심하지 않을까요?? 사실 지금도 딜레이가 약간 있는데... 어떤게 좋을까요???

 

@Override
	public void run() {
		isRun = true;
		
		while (isRun) {
			mCanvas = getHolder().lockCanvas(null);
			try {
				synchronized (getHolder()) {
					onDraws(mCanvas);
				}
			} finally {
					getHolder().unlockCanvasAndPost(mCanvas);
			}
		}
	}

	public void onDraws(Canvas canvas){
		
		Log.i("Position","onDraws");
		if(mPath != null){
			canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
			calPath(canvas);	
		}
		
		//canvas.drawPath(mPath, paint);
		//canvas.drawBitmap(bm, 0, 0, mBitmapPaint);
	}
	
	public void calPath(Canvas canvas){
		Log.i("Position","calPath");
		mPathMeasure.setPath(mPath, false);
		k = (int)this.mPathMeasure.getLength();	    
	    counts = 0;
	    while(true){
	    	if(counts >= k){
	    		break;
	    	}
	    	mPathMeasure.getPosTan(counts, arrayOfFloat1, null);
	    	canvas.drawBitmap(MainActivity.bm, arrayOfFloat1[0],arrayOfFloat1[1], mBitmapPaint);
    		counts = counts + 14;
	    }
	    
	}

 

NamKO (200 포인트) 님이 2014년 6월 27일 질문
화면 갱신을 별도 쓰레드에서 onDraw를 호출해서 하시는 이유가 있나요?
그냥 넣으신 거라면, bitmap 데이터를 변경한 이 후  
invalidate() 를 호출하여 안드로이드 UI Thread에서 자체적으로 onDraw를 호출하여 다시 그리게 변경해 보세요.

2개의 답변

0 추천

while (isRun) 문안에 딜레이를 좀 줘보셔요

nicehee (73,100 포인트) 님이 2014년 6월 27일 답변
while (isRun) {
            mCanvas = holder.lockCanvas();
            try {
                synchronized (getHolder()) {
                    onDraws(mCanvas);
                    Thread.sleep(50);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                    holder.unlockCanvasAndPost(mCanvas);
            }

이렇게 했는데 깜빡이는 속도만 느려졌어요;;;;;
근데 깜빡이는 이유가 뭘까요???
onDraws 가 한번 도는데 얼마나 걸리는지 시간을 재보셔요
run 을 아래와 같이 바꿔보세요,
현재는 UI쓰레드에서 onDraw를 부르는데다가 + 별도 쓰레드에서도 onDraw를 부르는듯 하며, 특히 별도 쓰레드에서 그릴때 화면을 Lock잡아 실제 UI쓰레드를 그릴 때 Canbus가 Lock이 된 상태라 제시간에 못그리는게 아닐까 합니다.
별도 쓰레드에서  UI쓰레드에 화면을 갱신하라고만 알려주고, onDraw는 UI 쓰레드에서만 불리는게 맞을 듯 합니다.

public void run() {
        isRun = true;
         while (isRun) {
        postInvalidate(); // 수동으로 업데이트 요청
            try{    Thread.sleep(33); } catch(Exception e){} // 일정시간 대기
        }
    }
0 추천
올려주신 부분은 문제가 없어 보이는데요

다른 부분때문에 깜빡임이 생기는거 같습니다.

그리고 이전에 그렸던 비트맵을 유지하고 새로운것을 그릴땐 저장하는게 아니라

그린 부분을 다른것으로 안덮으면 됩니다. (ex : 배경색 or 배경이미지)
q1212 (26,020 포인트) 님이 2014년 6월 27일 답변
...