본격적으로 게임을 개발중입니다.
현재 프레임워크는 복잡하지도 않고, (시스템 부분은 스레드 클래스와 서페이스 클래스만 있습니다.)
게임객체(플레이어나 적 등..)가 많은 것도 아닙니다.
헌데, 약 2~3초마다 렉이 발생하네요..;
객체를 한개만 출력해도 끊기네요; (안출력하면 끊기는게 안보여서, 움직이는 객체 한개만 출력)
구조는
서페이스에서 스레드가 돌아가고, 스레드에서 화면갱신을 호출하고 있습니다.
일반적인 예제 수준에서 이렇게 하더라구요.
그런데, 막상 이 구조 그대로 신나게 개발하다 보니, 렉이 심하네요..
약 초당 25프레임 출력밖에 안되는데, (출력에 따른 오버헤드 포함시, 더 적겠죠. 실제 노출프레임을 카운팅하지 않았고, 이론상 25프레임)
모바일은 원래 이렇게 렉이 심하나요?
혹시나 해서, 10프레임으로 하니, 렉이 많이 줄긴 했으나.. 어지간히 민감하신 분들에겐 욕먹을 정도네요.
실제로 어떻게 하시는지 궁금합니다.
초당 5~10프레임으로 하니 렉이 줄긴 했습니다만... =_=;
모바일이 원래 프레임수도 이정도로 적게 써서 개발해야 하는건지...
(맞다면, 축복일 수도 있겠네요. 리소스가 줄어드니... 다만 지금 너무 놀랍고 혼란스럽습니다..=_=)
일단.. 지금 코드를 볼 수 없는 상황에서는.. 답변드리기가 좀ㅁ 제한적인데,,
지금 당장 떠오르는 체크리스트 입니다.
1. 구조가 surface view에 main thread 하나만 무한 루프를 돌고있는게 맞나요?
- 여러개의 스레드가 계속해서 돌아가며 서로 상호작용을 한다면 이것도 느려지는 원인일 수 있습니다.
2. 그리고 main thread에서 객체 생성과 삭제를 자주하지 않나요?
- 보통은 게임 시작전에 필요한 메모리를 다 할당해주는게 좋습니다. 게임 중에 할당과 해제를 하게 되면 GC이 일어날때 뚝뚝 끊기더라구요.
3. 메인 루프 안에서 sleep을 해주나요?
- 메인 루프가 쉬지않고 돌아가는 것은 cpu에도 큰 부담을 주고, 게임이 끊기는 원인이 되기도 하더라구요.
4. 메인 루프에서 sleep을 사용하신다면 보간(interpolation)을 사용하시나요?
- sleep이라는 함수는 정확히 몇 ms동안 쉬는 것을 보장해주지 않습니다. 따라서 sleep(100)하더라고 100ms동안 쉬는게 아니고, 최소 100ms동안 쉽니다. 쉬는 동안 다른 쓰레드나 프로세스가 작업을 해서 좀더 늦게 양보하는 경우가 있기때문이죠. 어쨌든 그러한 문제때문에 매 루프가 일정한 시간마다 돈다고 보장이 되지 않습니다. 그러니 이전 루프와 현재 루프의 걸린 시간을 계산해서 그 시간에 맞게 보간작업을 해줘야합니다. 예를 들어,, 어떤 객체가 100ms동안 100px을 간다고 치면,, 어떤 루프에서는 200ms가 걸렸을 수도 있죠.. 그럴때는 100px을 이동하는게 아니라 200px을 이동해야한다는 겁니다.
머 대충 이정도 체크리스트가 떠오르네요..;ㅎ
도움이 되길...ㅎ
위슈님 정말 감사드립니다 ㅠ_ㅠ
1. surface view 에 내부적으로 thread 하나만 돌고 있는거 맞습니다. (어플 자체의 main thread 제외하고 추가적인 스레드)
현재, 어플 자체의 main thread 에서 틸트값을 저장하고 있고, surface view 에서 강제적으로 public 접근하고 있습니다.
이부분 주의깊게 확인해봐야겠네요.
2. 스레드 내부에는 객체생성(할당)/삭제(해제)를 어플구동 초기에만 할당하고, 어플종료시에만 해제합니다. 이상무
3. sleep 부분은 답변주신 바와 같이, 최소시간만 보장되기 때문에, 빼버렸고,
실제 ms 를 thread 무한루프에서 받아옵니다. (이전 루프와의 시간차로 프레임 갱신여부 판단)
이 부분도 봐야겠네요
4. 시간 보간작업은 안해봤는데, 적절한 해결법인듯 싶네요. 머릿속에선 대충 돌아갑니다 ㅎㅎ
예비군 다녀오겠습니다ㅠㅠ
렉이라고 한다면 뚝뚝끊기는 현상을 말씀하시는거죠? 혹시 onDrawFrame() 메소드와 같이 수시로 호출되는 메소드에서
메모리를 할당하거나 하는 작업을 수행하시는건 아닌가요?
미숙한 저지만 빈번한 gc 호출로 인해 발생되는 렉이 아닌가 싶네요.
최소.. 30은 나와야죠?
60정도면 게임이 부드럽게 돌아간다는 느낌.
30은.. 약간.. 답답한게 느껴지지만,, 그나마 할만한 느낌?
테스트 폰이 뭔가요??