macos - requiere - forzar aceleracion gpu android
Rendimiento débil de CGEventPost bajo carga de GPU (1)
Supongo que estás llenando la cola (puerto de mach subyacente) ...
Puede confirmar esto utilizando el instrumento "programación" o "llamada del sistema" en los instrumentos. (Cree un nuevo documento en blanco, agregue el instrumento, luego en File > Record Options...
asegúrese de que esté marcado el "modo diferido"). Esto mostrará toda la actividad de los hilos en su aplicación (cuando los hilos se bloquean, cuando se desactivan, cuando están activados, y por qué).
Primero intentaría elevar la prioridad del hilo (cf. man 3 PTHREAD_SCHEDPARAM
) del hilo que llama a CGEventPost
. Si su hilo está bloqueado en un hilo de prioridad más baja, el kernel debería elevar temporalmente la prioridad del hilo de bloqueo para evitar la inversión de prioridad y ayudar a que su tarea se complete antes.
En general, creo que tendrá que implementar una solución de 2 hilos , como se muestra a continuación:
Cree una cola para los eventos que desea publicar. Publique eventos en esta cola desde su hilo principal (o hilo de publicación de eventos), luego señale un segundo hilo (un hilo de consumidor de eventos que usted crea) para recorrer la cola y publique cualquier evento destacado con CGEventPost
.
Cuando CGEventPost
bloquea, tu segundo hilo de publicación de eventos se bloqueará, pero esto no bloqueará ningún otro hilo. Cuando CGEventPost
finalmente se desbloquee, consumirá cualquier evento destacado publicado por el hilo del consumidor del evento y el hilo del consumidor del evento puede reanudar la publicación de eventos.
Otra posibilidad: ¿puedes hacer eventos? Existen ciertos tipos de eventos (¿movimientos del mouse?) Que podrían coalles en menos eventos. Probablemente todavía se encontrará con el límite de cola de CGEventPost
a veces, creo que el enfoque de 2 hilos es probablemente su mejor apuesta.
Nos hemos topado con un problema de rendimiento con Quartz Events, más específicamente CGEventPost: durante la carga pesada de GPU, CGEventPost puede bloquear. Hemos creado una pequeña aplicación de referencia para demostrar el problema . Esta aplicación es solo un bucle que crea, publica y publica eventos.
A continuación puede ver los resultados de la ejecución de la aplicación. La primera ejecución es en un sistema inactivo. La segunda prueba es con FurMark (prueba de estrés de GPU) con los diales girados lo más posible.
- El interior es el tiempo que tarda el bucle interno, básicamente solo crear, publicar y lanzar un evento con Quartz Events.
- Exterior es el tiempo que nuestro programa está esperando para ser despertado (un sueño). Debería estar cerca del momento en que dormimos, pero si el sistema está bajo presión, podría retrasarse.
- La publicación es el tiempo que tarda la publicación del evento.
18:58:01.683 EventPerformance[4946:707] Measurements: (outer should be close to 10)
18:58:01.684 EventPerformance[4946:707] inner (ms): 0.04, outer (ms): 11.02, CGEventPost (ms): 0.03
18:58:01.684 EventPerformance[4946:707] inner (ms): 0.04, outer (ms): 11.02, CGEventPost (ms): 0.03
18:58:01.685 EventPerformance[4946:707] inner (ms): 0.07, outer (ms): 10.26, CGEventPost (ms): 0.03
18:58:01.685 EventPerformance[4946:707] inner (ms): 0.06, outer (ms): 10.85, CGEventPost (ms): 0.05
18:58:01.686 EventPerformance[4946:707] inner (ms): 0.07, outer (ms): 10.41, CGEventPost (ms): 0.04
18:58:01.686 EventPerformance[4946:707] inner (ms): 0.04, outer (ms): 10.39, CGEventPost (ms): 0.03
18:58:01.686 EventPerformance[4946:707] inner (ms): 0.05, outer (ms): 11.02, CGEventPost (ms): 0.03
18:58:01.687 EventPerformance[4946:707] inner (ms): 0.03, outer (ms): 10.67, CGEventPost (ms): 0.03
18:58:01.687 EventPerformance[4946:707] inner (ms): 0.08, outer (ms): 10.09, CGEventPost (ms): 0.05
18:58:01.688 EventPerformance[4946:707] Averages: (outer should be close to 10)
18:58:01.688 EventPerformance[4946:707] avg inner (ms): 0.05, avg outer (ms): 10.64, avg post (ms): 0.03
Aquí podemos ver que publicar el evento toma alrededor de 0.03 ms en promedio. Además, el hilo parece haberse despertado unos 0,5 ms tarde. No hay picos en CGEventPost.
19:02:02.150 EventPerformance[5241:707] Measurements: (outer should be close to 10)
19:02:02.151 EventPerformance[5241:707] inner (ms): 0.03, outer (ms): 10.23, CGEventPost (ms): 0.02
19:02:02.151 EventPerformance[5241:707] inner (ms): 0.02, outer (ms): 10.54, CGEventPost (ms): 0.02
19:02:02.151 EventPerformance[5241:707] inner (ms): 0.02, outer (ms): 11.01, CGEventPost (ms): 0.01
19:02:02.152 EventPerformance[5241:707] inner (ms): 0.02, outer (ms): 10.74, CGEventPost (ms): 0.01
19:02:02.152 EventPerformance[5241:707] inner (ms): 0.02, outer (ms): 10.20, CGEventPost (ms): 0.01
19:02:02.152 EventPerformance[5241:707] inner (ms): 10.35, outer (ms): 11.01, CGEventPost (ms): 10.35
19:02:02.152 EventPerformance[5241:707] inner (ms): 0.03, outer (ms): 10.02, CGEventPost (ms): 0.02
19:02:02.153 EventPerformance[5241:707] inner (ms): 58.90, outer (ms): 10.11, CGEventPost (ms): 58.90
19:02:02.153 EventPerformance[5241:707] inner (ms): 0.03, outer (ms): 10.12, CGEventPost (ms): 0.02
19:02:02.153 EventPerformance[5241:707] Averages: (outer should be close to 10)
19:02:02.371 EventPerformance[5241:707] avg inner (ms): 7.71, avg outer (ms): 10.44, avg post (ms): 7.71
Cuando el sistema está bajo una gran carga de GPU, la publicación de un evento puede tardar (picos) milisegundos en lugar de microsegundos. Bajo una tensión de GPU extrema (<1 FPS), este valor puede tomar segundos. CGEventPost a veces parece estar esperando que la GPU termine un trabajo antes de regresar. Nuestro hilo todavía está programado normalmente sin demoras / picos notables (exterior).
Cualquier idea es apreciada.