Libreria di registrazione per i giochi (c ++) [chiuso]


15

Conosco molte librerie di log ma non ne ho testate molte. (GoogleLog, Pantheios, il prossimo boost :: log library ...)

Nei giochi, specialmente nei giochi multiplayer remoti e multithread, la registrazione è vitale per il debug, anche se alla fine rimuovi tutti i registri.

Diciamo che sto realizzando un gioco per PC (non console) che necessita di registri (multiplayer e multithread e / o multiprocesso) e ho buoni motivi per cercare una libreria per il log (come, non ho tempo o sono non fiducioso nella mia capacità di scriverne uno correttamente per il mio caso).

Supponendo che ho bisogno di:

  1. prestazione
  2. facilità d'uso (consentire lo streaming o la formattazione o qualcosa del genere)
  3. affidabile (non perdere o schiantarsi!)
  4. multipiattaforma (almeno Windows, MacOSX, Linux / Ubuntu)

Quale libreria di log consiglieresti?

Attualmente, penso che boost :: log sia il più flessibile (è anche possibile accedere in remoto!), Ma non ha un buon aggiornamento delle prestazioni : è per alte prestazioni, ma non è ancora stato rilasciato. Pantheios è spesso citato ma non ho punti di confronto su prestazioni e utilizzo. Ho usato la mia lib per molto tempo ma so che non gestisce il multithreading, quindi è un grosso problema, anche se è abbastanza veloce. Google Log sembra interessante, ho solo bisogno di provarlo, ma se hai già confrontato quelle librerie e altro, i tuoi consigli potrebbero essere utili.

I giochi sono spesso impegnativi in ​​termini di prestazioni mentre sono complessi da eseguire il debug, quindi sarebbe bene conoscere le librerie di registrazione che, nel nostro caso specifico, presentano chiari vantaggi.


3
Un requisito che conta di non aver menzionato è quello per cui si intende utilizzare i registri. I requisiti per la registrazione, ad esempio, i messaggi di debug, le metriche per i progettisti, lo stato dei caratteri per l'assistenza clienti e le transazioni con carta di credito, sono diversi. In generale, si compromettono prestazioni, facilità d'uso per i programmatori, facilità / velocità di analisi offline e durata a seconda della situazione.

Esatto, ma supponevo che una soluzione di registrazione "completa" avrebbe consentito agli utenti di configurare diversi tipi di registri come descritto. Se trovi questa precisione importante nella domanda, per favore sii mio ospite e aggiungila alla domanda.
Klaim,

Risposte:


8

accedi usando socket (qualsiasi wrapper socket può bastare) + browser web websocket => lo strumento di registrazione più versatile e discreto possibile, otterrà ore di debug ed eviterà la vista.

  • asincrona (velocità in quanto difende tutto il lavoro sul browser)
  • formattato (colore, dimensioni ecc.)
  • affidabile (prese ...)
  • multipiattaforma (browser)

Ora, il bonus:

  • filtraggio dinamico fatto molto facilmente (usando javascript regex se necessario)
  • con cronologia dei log, memoria e confronto (specifica HTML5 nel database "nel browser")
  • Modo semplice per creare un grafico di qualsiasi dato (usando SVG, o canvas o altro) come memoria , frammentazione della memoria , ecc ...
  • modo semplice per creare un grafico 2D di qualsiasi dato ( suddivisione kd-tree ? campo potenziale? o anche solo una variazione di valore variabile? ecc ...)
  • consente la registrazione distante (utilizzando il browser un altro computer)
  • utilizzando html5 nella memoria del browser, è possibile memorizzare i parametri della sessione di registro (filtri di registro correnti, ecc. e persino note su ciascuno)
  • semplicissimo creare segnalazioni di bug o collegare ticket trac solo con un clic
  • possibilità di riavvolgere facilmente la registrazione, con una sequenza temporale

e molte altre attività al di fuori della registrazione:

  • consente informazioni sul profiler (grafici ...)
  • può anche servire come console (invia il comando dal browser) o anche con una GUI rapida usando un po 'di HTML o persino un'interfaccia utente flash
  • diff dell'immagine nel browser (invia l'immagine tramite socket e confronta nel browser usando le funzionalità pixel dell'immagine canvas)
  • eccetera...

