Game Development, 게임개발/개발

휴대용 디바이스에서의 렌더링,Redering 조절로 배터리 소모 낮추기(OnDemandRendering)

게임이 더 좋아 2022. 3. 14. 23:08
반응형
728x170

 

전원이 연결되어 있는 PC에서는 상관이 없지만 특히 모바일에서 배터리 소모는 정말 큰 문제다.

배터리가 빨리 닳아버리면 게임을 못하기 때문이다.

그러면 게임 접속시간이 줄어들고 배터리가 빨리 닳게 되면 게임을 삭제한다.

라는 비약이 심했지만 어쨌든 중요한 요소 중 하나이다.

 


 

하지만 프레임을 낮춰서 Rendering 빈도를 낮추는 것은 도움이 전혀 되질 않는다.

게이머의 환경이 안좋아지기 때문이다.

즉, 우리는 게이머가 불편함을 느끼지 않게 하면서도 배터리를 줄일 수 있는 방법을 찾아야 한다.

 

그것이 바로 OnDemandRendering이다.

https://docs.unity3d.com/ScriptReference/Rendering.OnDemandRendering.html

 

 

이해하기 위해서 먼저 알고 가야하는 용어가 몇가지 있다.

 

1.Application.targetFrameRate

Instructs the game to try to render at a specified frame rate란다.

설명하자면 실제로 저 Frame에 맞게끔 Rendering을 하게한다는 뜻이다. 

저게 60이라면 1초당 60번 Rendering을 하는 것이다.

우리는 여기서 잘 생각해야하는데 Rendering은 화면을 그리는 것이다.

실제 게임이 돌아가는 것이 절대 아니다. 다른 영역이다.

 

 

이러면 뭔뜻일까?

1초에 한 번 렌더링 된다는 말이다. 그렇다면...?

우리가 0초에서 1초 사이의 0.3초에 무엇인가 눌렀더라도 화면에 반영되려면 0.7초를 기다려야 한다는 말이다.

 

음..개구린데??

다음 알아야하는 것

 

2. OnDemandRendering.renderFrameInterval

frame rate interval을 설정하는 것이다. 

즉, 이 말은 targetFrameRate을 기준으로 어떤 interval로 rendering할 것인지를 정하는 것이다.

 

 

예를 들면

 

 

60 프레임율에

간격을 3으로 한다?

우리는 Rendering을 3프레임마다하여 1초에 20번 하겠다는 것이다.

 

 

음.. 알겠는데

어떻게 이걸 써먹는데?? 프레임 줄일 거면

처음부터 targetFrame을 낮추면되는 거 아냐??

 

맞다.

처음부터 낮춰도 된다.

하지만 우리는 최대한 사용자에게 좋은 환경을 제공하고 싶다.

 

그렇지만.. 사용자가 쓰지 않는다면 어떨까??

 

사용자의 입력과 같은 Responsive한 곳에서는 Rendering을 계속할 수 밖에 없지만

사용자가 입력하지 않는 상황이라면..? 굳이 렌더링을 계속해야할까??

**물론 해야하는 상황도 있다.

 

즉, 우리는 때에 따라 Rendering을 조절할 수 있다는 말이다!!!

 

예를 들면 이런 식이다.

 

사용자 입력이 있을 땐 반응성 좋게 하기 위해 매프레임마다 렌더링을 하고

아닐 때는 10프레임마다 렌더링을 하는 것이다.

 

이를 조금 더 활용하려면 작업이 필요하다.

하나 클래스를 만들자.

 

 

이 함수가 하는 것이 뭘까?

 

우선 Time.frameCount부터 알아보자

즉, 현재까지 계산된 프레임이다.

update가 불린 횟수이다.

 

즉, lastRequestedFrame에는 저 함수가 불린 프레임(때) 가 저장된다.

 

즉, 우리는 저 함수가 불렸을 때 어떠한 작업을 하고 싶은 것이다.

 

즉, lastRequestFrame부터 3프레임간은 나는 원래 속도대로 Rendering하고 싶다는 말이다.

이렇게 하니까 더 직관적이다.

입력을 체크하는 것보다 훨씬 경제적이다.

 

**더군다나 if문에 조건을 넣는다는 것은 정말 비효율적이다. 

조건이 추가될 때마다 if문을 늘릴 것인가??? 그냥 저 함수를 실행시켜주면 된다!

 


 

실제로는 어떻게 쓰일까???

 

 

1. progress에 따라 회전하겠다.

2. 시간을 계속 더한다.

3. 시간이 흘러 1초가 넘으면

4. OnDemanRendering을 바꾸는 조건이다.

 

요약하자면 회전하는 동안은 OnDemanRendering이 , 다시 말해서 interval이 짧아짐을 알 수 있다.

그래야 회전하는 것이 부드럽게 보일 것이니까!!

 

결국 우리는 사용자가 아무렇지도 않게 느끼게 해야한다는 말이다.

움직이지 않을 때는 렌더링을 하지 않아도 사용자가 아무것도 느낄 수 없고

여러가지 다른 상황에서도 렌더링을 하지 않아도 될 때가 있을 것이다.

 

모바일 디바이스 환경에서는 정말 중요한 것 중 하나이다.

결국 렌더링을 많이 하면 발열이 심해지고 발열 심해지면 배터리 소모 속도가 빠르고 결국 쓰로틀링 걸리고 난리난다.

솔직히 컴퓨터에서도 중요하지만 쿨링 기능이 모바일보다 뛰어나기 때문에 덜 신경쓰는 것이다.

아무튼 OnDemandRendering 좋은 거 알고 간다.

 

 

 

 


https://www.youtube.com/watch?v=RYgWn6jbteY 

 

반응형
그리드형