ios - videos - ¿Cómo renderizar la vista en imagen más rápido?
renderizar sketchup online gratis (1)
Estoy haciendo la aplicación de la lupa, que permite que un usuario toque la pantalla y mueva su dedo, habrá una lupa con su trayectoria. Lo implemento tomando una captura de pantalla y asignando la imagen a la vista de la imagen de la lupa, de la siguiente manera:
CGSize imageSize = frame.size;
UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0.0);
CGContextRef c = UIGraphicsGetCurrentContext();
CGContextScaleCTM(c, scaleFactor, scaleFactor);
CGContextConcatCTM(c, CGAffineTransformMakeTranslation(-frame.origin.x, -frame.origin.y));
[self.layer renderInContext:c];
UIImage *screenshot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return screenshot;
el problema es que self.layer renderInContext
es lento, por lo que el usuario no se siente tranquilo cuando mueve su dedo. y traté de ejecutar self.layer renderInContext
en otro hilo, sin embargo, hace que la imagen de la lupa se self.layer renderInContext
rara porque la imagen de la lupa mostró retraso.
¿Hay alguna forma mejor de renderizar la vista en imagen? ¿ renderInContext:
usa GPU?
No. En iOS6, renderInContext: es la única manera. Es lento. Utiliza la CPU.
Formas de renderizar contenido UIKit
renderInContext:
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
- Requiere iOS 2.0. Se ejecuta en la CPU .
- No captura vistas con transformaciones no afines, OpenGL o contenido de video.
- Si se está ejecutando una animación, puede tener la opción de capturar:
-
view.layer
, que captura el fotograma final de la animación. -
view.presentationLayer
, que captura el fotograma actual de la animación.
-
snapshotViewAfterScreenUpdates:
UIView *snapshot = [view snapshotViewAfterScreenUpdates:YES];
- Requiere iOS 7.
- Es el método más rápido.
- Los
contents
vista son inmutables. No es bueno si quieres aplicar un efecto. - Captura todos los tipos de contenido (UIKit, OpenGL o video).
resizableSnapshotViewFromRect: afterScreenUpdates: withCapInsets
[view resizableSnapshotViewFromRect:rect afterScreenUpdates:YES withCapInsets:edgeInsets]
- Requiere iOS 7.
- Igual que
snapshotViewAfterScreenUpdates:
pero con insets redimensionables.content
también es inmutable.
drawViewHierarchyInRect: afterScreenUpdates:
[view drawViewHierarchyInRect:rect afterScreenUpdates:YES];
- Requiere iOS 7.
- Se dibuja en el contexto actual.
- Según la sesión 226 es más rápido que
renderInContext:
Consulte la sesión 226 de WWDC 2013 Implementación de la interfaz de usuario interactiva en iOS sobre las nuevas API de instantáneas.
Si hay alguna ayuda, aquí hay un código para descartar los intentos de captura mientras todavía se está ejecutando uno.
Este acelerador bloquea la ejecución de uno en uno y descarta otros. De esta respuesta SO .
dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);
dispatch_queue_t renderQueue = dispatch_queue_create("com.throttling.queue", NULL);
- (void) capture {
if (dispatch_semaphore_wait(semaphore, DISPATCH_TIME_NOW) == 0) {
dispatch_async(renderQueue, ^{
// capture
dispatch_semaphore_signal(semaphore);
});
}
}
¿Qué está haciendo esto?
- Crea un semáforo para un (1) recurso.
- Crear una cola de serie.
-
DISPATCH_TIME_NOW
significa que el tiempo de espera es ninguno, por lo que devuelve un valor distinto de cero inmediatamente en el semáforo en rojo. Por lo tanto, no se ejecuta el contenido if. - Si hay luz verde, ejecute el bloque de forma asíncrona y vuelva a establecer la luz verde.