(quasi tutto quanto sopra può essere fatto utilizzando socket flash, salvare le funzionalità del database)

Ora so che sembra un po 'lungo impostare la cosa. Ma è davvero un guadagno di tempo in progetti lunghi, con una situazione di debug difficile (come nei giochi.) È la cosa più potente che ho usato dai debugger ...

Nota 1: l'unico aspetto negativo => doppio controllo degli effetti collaterali durante il debug del codice di rete del gioco (impatto sulla dimensione del buffer del socket, latenza, larghezza di banda, ecc ...)

Nota 2: alcuni broswer disattivati ​​dal websocket predefinito per motivi di sicurezza, controlla su: configura le cose per essere sicuro che sia abilitato.


1
Correggimi se sbaglio, ma questo suggerisce solo dove indirizzare l'output di registrazione, no? Una vera libreria di log consentirebbe anche il filtraggio in fase di compilazione (che è cruciale se le prestazioni sono un problema), la formattazione e fornire una sintassi di facile utilizzo per la creazione di messaggi di log.
sabato

@sbi È una cosa globale on o off sul lato dell'applicazione. "Browser log client" esegue il filtro, la sintassi, ma ottiene sempre tutto il registro. È radicale, ma si basa sull'esperienza che durante lo sviluppo, dovresti sempre registrare tutto in modo da poter catturare / riprodurre facilmente qualsiasi bug su cui ti imbatti. Se devi ottimizzare, è di nuovo sul lato browser: usando socket non sei tenuto a registrare usando la stringa, puoi registrare direttamente i dati binari (Id + float), che è in grassetto più veloce di qualsiasi altra libreria basata su stringa ... ( ID corrispondente al lato browser della stringa ...)
Tuan Kuranes,

1
Mentre vedo che questo è molto pratico, in realtà è solo un backend di un logger (quello che Templog chiama un "log sink", IIRC). Le prestazioni sono uno dei requisiti elencati. Ho scoperto che ho bisogno di aggiungere le istruzioni di registro a un pezzo di codice durante il debug, ma una volta che è attivo e funzionante questo pezzo di codice sarebbe troppo loquace e annegherebbe tutto ciò su cui sto lavorando, quindi nel suo rumore, e costerebbe anche troppe prestazioni. Quindi voglio essere in grado di tonificare e abbassare il livello di registro su interi pezzi di codice con la modifica di alcune righe di codice. Ecco cosa fa per te il livello intermedio di una lib lib.
sabato

@sbi: potrebbe richiedere benchmark, ma è probabile che la migliore libreria di log, anche al livello di log più basso, ti costi ancora più di un logger binario che registra tutto. Non c'è nemmeno un singolo ciclo di CPU "binary to char" sprecato ... Quindi è davvero più funzionalità e più prestazioni.
Tuan Kuranes,

Prima di decidere di utilizzare effettivamente Templog, abbiamo effettuato alcuni test. Se la registrazione è disattivata per gravità, origine o quant'altro di un messaggio di registro specifico e se il compilatore è in grado di scoprire che non ci sono effetti collaterali nella valutazione dei parametri, VC è davvero in grado di ottimizzare un vero e proprio istruzione log nel nulla. E quando si tratta di velocità, non batterai il codice che non è lì per essere eseguito in primo luogo.
sabato

8

