제가 만든 Runnable 함수를 올립니다.
Runnable mRunnable = new Runnable() {
public void run() {
long lTime = System.currentTimeMillis();
onTimer();
long lTime2 = System.currentTimeMillis() - lTime;
lTime = 50 - lTime2;
if( lTime < 1 ) lTime = 1;
if( m_bRunning )
mHandler.postDelayed(mRunnable, lTime);
//////////////////////////////////////
m_nFps++;
m_tFps += lTime;
if( m_tFps >= 1000 ){
if(appDelegate.TEST_MODE == true ){
dbgLabel.setVisibility(View.VISIBLE);
dbgLabel.setText(" "+ m_nFps +" fps");
}
m_tFps -= 1000;
m_nFps = 0;
}
//////////////////////////////////////
}
};
가우리JK 님 감사합니다.
저는 스레드방식을 리용하지 않고 액티비티에서 핸들메시지를 리용하였습니다.
우의 소스에 있는 mHandler오브젝트가 바로 그 핸들입니다.
결국 자기 자체를 재귀한것이나 같지요.
그리구 onTimer()함수에서 UI를 갱신하고 있습니다.
가우리JK님 말씀대로 하신다면 onTimer()에서 갱신한 UI가 직접 반영되지 않는다는 건가요?
아 ~ 그렇군요.
UI업데이트에 대해서 하나 또 배웠습니다.
다행히 UI를 다른 데서 업데이트하는것은 없구요.
그렇다면 지금 구현한 방식이 맞는다는 소린데....
우의 소스로 세개 기종의 폰에서 21프레임으로 고정되였는데 여전히 속도는 차이납니다.
프레임 갱신은 아예 쓰레드를 생성해서 그 안에서 post를 하여야한다는거구요.
블루님이 하셨던 방식의 프레임 주기 컨트롤 방식은 성능상 어떨지 모르겠군요...
그리고 다른데서 UI를 업데이트하는게 없다고 하더라도, 시스템 자체에서 UI를 컨트롤할 수도 있쟈나요? 홈버튼이나 백버튼이나 전화가 왔다던지... 아무튼 특정뷰하나만 변경한다면 해당뷰.post()로 이것저것 많이한다면 따로 갱신용핸들러를 쓰세요.
ong lTime = System.currentTimeMillis();--------------------------|
onTimer(); << 이걸 바꾸시구요... |---- 이렇게하는건 의미가 없겠네요... long lTime2 = System.currentTimeMillis() - lTime;-----------------| lTime = 50 - lTime2; if( lTime < 1 ) lTime = 1;
프레임스키핑의 핵심은....계산 부분과 뿌려주는 부분의 분리에 있습니다. 폰이나 PC나 화면에 그림을 그리는 부분에서 가장 많은 속도가 필요로 하기 때문입니다. 말씀하신 퍼즐 게임의 경우라면 퍼즐 조각이 움직이거나 하는 부분은 별도의 함수로 처리하고 그 값에 따라 실제로 화면에 그리는 함수는 현재 화면을 그리기에 시간이 충분한지 프레임 값을 체크해서 뿌려주는 겁니다. 가령 핸드폰이 30프레임을 뿌릴 수 있는데 내가 60프레임으로 설정했다고 하면 2프레임마다 한번씩 그려주게 되겠죠. 하지만 퍼즐 조각의 좌표 계산 등은 60번을 모두 해줘야 한다는 겁니다. 화면을 그리지만 않는다면 60프레임이건, 100프레임이건 속도는 충분하지요. 물론 게임내에 연산에 따른 부하가 너무 심하다면 그려주는 부분에도 영향을 받겠지만요.




한 프레임을 표현하는데 드는 시간이 각각 다르다고 보고
프레임 간격 컨트롤을 딜레이를 주는방식이 아닌타이머에 의한 알림 방식으로 바꾸면 될듯하네요...
단 그 간격은 최대소요시간(가장 저사양 기기?)를 기준으로 산정하셔야할듯하네요~