Biblioteca de registro para juegos (c ++) [cerrado]

15

Conozco muchas bibliotecas de registro, pero no probé muchas. (GoogleLog, Pantheios, el próximo impulso :: log library ...)

En los juegos, especialmente en juegos remotos multijugador y multiproceso, el registro es vital para la depuración, incluso si elimina todos los registros al final.

Digamos que estoy haciendo un juego de PC (no consola) que necesita registros (multijugador y multiproceso y / o multiproceso) y tengo buenas razones para buscar una biblioteca para iniciar sesión (como, no tengo tiempo o estoy no estoy seguro de mi capacidad de escribir uno correctamente para mi caso).

Asumiendo que necesito:

  1. actuación
  2. facilidad de uso (permitir transmisión o formateo o algo así)
  3. confiable (¡no tenga fugas ni choque!)
  4. multiplataforma (al menos Windows, MacOSX, Linux / Ubuntu)

¿Qué biblioteca de registro recomendarías?

Actualmente, creo que boost :: log es el más flexible (¡incluso puede iniciar sesión de forma remota!), Pero no tiene una buena actualización de rendimiento : es para un alto rendimiento, pero aún no se ha lanzado. Pantheios se cita a menudo, pero no tengo puntos de comparación en cuanto a rendimiento y uso. He usado mi propia biblioteca durante mucho tiempo, pero sé que no gestiona el subprocesamiento múltiple, por lo que es un gran problema, incluso si es lo suficientemente rápido. Google Log parece interesante, solo necesito probarlo, pero si ya ha comparado esas bibliotecas y más, su consejo podría ser útil.

Los juegos son a menudo exigentes en cuanto a rendimiento y complejos para depurar, por lo que sería bueno conocer las bibliotecas de registro que, en nuestro caso específico, tienen claras ventajas.

Klaim
fuente
3
Un requisito que importa que no mencionó es para qué piensa usar los registros. Los requisitos para registrar, por ejemplo, mensajes de depuración, métricas para diseñadores, estado de caracteres para atención al cliente y transacciones con tarjeta de crédito, son diferentes. En general, se intercambia el rendimiento, la facilidad de uso para los programadores, la facilidad / velocidad del análisis fuera de línea y la durabilidad según la situación.
Así es, pero suponía que una solución de registro "completa" permitiría a los usuarios configurar diferentes tipos de registros como usted describe. Si considera que esta precisión es importante en la pregunta, sea mi invitado y agréguela a la pregunta.
Klaim

Respuestas:

8

inicie sesión con socket (cualquier envoltorio de socket puede ser suficiente) + navegador web websocket => la herramienta de registro más versátil y discreta posible, obtendrá horas de depuración y evitará el dolor ocular.

  • asíncrono (velocidad, ya que difiere todo el trabajo en el navegador)
  • formateado (color, tamaño, etc.)
  • confiable (enchufes ...)
  • multiplataforma (navegador)

Ahora, la bonificación:

  • filtrado dinámico muy fácil de hacer (usando JavaScript regex si es necesario)
  • con historial de registro, memoria y comparación (especificación HTML5 en la base de datos "en el navegador")
  • Manera fácil de hacer un gráfico de cualquier dato (usando SVG, o lienzo o cualquier cosa) como memoria , fragmentación de memoria , etc.
  • manera fácil de hacer un gráfico 2D de cualquier dato ( subdivisión de árbol kd ? campo potencial? o incluso solo una variación de valor variable? etc ...)
  • permite el registro distante (usando el navegador de otra computadora)
  • usando html5 en el almacenamiento del navegador, puede almacenar parámetros de sesión de registro (filtros de registro actuales, etc. e incluso notas en cada uno)
  • Es muy fácil crear informes de errores o vincular tickets de trac con solo un clic
  • capacidad de rebobinar el registro fácilmente, con una interfaz gráfica de línea de tiempo

