У меня похожая ситуация в одном из моих приложений, где у меня очень тяжелые шейдеры, которые могут привести к замедлению рендеринга на старых устройствах, но я все же хочу, чтобы частота кадров была настолько высокой, насколько это возможно на более мощном оборудовании.
Что я делаю, так это использую единую последовательную очередь GCD для всех действий, связанных с рендерингом OpenGL ES, в сочетании с семафором отправки. Я использую CADisplayLink для стрельбы со скоростью 60 FPS, затем в рамках обратного вызова я отправляю блок для фактического действия рендеринга. Я использую семафор диспетчеризации, чтобы, если CADisplayLink пытается добавить другой блок в очередь рендеринга во время его работы, этот новый блок удаляется и никогда не добавляется.
Я подробно описываю этот подход в этом ответе , и вы можете скачать исходный код моего приложения, которое использует это здесь .
Очередь GCD позволяет вам переместить этот рендеринг в фоновый поток, который оставляет ваш интерфейс отзывчивым, в то же время масштабируя FPS так, чтобы ваш рендеринг работал так быстро, как ваше оборудование поддерживает. Это имеет особые преимущества на новых двухъядерных устройствах iOS, потому что я заметил значительное увеличение скорости рендеринга, просто выполняя обновления OpenGL ES в этой фоновой очереди.
Однако, как я описываю в этом ответе, вам нужно направить все свои обновления OpenGL ES через эту очередь, чтобы избежать возможности одновременного доступа более чем одного потока к контексту OpenGL ES (что приводит к сбою).