¿Es normal que un juego use 100% CPU?

23

Acabo de implementar el manejo de entrada de subprocesos múltiples en mi motor de juego, donde el código que sondea el sistema operativo para recopilar información de él y las marca de tiempo está en un hilo separado y cada cuadro en el hilo principal acabo de comer la entrada reunida hasta un Tiempo de juego lógico. Todo funciona, pero esta configuración está utilizando el 100% de mi CPU. Tengo dos núcleos, y va hasta el 100% mientras ejecuto mi juego.

He consultado con otros juegos para ver si ellos también lo hacen. Por ejemplo, Skyrim y Doom 3 parecen estar bien con poco más del 60% de CPU.

¿Es aceptable que un juego que usa entrada de subprocesos múltiples use hasta un 100% de CPU? Si no, ¿cuáles son algunos trucos que usan estos juegos para reducir el uso de la CPU por el hilo de entrada?

The Light Spark
fuente
77
Entonces, ¿qué dices, básicamente tienes un hilo con un ciclo while interminable que constantemente sondea el sistema operativo para nuevos eventos? while true do CheckForEvents;
Kromster dice que apoya a Monica el
55
Si una aplicación usa el 100% del tiempo de la CPU, independientemente del uso y la velocidad de la CPU, entonces legítimamente podría considerarse un error. No debe usar más tiempo de CPU del necesario para representar un marco por ciclo de actualización del monitor.
kasperd
3
@TheLightSpark ¿El hilo de votación ni siquiera duerme? Si está constantemente haciendo bucles y comprobando sin dormir, probablemente consumirá mucho más tiempo de CPU del necesario.
Lucas
3
Re @Luke: Incluso dormir solo un milisegundo entre las encuestas reducirá drásticamente el uso de la CPU. Hace un tiempo, escribí una GUI para una herramienta de línea de comandos que tomaba un archivo de entrada y creaba un archivo de salida aproximadamente del mismo tamaño. Para estimar el porcentaje, leí el tamaño del archivo de salida y actualicé la barra de progreso (usando while (true)). Utilicé el 90% + de una CPU para hacerlo. Agregado Thread.Sleep(5)a, redujo el uso de la CPU a menos del 40%. Pasar a 25 milisegundos entre las encuestas lo redujo a menos del 10%.
Cole Johnson
2
@ AlecTeal Creo que no prestaste suficiente atención a lo que dije. Renderizar mejores gráficos no es el mismo uso y, por supuesto, habilitar mejores gráficos aumentará el consumo de CPU. Pero si cambiar a una CPU más rápida haría que su código solo gaste más ciclos produciendo exactamente el mismo resultado, su código es defectuoso. La medición automática de la calidad de los gráficos que se pueden procesar con una CPU específica es un valor predeterminado razonable. Pero debe permitir que los usuarios elijan en caso de que funcionen con batería o también necesiten CPU para trabajos en segundo plano.
kasperd

Respuestas:

41

Sí, esto es normal para un juego en tiempo real para tratar de usar el 100% de la CPU para rendir lo más rápido y bien posible. Para que el jugador vea tantos fotogramas por segundo o tan buena simulación física o cualquier otra cosa que su PC pueda proporcionar.

En su caso, no, esto parece un diseño ineficiente, para tomar un hilo y hacerlo sondear eventos en un bucle ( while true do CheckForEvents;). Corrígeme si me equivoco, pero el sistema operativo ya sondea los eventos. Debes verificarlos desde tu hilo principal una vez cada tic.

El ciclo principal del juego debe ser lo suficientemente rápido como para correr a más de 30 tics por segundo, lo cual es suficiente para sondear comandos para muchos juegos. El jugador no verá una diferencia si sus comandos se procesan, por ejemplo, 0-33 ms después. Por otro lado, podría haber utilizado ese núcleo de CPU adicional para tareas más beneficiosas, como una IA o física mucho mejor o lo que sea.

PD: como se solicitó aclarar en los comentarios, no tome los números anteriores a ciegas para todo tipo de juegos. Mientras que el juego TBS podría necesitar solo 1 tick por turno y el juego RTS podría estar bien con 10 ticks por turno, otros géneros, como RaceSims, necesitan mucho más. Y, por supuesto, no vincule los tics lógicos con la velocidad de fotogramas, estas son dos cosas separadas.

Kromster dice que apoya a Mónica
fuente
55
Votaría esta pregunta, pero luego veo que recomiendas 30 tics por segundo. En mi humilde opinión (y las de muchos otros jugadores), debes apuntar a 60 ticks (y, por lo tanto, 60 cuadros) por segundo. 60 FPS para muchas personas se ve más fluido, reproduce con mayor capacidad de respuesta y es menos probable que produzca mareos por cierto subconjunto de usuarios.
Nzall
44
El retraso de 33 ms para la entrada es muy notable ...
Synxis
1
@NateKerkhofs: vengo de fondo RTS, donde 10 ticks son habituales. Es un mundo amplio, agregaré detalles sobre eso. Gracias por señalarlo.
Kromster dice que apoya a Mónica el
1
@KromStern: No puedo hablar por Nate por completo, pero el tercer párrafo podría interpretarse como "30 Hz debería ser tu objetivo", aunque también podría interpretarse como "30 Hz es lo mínimo que puedes tolerar" (que puede ser lo que quisiste decir )
Sean Middleditch
1
Usar 100% de CPU es una práctica terrible. Estás fastidiando a los usuarios de computadoras portátiles por cosas que de ninguna manera o forma necesitan usar el 100% de la CPU. Codifique un bucle de juego adecuado que pueda alimentar marcos al monitor de manera eficiente.
Chris Dennett
9

