모바일 환경이고 불규칙적으로 발생하는데 메인쓰레드가 중단되는 것으로 보이는 화면정지+배경음악만 재생되는 상태가 발생.
W'hile(true)로 외부에서 중단시키지 않는 이상 무한하게 반복되는 코루틴이다.
대략적인 코드 구조는
IEnumerator Loop
{
W'hile(true)
{
yield return new WaitForFixedUpdate;
LoopAction
}
}
의 형태.
yield return 뒤 조건으로
1. WaitForFixedUpdate
2. null
3. WaitForSecondsRealtime(0.02f)
4. WaitUntil(action)
같이 다양한 조건으로 루프 간격을 조절해보거나
혹은 Update 혹은 FixedUpdate로 루프를 돌려봐도 증상이 개선되지 않음.
루프 행동 하나하나에 다 로그 박아보고 나서야 루프 반복 도중 yield return 실행까지만 메인쓰레드가 살아있고 yield return이 실행되면 프리즈 상태에 빠져버리는 걸 발견.
온갖 개지랄을 다 해봐도 동일하게 yield return 실행 되기 전까지만 로그가 찍히고 프리즈.
Update문은 루프 완료 후 프리즈 되서 다음 Update문까지 못간다.
루프 1회 액션이 상황에 따라 0.02초 보다 오래 걸리기도 하는데 이 반복 작업이 무거워서 그런건지 싶은데 정말 모르겠다.
발생 시점이 불규칙적이라 더 끔찍함 (게임 시작 후 0초 ~ 0000초 까지 발생 시점이 엉망진창이지만 프리즈 전까지 길어봐야 30분)
짐작가는 단서가 뭐가 됐든 좋습니다. 그거 덕분에 해결된다면 햄부기라도 드리겠습니다..
코루틴이 문제가 아니라 그담에 뭘하는지가 중요한거같은데? - dc App
글만보면 코루틴 없어도 멈춰야할거같음 - dc App
답변 감사합니다. 루프할 때 액션 한번 더 살펴보겠습니다. 본문을 다시 읽어보니 너무 엉망진창이라 한 번 수정했습니다.
대충 수정후 본문 같은 상황인건 알고있었는데 저 LoopAction에 뭐가있었는지가 중요함 - dc App
코드량이 많다면 디시에 전문 올리는건 무리일테고 디버거 연결해서 한줄씩 넘기면서 어디서 멈추는지 봐바 그러라고 디버거가 있는거지 - dc App
나도 loop action이 문제같은데 loop action내에서 과도하게 객체 생성해서 gc나는거 아님? 나도 전에 그래가지고 게임 한번 터진적 있음 - dc App
코루틴말고 Update에서 컨트롤하면 안됨?
루프 액션이 오래 걸려서 생기는 문제 같다면, 프레임레이트를 줄여서 업데이트 간격을 늘려보셈. 한 1초에 2번만 업데이트하게 해보고 또 프리징 걸리면 이 코루틴을 실행하는 코드를 봐보셈
코루틴에서 yield return할 때 마다 불필요한 힙 할당이 생겨서 그럴지도 모름. new 구문 캐싱해뒀다가 사용하셈.
그냥 구조를 Update에서 코루틴 돌리는 구조로 가야했던거 아난교 ..