y muchas más tareas fuera del registro:

  • permite información de perfil (gráficos ...)
  • incluso puede servir como consola (enviar comando desde el navegador) o incluso con una GUI rápida usando HTML o incluso flash ui
  • image diff en el navegador (envíe la imagen usando el socket y compare en el navegador usando las capacidades de píxeles de la imagen del lienzo)
  • etc ...

(casi todo lo anterior se puede hacer usando sockets flash, guarde las capacidades de la base de datos)

Ahora sé que parece un poco largo configurarlo. Pero realmente es una ganancia de tiempo en proyectos largos, con una situación de depuración difícil (como en los juegos). Es lo más poderoso que utilicé desde los depuradores ...

Nota 1: el único inconveniente => doble efecto secundario al depurar el código de red del juego (impacto en el tamaño del búfer de socket, latencia, ancho de banda, etc.)

Nota 2: algunos broswer están desactivados por defecto en websocket debido a razones de seguridad, verifique: configure las cosas para asegurarse de que esté habilitado.

Tuan Kuranes
fuente
1
Corrígeme si me equivoco, pero esto solo sugiere hacia dónde dirigir la salida de registro, ¿no? Una biblioteca de registro real también permitiría filtrar en tiempo de compilación (que es crucial si el rendimiento es un problema), formatear y proporcionar una sintaxis fácil de usar para crear mensajes de registro.
sbi
@sbi Es una cosa global dentro o fuera del lado de la aplicación. El "cliente de registro del navegador" realiza el filtrado, la sintaxis, pero siempre obtiene todo el registro. Es radical, pero se basa en la experiencia de que durante el desarrollo, siempre debe registrar todo para que pueda atrapar / reproducir fácilmente cualquier error que encuentre. Si tiene que optimizar, vuelve a estar en el lado del navegador: con el uso del socket no está obligado a iniciar sesión con una cadena, puede registrar directamente datos binarios (Id + flotantes), que están en negrita más rápido que cualquier otra biblioteca de registro basada en cadenas ... ( Id. coincidente con el lado del navegador de cadena ...)
Tuan Kuranes
1
Si bien puedo ver que esto es muy práctico, en realidad es solo un back-end del registrador (lo que templog llama un "sumidero de registros", IIRC). El rendimiento es uno de los requisitos enumerados. He descubierto que necesito agregar declaraciones de registro a un fragmento de código mientras lo depuro, pero una vez que esté en funcionamiento, este fragmento de código sería demasiado hablador y ahogaría todo lo que estoy trabajando en ese momento, y también costaría Demasiado rendimiento. Por lo tanto, quiero poder subir y bajar el nivel de registro en partes enteras de código cambiando algunas líneas de código. Eso es lo que la capa media de un log lib hace por ti.
sbi
@sbi: puede requerir puntos de referencia, pero existe la posibilidad de que la mejor biblioteca de registro, incluso en el nivel de registro más bajo, aún le cueste más que un registrador binario que registra todo. Ni siquiera hay un solo ciclo de CPU "binario a char" desperdiciado ... Por lo tanto, es realmente más funciones y más rendimiento.
Tuan Kuranes
Antes de decidir realmente usar templog, hicimos algunas pruebas. Si el registro está desactivado para la gravedad, el origen o cualquier otra cosa de un mensaje de registro específico, y si el compilador puede descubrir que no hay efectos secundarios al evaluar los parámetros, entonces VC puede optimizar de forma completa declaración de registro en la nada. Y cuando se trata de velocidad, no superarás el código que no está allí para ejecutarse en primer lugar.
sbi
8

Cuando se trata de rendimiento, he encontrado templog prácticamente invicto. Utiliza plantillas de expresión para diferir la evaluación de las declaraciones de registro hasta que se establezca que la información se registrará en absoluto. Dado que también puede desactivar parcialmente el registro (según la gravedad, el origen y el público objetivo de un mensaje de registro), el compilador puede eliminar algunas de estas instrucciones de registro a código cero para compilaciones de lanzamiento. (De hecho, he visto que esto suceda con VC).

