2010-11-13 10 views
8

Estoy usando SDL para ver partes de mi proyecto de juego. Y quiero manejar eventos de pulsación de tecla sin interrumpir el hilo principal. Así que decidí ejecutar un ciclo infinito en otro hilo de vista para capturar cualquier evento e informar el hilo principal. Sin embargo, no estoy seguro de que este sea el mejor ya que esto puede causar una carga de trabajo y disminuir el rendimiento del sistema. ¿Hay alguna forma mejor de hacer este tipo de cosas? Gracias.¿Cuál es la mejor forma de manejar eventos con SDL/C++

Respuesta

7

No te molestes con otro hilo. ¿Cuál es el punto de?

¿Qué hace su hilo principal? Me imagino algo como esto:

  1. actualización de Logic
  2. Render
  3. Goto 1

Si recibe entrada después de (o durante) el ciclo de actualización, entonces usted tiene que esperar hasta la próxima actualización ciclo antes de ver los efectos. Lo mismo es cierto durante el renderizado. También debería verificar la entrada antes del ciclo de actualización y hacerlo todo individualmente.

  1. entrada
  2. actualización de Logic
  3. Render
  4. Goto 1

multihilo no gana nada aquí y sólo aumenta la complejidad.

Para una lectura adicional, echa un vistazo a Christer Ericson's blog post about input latency (él es el director de tecnología para el equipo que fabrica God of War).

+0

Eso y la entrada no es segura para subprocesos. Muchos tutoriales de SDL lo dicen explícitamente. – new123456

5

Y deseo controlar los eventos de pulsación de tecla sin interrumpir el hilo principal.

SDL no es intrínsecamente un marco impulsado por interrupciones o eventos. IO ocurre leyendo eventos fuera de la cola del evento llamando al SDL_WaitEvent o SDL_PollEvent. Esto debe ocurrir en el hilo "principal", el que llamó SDL_SetVideoMode.

Eso no quiere decir que no pueda usar varios hilos, y hay una buena justificación para hacerlo, por ejemplo, puede simplificar la comunicación de red si no tiene que depender del bucle de eventos de SDL. Si desea que la simulación se produzca en una secuencia separada, puede pasar información de un lado a otro a través de objetos compartidos sincronizados. En particular, siempre puede colocar eventos en la cola de eventos de SDL de forma segura desde cualquier hilo.

Cuestiones relacionadas