Un juego con una actualización constante de la ventana activa se ejecutará principalmente en modo de pantalla completa y será el único programa (grande) de la máquina administrado por el sistema operativo. Por lo tanto, es totalmente aceptable usar el 100% de la CPU, porque nada más debería necesitarlo.

Sin embargo , eso no significa, por supuesto, que siempre debes usar el 100%, sea cual sea tu estado de juego. La mayoría de los bucles de juego usan un método de suspensión como delimitador de velocidad de fotogramas si terminaron de procesar un fotograma antes del límite de velocidad de fotogramas, para no hacer que la CPU se use para nada.
Esto es probablemente lo que sucede en sus ejemplos: su máquina es más rápida de lo que Skyrim o Doom 3 necesitan para ejecutarse, por lo que solo usan lo que necesitan, pero todo lo que necesitan.

Como dijo @KromSterm, el sistema operativo generalmente ya sondea eventos para usted, por lo que no es necesario hacer un ciclo más rápido que el sistema operativo. Si solo tiene dos núcleos, usar el 100% del segundo solo para la detección de eventos no es una buena idea, porque si solo transfiere eventos al ciclo de actualización principal, es muy rápido de ejecutar. En su lugar, debe intentar usar este núcleo para una parte del trabajo del subproceso principal con otro subproceso.

Aracthor
fuente
"utilizar un método de sueño" : ¿estoy en lo cierto al pensar que esto se conoce como limitador de velocidad de fotogramas?
Gusdor
3
el modo de suspensión no es un método preciso para limitar los fotogramas, si el objetivo es limitar los fotogramas para monitorear la frecuencia de actualización, entonces lo mejor es usar vsync compatible con hardware (o la sincronización g de nvidia, si está disponible)
Sarge Borsch
8

Hay algunos inconvenientes de utilizar todo el tiempo de CPU disponible en una PC o juego móvil.

Requisitos del sistema: si el juego se puede jugar en la PC donde desarrollas tu juego, es posible que no se pueda jugar en una PC más débil propiedad de alguien que compró tu juego. Limitar el uso de la CPU mantendrá un juego utilizable en máquinas que es probable que ya tengan más personas. Si realmente desea ver si está limitando su mercado, pruebe sus juegos de PC y los de sus competidores en un dispositivo desmontable con tecnología Atom como Transformer Book, o pruebe sus juegos móviles en un teléfono Android prepago de bajo costo.

Uso de energía: una computadora portátil agota su batería más rápido cuando se usan cuatro núcleos al 100 por ciento de la frecuencia total que cuando, por ejemplo, se usan dos núcleos al 60 por ciento de la frecuencia media. Por lo tanto, asegúrese de que su hilo de sondeo del controlador, el hilo AI, el hilo físico y el hilo gráfico estén bloqueados hasta que sea hora de que se ejecuten nuevamente. Excepto en algunos géneros muy nerviosos, como las peleas y el ritmo, no necesitará sondear los controladores más rápido que aproximadamente 60 Hz, así que configure su hilo de votación para que se ejecute en un temporizador de 60 Hz.

Variabilidad física: si la física que afecta el juego es más detallada en máquinas más fuertes, la misma acción del jugador tendrá diferentes resultados en diferentes máquinas. Esto significa que el jugador puede hacer trampa usando una máquina más fuerte o más débil. Id's Quake III Arena es conocido por hacer que la velocidad de fotogramas afecte la altura del salto . Para evitar esto, muchos juegos usan un paso de tiempo fijo para la física. Pero esto no afecta a la física que está desconectada de la jugabilidad, como los efectos de partículas o los efectos de tela o la interpolación de coordenadas entre cuadros de física para reproducir video a una velocidad de cuadro mayor que la física. Así que diseña tu física usando alguna variante de model-view-controller arquitectura, donde las cosas esenciales (aceleración, detección de golpes y similares) van en el modelo y los dulces visuales ajustables van a la vista.

Variabilidad de la IA: si la IA es más detallada en máquinas más fuertes, los enemigos se comportarán de manera diferente en diferentes máquinas. Por ejemplo, en una implementación de Go o Chess, el oponente será más débil en una PC más débil, y los jugadores pueden hacer trampa jugando el juego en una PC más débil o ejecutando procesos en segundo plano, como la transcodificación de antivirus o video o las actualizaciones del sistema operativo.

Damian Yerrick
fuente
44
+1 por uso de energía. Especialmente porque debe considerar la industria móvil y de tabletas, donde esto es extremadamente importante.
akaltar
1
El uso de energía también afecta el ruido, incluso en computadoras de escritorio. Es común que las computadoras de escritorio modernas mantengan a sus ventiladores lentos y silenciosos cuando el sistema es genial. Además, tal vez el usuario está codificando un video (con baja prioridad) mientras se reproduce, por lo que no se desperdicia el tiempo libre de la CPU. O para los reproductores que transmiten a twitch, dejar más ciclos para la codificación de video es un gran problema y permite videos de mayor calidad. (la codificación de video es una compensación de tres vías entre el tiempo de CPU, la tasa de bits y la calidad, por lo que más tiempo de CPU significa codificación en tiempo real con mayor calidad a la misma tasa de bits.)
Peter Cordes
1
El uso de energía debe ser la consideración principal, todas las demás consideraciones secundarias, en mi humilde opinión. Lo único para lo que usaría el 100% de CPU (¡si realmente ayudó!) Es material de realidad virtual.
Chris Dennett