OpenGL ES에서 실행 루프를 만들었습니다.이 루프는 60fps로 CADisplayLink에서 호출합니다. AFAIK CADisplayLink는 그것을 배경 스레드라고합니다.보안 상태 변경을 수행하는 게임 엔진의 전략은 무엇입니까?
실행 루프에서 사용하는 약 100 개의 상태 변수가 있습니다.
문제 : 메인 스레드에서 실행 루프에 사용 된 상태 변수를 변경하여 무언가를 그려야합니다. 프레임은 모든 상태 변수가 목표 값으로 설정된 후에 만 그려야합니다.
상태 변수를 변경할 때 어떤 점에서 두려워요. 그리고 기하학적 모양의 위치와 같이 (주 스레드에서 동일한 반복 루프 반복에서 하나의 큰 방법으로) 모두 변경하지 않았습니다. , 멀티 스레딩과 관련된 충돌이나 문제가 있습니다. CADisplayLink가 메소드 중간에서 상태 변수를 업데이트하고 쓰레기 나 충돌을 일으키는 경우가 있습니다.
분명히 동기화 된 속성이나 원자 속성을 사용할 때 트랜잭션이 아니기 때문에 도움이되지 않습니다. 나는 거래가 필요할 것 같아.
내 순진하게 접근 방식은 이것이다 : 실행 루프에 의해 읽기
인스턴스 변수 : updatingState가 YES 읽는 경우
BOOL updatingState;
런 루프 방법은 그림을 건너 뜁니다.
그런 다음 상태를 변경하기 전에 나는 YES로 설정합니다. 모든 것이 바뀌면 다시 NO로 설정합니다.
물론 문제는 : 실행 루프 방법이 값을 읽는 중입니까?
어떻게 게임 엔진이이 문제를 해결합니까? 어떤 종류의 잠금 메커니즘을 가지고있어서 다음 프레임이 그려지기 전에 상태 변수의 변경이 완료 될 수 있습니까?
더 나은 전략은 최상위 수준 포인터 또는 개체 참조 또는 배열 인덱스와 두 개의 완전한 상태 트리를 갖는 것입니다. 최상위 레벨 포인터는 원자 적 명령어를 사용하여 읽고 쓰여야합니다. 읽기 전용 트리는 새 상태를 만드는 데 사용되며 렌더링 엔진은 읽기 전용 트리에서도 읽습니다. 새 상태가 준비되면 최상위 수준 포인터/인덱스/참조가 업데이트됩니다. –