Вы не должны блокировать gameEngine - @KennyTM объяснил, что я считаю правильным ответом на ваш вопрос, однако его реализация привела бы к тому, что только игровой движок или средство визуализации могли выполняться в данный момент времени делая его по существу однопоточным. Вам следует использовать неизменяемый объект состояния, который может быть иваром gameEngine, но должен иметь значение nonatomic , где в функции рендеринга вы захватываете состояние следующим образом
State *state = [[gameEngine state] retain];
и затем используйте состояние, освобождая его, когда закончите. Когда gameEngine выполняет обновление, он не должен изменять данные в своем состоянии ivar, которое может использоваться средством визуализации, но может сделать его копию. Чтобы установить состояние, оно должно
State *oldState = state;
state = newState; //newState should have a retainCount of 1
[oldState release];
потому что если вы отпустите oldState перед установкой состояния newState, то средство визуализации может получить oldState, который был только что освобожден, что приведет к плохим вещам.