No se ha hecho mucho a la biblioteca recientemente, y otros en SO han encontrado que el baúl carece en algunos aspectos, pero en una compañía para la que solía trabajar, hemos encontrado al tipo bastante receptivo, y uno de mis entonces trabajadores de vaca incluso obtuve acceso de confirmación y le agregué un código, por lo que es posible que valga la pena intentarlo.

Para enumerar sus requisitos:

actuación

Lo mejor que he encontrado. Especialmente su capacidad para excluir mensajes de registro en tiempo de compilación y hacer que el compilador los elimine por completo fue muy atractivo.

facilidad de uso (permitir transmisión o formateo o algo así)

Hay los mensajes de error clásicos y horribles del compilador de plantillas-meta cosas cuando haces algo mal, pero cuando se trata de facilidad de uso, esto

TEMPLOG_LOG(my_logger,sev_error,aud_support) << "logged in as " << user_name;

Es difícil de superar.
Sin embargo, es posible que tenga que crear sus propios sumideros de registro (ahí es donde van los mensajes de registro), ya que los pocos preempaquetados (stderr, archivo, registro de Windows, etc.) no son tan sofisticados. Debido a que el rendimiento es un objetivo principal, los aspectos intrínsecos de todo el asunto son algo complicados (como que los formateadores de mensajes de registro están bastante enredados con los sumideros de registro), pero lo dominamos (recuerdo haberlo pasado en un depurador que ayuda con eso) y una vez entendí que no era tan difícil escribir sus propios formateadores de mensajes o sumideros de registros.

confiable (¡no tenga fugas ni choque!)

Lo hemos usado sin encontrar problemas tan graves. Prácticamente no hay asignación dinámica de memoria allí, por lo que es difícil incluso imaginar que haga algo mal. Por supuesto, solo lo ponemos a prueba en el mundo real en un solo producto.

multiplataforma (al menos Windows, MacOSX, Linux / Ubuntu)

Cuando lo usamos, lo usamos en Win32, OSX y varias distribuciones de Linux diferentes, Ubuntu entre ellas.

En cuanto a los subprocesos múltiples: no hemos usado esto, pero por lo que recuerdo de la arquitectura de la biblioteca, parece que solo necesitaría manejar esto en los sumideros de registro. ICBWT.

sbi
fuente
Gracias, no sabía este. Parece una versión simplificada (y eficaz) de boost :: log, al menos en la idea original.
Klaim
@Klaim: No creo que boost tuviera algo que ofrecer la última vez que busqué en las bibliotecas de registro de C ++, por lo que no sé acerca de boost :: log.
sbi
1
@ Joe: ¿Entiendes el término "plantillas de expresión" ?
sbi
1
Pensé que sí, pero ahora descargué y comencé a leer el código fuente del registro temporal, y parece que C ++ me ha engañado nuevamente.
1
@sbi: Parte de mi confusión fue su declaración "transmitida de una vez a través de varias capas". En inglés a la vez puede significar de manera inmediata o conjunta , que en este caso son opuestos. Lo leí como el primero, y tú (ahora obviamente para mí) significabas el segundo. Gracias por tomarte el tiempo de explicarlo.
0

Quizás te interese Baical conjunto de herramientas :

  • Biblioteca de código abierto y multiplataforma (Win, Linux, x86 / x64) para registros, trazas y telemetría - P7
  • Increíblemente rápido (diseñado para dispositivos integrados): 3 millones de registros por segundo para la red, 5 millones para archivar en la CPU moderna. No conozco ninguna otra biblioteca para el registro que proporcione tanta velocidad e información tan detallada para cada mensaje de registro.
  • A salvo de amenazas
  • Cada mensaje de rastreo contiene:
    • mensaje de texto
    • nivel
    • tiempo preciso (100ns)
    • archivo fuente, nombre de función y línea
    • ID del módulo y nombre del módulo
    • ID de hilo y nombre de hilo
    • índice central del procesador
  • Aplicación de servidor para recibir y ver registros y telemetría
  • Puede recopilar, analizar, buscar, filtrar registros de múltiples fuentes en tiempo real
maximu
fuente
A partir del 06/2017% s aún no se admite el formato de cadena.
Romeno