Quando si tratta di prestazioni, ho trovato templog praticamente imbattuto. Utilizza i modelli di espressione per rinviare la valutazione delle istruzioni di registrazione fino a quando non viene stabilito che le informazioni verranno registrate affatto. Poiché è anche possibile disattivare parzialmente la registrazione (in base alla gravità, all'origine e al pubblico di destinazione di un messaggio di registro), alcune di queste istruzioni di registrazione possono essere eliminate a zero dal codice dal compilatore per le build di rilascio. (Ho visto questo accadere con VC.)

Recentemente non è stato fatto molto in biblioteca, e altri su SO hanno scoperto che il bagagliaio è carente per alcuni aspetti, ma in un'azienda per cui lavoravo abbiamo trovato il ragazzo abbastanza reattivo, e uno dei miei allora lavoratori delle mucche persino ottenuto l'accesso di commit e aggiunto un po 'di codice ad esso, quindi potresti ritenerlo utile.

Per elencare le tue esigenze:

prestazione

Il migliore che abbia trovato. Soprattutto la sua capacità di escludere i messaggi di log in fase di compilazione e di eliminare completamente quelli del compilatore è stata molto interessante.

facilità d'uso (consentire lo streaming o la formattazione o qualcosa del genere)

Ci sono i classici orribili messaggi di errore del compilatore di template-meta stuff quando si fa qualcosa di sbagliato, ma quando si tratta di facilità d'uso, questo

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

è difficile da battere.
Tuttavia, potrebbe essere necessario creare i propri sink di log (è lì che vanno i messaggi di log), poiché i pochi preconfezionati (stderr, file, registrazione di Windows, ecc.) Non sono poi così sofisticati. Dato che le prestazioni sono un obiettivo principale, gli elementi intrinseci dell'intera faccenda sono alquanto complicati (come i formattatori dei messaggi di registro che sono piuttosto intricati con i sink di registro), ma abbiamo imparato questo (ricordo di averlo passato in un debugger che mi ha aiutato) e una volta capito che non è stato così difficile scrivere i propri formattatori di messaggi o log sink.

affidabile (non perdere o schiantarsi!)

Lo abbiamo usato senza trovare problemi così gravi. Non c'è praticamente alcuna allocazione dinamica della memoria, quindi è difficile immaginare che stia facendo qualcosa di sbagliato. Naturalmente, lo abbiamo sempre e solo testato nel mondo reale in un unico prodotto.

multipiattaforma (almeno Windows, MacOSX, Linux / Ubuntu)

Quando l'abbiamo usato, l'abbiamo usato su Win32, OSX e diverse distribuzioni Linux, tra cui Ubuntu.

Per quanto riguarda il multi-threading: non l'abbiamo usato, ma da quello che ricordo dell'architettura lib sembra che dovresti solo gestirlo nei log sink. ICBWT.


Grazie, non lo sapevo. Sembra una versione semplificata (e performante) di boost :: log, almeno nell'idea originale.
Klaim,

@Klaim: Non credo che boost avesse qualcosa da offrire l'ultima volta che ho esaminato le librerie di registrazione in C ++, quindi non so di boost :: log.
sabato

1
@Joe: capisci il termine "modelli di espressione" ??
sabato

1
Pensavo di averlo fatto, ma ora ho scaricato e iniziato a leggere il codice sorgente templog, e sembra che C ++ mi abbia superato di nuovo.

1
@sbi: Parte della mia confusione è stata la tua affermazione "passato immediatamente attraverso diversi livelli" - In inglese in una sola volta può significare sia immediatamente che insieme , che in questo caso sono opposti. L'ho letto come il primo e tu (ora ovviamente per me) intendevi il secondo. Grazie per aver dedicato del tempo a spiegarlo.


0

Potresti essere interessato al set di strumenti Baical :

  • Libreria open source e multipiattaforma (Win, Linux, x86 / x64) per registri, tracce e telemetria - P7
  • Incredibilmente veloce (progettato per dispositivi integrati): 3 milioni di log al secondo da rete, 5 milioni da archiviare su CPU moderna. Non conosco nessun'altra libreria per la registrazione che fornisce tale velocità e informazioni così dettagliate per ogni messaggio di registro.
  • Discussione sicura
  • Ogni messaggio di traccia contiene:
    • messaggio testuale
    • livello
    • tempo preciso (100 ns)
    • file di origine, nome e riga della funzione
    • ID modulo e nome modulo
    • ID thread e nome thread
    • indice del core del processore
  • Applicazione server per ricevere e visualizzare registri e telemetria
  • È possibile raccogliere, analizzare, cercare, filtrare i log da più fonti in tempo reale

Dal 06/2017% s nella formattazione delle stringhe non è ancora supportato.
Romeno,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.