2012-05-23 5 views
1

나는 자바와 안드로이드에 대해 처음 접했다. 이제 고객보기보다 빠른 속도로 캔버스를 사용하여 표면 뷰를 그립니다. 그것이 내가 종류 얻고 안드로이드 동기화 표면보기에 올 때 그러나의동기화 된 안드로이드 표면보기

는 내가 약간 형태의 변형 예 두 가지 버전이

기준도 http://android-er.blogspot.com/2010/05/android-surfaceview.html 안드로이드 달 착륙선으로이 링크을 혼동 내가 surfaceview 렌더링 쓰레드를 실행할 때 메소드 부분을 실행하지만, 어느 것이 더 정확한지 확신 할 수 없다. 둘 다 작동합니다, 하지만 저는 단지 내 개념을 정리하고 싶습니다.

진보에 어떤 도움과 제안에 대한

감사 내가 잘못된 방법으로 질문이있는 경우도 나를 :)

버전 1 수정하십시오

protected void run() 
{ 
    while (isRunning) 
{  
      if(RenderThreadSurfaceHolder.getSurface().isValid()) 
      { 
      Canvas Draw = null; 
      try 
      { 
       Draw =RenderThreadSurfaceHolder.lockCanvas(null); 
       synchronized (RenderThreadSurfaceHolder){  
        if(Draw!=null) 
        {                  
         RenderThreadSurfaceView.onDraw(Draw); 
        } 
       } 
      } 
      finally{      
       if(Draw!=null) 
       {              
         RenderThreadSurfaceHolder.unlockCanvasAndPost(Draw); 
       } 
      } 
     } 
    } 
} 

버전 2 :

protected void run() 
{ 
    while (isRunning) 
{  
      Canvas Draw = null; 
       try 
       {  

        synchronized (RenderThreadSurfaceHolder) 
        {  
          if(RenderThreadSurfaceHolder.getSurface().isValid()) 
          { 

            Draw=RenderThreadSurfaceHolder.lockCanvas(null); 
            if(Draw!=null) 
            { 
             RenderThreadSurfaceView.onDraw(Draw); 
            } 

          } 
        } 
       } 
       finally 
       { 

          if (Draw != null) 
          { 
           RenderThreadSurfaceHolder.unlockCanvasAndPost(Draw); 
          } 
       } 
    } 
} 

편집

n 추가 표면보기 동기화 또한 작업 및 OnDraw 메서드간에 데이터를 공유하는 데이터를 제어하기 위해 자물쇠를 추가하려는 경우 많은 데이터와 많은 프로세스 기능이 동기화되어 있다고 생각하기 때문에 너무 많은 오버 헤드가 발생합니다 그래서 동기화 된 부울,하지만 인터넷에서 연구를 무엇 동기화 부울 정말 좋은 아이디어 // 여전히 혼란 나에게 많은 아니라고 말할 같은

synchronized (Check) 
{ 
    Check=true; 
} 

하지만 아래

private static lock Lock; //declare in the Activity 

public synchronized void setlock(boolean newlock) 
{ 
    if (newlock!=lock){ 
    lock = newlock; 
    } 
} 

public synchronized boolean isTrue() { 
    return lock; 
} 
뭔가를 할 경우

그게 맞습니까? 좋지 않은 생각인가?

내 개념은 처리 기능과의 OnDraw 방법 사이에 잠금 장치를 추가 할 수 있습니다 :

답변

0

이것은 매우 주관적인 질문이다,하지만 난 1

첫 번째 방법은 synchronized(RenderThreadSurfaceHolder) 타이트한 가지고 갈 것이다; 코드가 적어지면 동기화가 필요하므로 블로킹 문제를 피할 수 있습니다.

게다가, 대부분 주문하는 것 같습니다. 해결 방법 1에서는 가능한 한 빨리 if(RenderThreadSurfaceHolder.getSurface().isValid())으로 전화하는 것이 좋습니다. 표면이 유효하지 않으면 아무 일도 일어나지 않을 수 있기 때문입니다. 이렇게하면 불필요한 if/else 검사를 피할 수 있습니다.

예, 동기화는 부울에서 작동하지 않습니다. 그 이유는 BOOLEAN.TRUE 및 BOOLEAN.FALSE가 정적 상수이기 때문입니다.

참조 변수를 동기화 할 때 사용하려고하는 다른 모든 스레드는 현재 실행중인 동기화 된 블록이 끝날 때까지 대기해야한다는 아이디어가 있습니다. 부울은 BOOLEAN.TRUE 또는 BOOLEAN.FALSE를 참조하므로 두 번째 부울로 동기화하는 즉시 문제를 보게됩니다.

계속해서 RenderThreadSurfaceHolder에서 동기화합니다. 즉, 내가 어떻게하는지, 어떻게 보았는지를 보여줍니다.

그리기와 업데이트 사이에 잠금을 추가하려는 이유가 무엇입니까? 어쩌면 내가 그 이유를 안다면 나는 다른 접근법으로 나중에 도울 수있을 것이다. 또한, 오버 헤드를 추가 할 뿐인 게임 루프를 가능한 한 단단하게 유지하고 싶다는 것을 기억하십시오.

+0

안녕하세요. 관련 질문이 더 많습니다. ~ 내 질문을 편집했으며 도움을 주셔서 감사합니다. – user1316408

+0

부울에 대해 편집 됨 – edthethird

+0

고맙습니다 미안 해요 늦게 회신 드리겠습니다. 원자적인 부울을 대신 사용하여 동기화 할 수 있다고 생각합니다. 왜 내가 업데이트를 잠그고 싶은지는 bcz 제가 그려야 할 것들이 변경되었습니다. 주요 활동 및 프로세스 데이터 시간 동안 나는 표면보기 데이터에 액세스하고 싶지 않아,하지만 내 개념이 옳았는지 모르겠다 :) – user1316408

관련 문제