Game Development/프로젝트: 루

유니티) FPS와 관련된 Trouble

3영2 2019. 1. 5. 19:29
반응형

유니티) FPS와 관련된 Trouble



오늘 갑자기 Lu 의 게임 최적화때문에 FPS(Frame Per Second)가 어떻게 되는지 확인했다

그전에는 단순히 수치보고 너무 낮지만 않으면 잘돌아간다고 생각하고넘어갔던 문제였는데

앞으로 개발할때 주의해야겠다는 부분을 발견했다


먼저 Lu 프로젝트는 Unity 5.6 버전에서 개발되었다

또한 맥북프로로 개발된 프로젝트이다 


문제를 살펴보자면 Editor창에서 Maximum on Play상태에서의 FPS가 30언저리 밖에 나오지 않는다. 

하지만 Maximum on Play를 활성화시키면 FPS가 100까지 오르고 Batching이 갑자기 많이 발생하는 상황이 나타나면 줄어든다... 어쨋든 FPS가 100을 넘고 그냥 단순히 생각해보면 아 프레임이 잘나오네? 이렇게 생각할 수 있는데 FPS에 따라 플레이어의 움직임에 영향을 미치는것 같은 느낌이 들었다...


1) 다른 인스팩터창과 같이 Game Play를 할때 (Maximum On Play 비활성화) 

FPS 30 언저리




1) Maximum On Play 활성화 할때 

FPS 60 유지 (targetframe = 60으로 설정)



문제점은 FPS에 따라 Move되는 거리가 다르게 보이는 것이었는데 FPS가 높으면 더 천천히 그리고 반대로 FPS가 더 빨리 이동한는 점이다... 즉, FPS가 다를때마다 플레이어의 이동속도가 다르게 나타나고 있었다!...


처음에는 스크립상의 문제라고 생각이 됬다.

기본적인 움직임 스크립트는 다음과 같이 구성되어 있는데

1
2
3
4
5
6
7
8
9
10
11
12
13
    void Move(float hor, float ver)
    {
        if (!acting) //when basic movement
            playerSpeed = SPEED_DEFAULT + (float)SaveManger.instance.SpeedLV * 0.08f;
        else // when dash , skill attacks, etc
            playerSpeed = (SPEED_DEFAULT - 3f) + (float)SaveManger.instance.SpeedLV * 0.08f;
 
        Vector3 targetDirection = new Vector3(hor, 0f, ver);
        targetDirection = CameraManager.instance.mainCam.transform.TransformDirection(targetDirection);
        targetDirection.y = 0.0f;
        movement = targetDirection.normalized * playerSpeed * Time.deltaTime;
        playerRigidbody.MovePosition(transform.position + movement);
    }
cs

Rigidbody의 MovePosition 함수를 이용한 움직임 스크립트이다.


하지만 스크립트상으로는 큰 문제점이 보이지 않는다. 왜냐하면 direction을 normaize(정규화)한 이후에 Time.delaTime값을 곱하는 것 자체가 프레임의 높고 낮음과 상관없이 시간당 일정한 거리를 움직이게 하는 역할을 하기때문이다. 

(처음에는 MovePostion함수 자체의 문제인가 의심을 했지만 그것도 당연히 아니었다)


혹시 안드로이드에 앱에서는 어떻게 FPS가 나오는지 궁굼해서 FPS실험을 한 결과 60FPS에 고정되어있다

(Document에서는 Mobile의 경우 주로 30FPS에 맞춘다고 써 있는데 이게 기종에 따라 지원하는 FPS가 다르)

https://docs.unity3d.com/ScriptReference/Application-targetFrameRate.html



그래서 결국 이 문제를 해결하고자

1
Application.targetFrameRate = 60
cs

프레임을 60으로 고정시킨 후에 변화가 있는지 확인해보았다. 하지만 역시 Maximum on Play에서만 60FPS가 고정되었고 Maximum on Play를 끈 상태에선 계속 말도 안되게 낮게 나온다.


왜 이런 현상이 나타날까 열심히 구글링과 테스트한 결과 아주 허무한 결론이다.


한줄로 정리하자면 그냥 

"맥북에서 유니티 5.6 의 버그인것 같다"


맥북프로에 말고 윈도우 데스크탑에서 2017.3 버전으로 테스트한 결과 Maximun on Play 여부와 상관없이 프레임 드랍현상이 일어나지 않는다.

또한 Profiler의 Record기능이 editor상에서 프레임드랍에 영향을 준다. 그래서 Record기능을 끄면 프레임이 오른다... 30까지만...

그래서 이 프로젝트의 게임플레이를 확인할때는 Maximun on Play 를 키고 확인해야하는 번거로움이 있을것 같다... 

그리고 앞으로 모바일 프로젝트할때는 휴대폰이 30FPS, 60FPS인점을 감안해서 targetFrameRate을 지정한 후에 테스트하는게 좋을것 같다.




추가) 2019. 01. 18

최근에 윈도우 컴퓨터에 5.6.6버전을 받아서 Lu 프로젝트를 테스트한 결과 프레임 드랍현상이 나타나지 않았다.

유니티 버전이랑 상관없이 맥북에서 발생하는 버그로 보인다.


추가) 2019. 06. 05

Application.targetFrameRated을 지정시켜도 이는 에디터에 영향이 없다.

결론: 단순한 유니티 에디터의 버그이다.

반응형