(C ++) oyunlar için günlük kütüphanesi [kapalı]


15

Çok sayıda günlük kütüphanesi biliyorum ama çok fazla test etmedim. (GoogleLog, Pantheios, yaklaşan destek :: günlük kütüphanesi ...)

Oyunlarda, özellikle uzak çok oyunculu ve çok iş parçacıklı oyunlarda, sonunda tüm günlükleri kaldırsanız bile günlük kaydı hata ayıklama için çok önemlidir.

Diyelim ki günlüklere ihtiyaç duyan bir PC oyunu (konsol değil) yapıyorum (çok oyunculu ve çok iş parçacıklı ve / veya çok işlemli) ve giriş için bir kütüphane aramak için iyi nedenlerim var (örneğin, zamanım yok veya ben Davam için doğru bir şekilde yazma yeteneğimden emin değilim).

İhtiyacım olduğunu varsayarak:

  1. verim
  2. kullanım kolaylığı (akışa veya biçimlendirmeye veya buna benzer bir şeye izin ver)
  3. güvenilir (sızıntı veya çökme!)
  4. platformlar arası (en azından Windows, MacOSX, Linux / Ubuntu)

Hangi günlük kütüphanesini önerirsiniz?

Şu anda, boost :: log'un en esnek olanı olduğunu düşünüyorum (hatta uzaktan oturum açabilirsiniz!), Ancak iyi bir performans güncellemesine sahip değilsiniz : yüksek performans için, ancak henüz yayınlanmadı. Pantheios'a sıklıkla atıfta bulunulur, ancak performans ve kullanım konusunda karşılaştırma noktalarım yok. Kendi lib'imi uzun zamandır kullandım ama çok iş parçacığını yönetmediğini biliyorum, bu yüzden yeterince hızlı olsa bile büyük bir sorun. Google Log ilginç görünüyor, sadece test etmem gerekiyor, ancak bu kütüphaneleri ve daha fazlasını karşılaştırdıysanız, tavsiyeniz iyi olabilir.

Oyunlar genellikle hata ayıklamak için karmaşıkken performans gerektirir, bu nedenle özel durumumuzda net avantajlara sahip olan günlük kitaplıklarını bilmek iyi olacaktır.


3
Bahsetmediğiniz önemli bir gereklilik, günlükleri ne kullanmak istediğinizdir. Günlüğe kaydetme, örneğin hata ayıklama iletileri, tasarımcılar için metrikler, müşteri desteği için karakter durumu ve kredi kartı işlemleri için gereksinimler farklıdır. Genel olarak, performans, programcılar için kullanım kolaylığı, çevrimdışı ayrıştırma kolaylığı / hızı ve duruma bağlı olarak dayanıklılık özelliklerini değiştirebilirsiniz.

Bu doğru, ancak "eksiksiz" bir günlük kaydı çözümünün, kullanıcıların sizin tanımladığınız gibi farklı türde günlükler kurmasına izin vereceğini varsayıyordum. Bu hassasiyeti soruda önemli buluyorsanız, lütfen misafirim olun ve soruya ekleyin.
Klaim

Yanıtlar:


8

soket kullanarak günlük (herhangi bir soket sarıcı yeterli olabilir) + web tarayıcı websocket => mümkün olan en çok yönlü, mütevazi günlük aracı, saatlerce hata ayıklama kazanacak ve göz ağrısını önleyecektir.

  • zaman uyumsuz (tarayıcıdaki tüm işi etkiliyorsa hız)
  • biçimlendirilmiş (renk, boyut vb.)
  • güvenilir (prizler ...)
  • platformlar arası (tarayıcı)

Şimdi, bonus:

  • dinamik filtreleme çok kolay yapılır (gerekirse javascript regex kullanarak)
  • günlük geçmişi, bellek ve karşılaştırma ile ("tarayıcı içi" veritabanındaki HTML5 spesifikasyonu)
  • Bellek , bellek parçalanması vb.Gibi herhangi bir verinin (SVG veya tuval veya herhangi bir şey kullanılarak) bazı grafiklerini oluşturmanın kolay yolu ...
  • herhangi bir verinin bir 2D grafiğini yapmanın kolay yolu ( kd-ağacı alt bölümü ? potansiyel alan? hatta sadece değişken değer değişimi? vb ...)
  • uzaktan günlüğe kaydetmeye izin verir (tarayıcıyı başka bir bilgisayar kullanarak)
  • tarayıcı deposunda html5 kullanarak günlük oturumu parametrelerini (geçerli günlük filtreleri vb. ve hatta her biri için notlar) saklayabilirsiniz.
  • sadece bir tıklama ile hata raporu oluşturmak veya trac biletleri bağlamak çok kolay
  • zaman çizelgesi gui ile günlüğe kaydetmeyi kolayca geri sarma yeteneği

ve günlük kaydı dışında daha birçok görev:

  • profil bilgisi sağlar (grafikler ...)
  • hatta konsol olarak (tarayıcıdan komut gönder) veya hatta bazı HTML veya hatta flash ui kullanarak hızlı GUI ile hizmet verebilir
  • resim tarayıcıda farklı (soketi kullanarak resim gönderin ve tuval resim piksel özelliklerini kullanarak tarayıcıda karşılaştırın)
  • vb...

(Yukarıdakilerin neredeyse tamamı flaş yuvaları kullanılarak yapılabilir, veritabanı özelliklerini kaydedin)

Şimdi biliyorum ki bu şeyi kurmak biraz uzun sürüyor. Ama gerçekten uzun projede zaman kazanmak, zor hata ayıklama durumu (oyunlarda olduğu gibi). Hata ayıklayıcılardan beri kullandığım en güçlü şey ...

Not 1: oyun ağ kodunda hata ayıklarken tek dezavantaj => çift kontrol yan etkisi (soket arabellek boyutu, gecikme, bant genişliği vb. Üzerindeki etki)

Not 2: güvenlik nedeniyle varsayılan websocket tarafından devre dışı bırakılan bazı tarayıcılar, şunlara bakın: etkinleştirildiğinden emin olmak için bir şeyler yapılandırın.


1
Yanılıyorsam beni düzeltin, ancak bu yalnızca günlük çıktısının nereye yönlendirileceğini gösterir, hayır? Gerçek bir günlük kütüphanesi de derleme zamanında filtreleme (performans bir sorunsa çok önemlidir), biçimlendirme ve günlük iletileri oluşturmak için kullanımı kolay bir sözdizimi sağlar.
sbi

@sbi Uygulama tarafında küresel bir açık veya kapalı şey. "Tarayıcı günlük istemcisi" filtreleme, sözdizimi yapar, ancak her zaman tüm günlüğü alır. Radikaldir, ancak geliştirici sırasında her zaman her şeyi günlüğe kaydetmelisiniz, böylece rastladığınız hataları kolayca yakalayabilir / çoğaltabilirsiniz. Eğer optimize etmek varsa, 's tarayıcı tarafı yine: Eğer doğrudan ikili veri (I + yüzer), oturum açabilir, sen dize kullanarak oturum bağlı değiliz soketi kullanmak kalın (... daha hızlı başka bir dize bazlı günlük lib daha dize tarayıcı tarafı ile eşleşen ...)
Tuan Kuranes

1
Bunun çok pratik olduğunu görebiliyor olsam da, gerçekten sadece bir kaydedicinin arka ucu (templog'un "log sink", IIRC olarak adlandırdığı şey). Performans, listelenen gereksinimlerden biridir. Ben hata ayıklama sırasında bir kod parçasına günlük ifadeleri eklemek gerektiğini bulduk, ama bir kez o ve bu kod parçasını çalıştırmak çok konuşkan olurdu ve ne zaman o gürültü sonra çalışıyorum boğulur ve ayrıca maliyet çok fazla performans. Bu yüzden birkaç satır kod değiştirerek tüm kod parçaları üzerinde günlük seviyesini yukarı ve aşağı tonlamak istiyorum. Log lib'in orta katmanı sizin için bunu yapar.
sbi

@sbi: karşılaştırmalar gerektirebilir, ancak en düşük kayıt düzeyinde bile en iyi kayıt kütüphanesinin, her şeyi kaydeden bir ikili kayıt cihazından daha pahalıya mal olma ihtimali vardır. Tek bir "ikili-char" CPU Döngüsü boşa bile ... Yani gerçekten daha fazla özellik VE daha fazla performans.
Tuan Kuranes

Templog'u gerçekten kullanmaya karar vermeden önce bazı testler yaptık. Günlük kaydı, belirli bir günlük iletisinin şiddeti, kökeni veya ne olursa olsun kapatılırsa ve derleyici, parametreleri değerlendirirken herhangi bir yan etki olmadığını bulabilirse, VC gerçekten de tam gelişmiş bir optimizasyon yapabilir hiçlik içine günlük ifadesi. Ve hız söz konusu olduğunda, ilk başta yürütülecek olmayan kodu yenemezsiniz.
sbi

8

Performans söz konusu olduğunda, templog'u neredeyse yenilmemiş buldum . Bilgilerin hiç günlüğe kaydedileceği belirlenene kadar günlük deyimlerinin değerlendirilmesini ertelemek için ifade şablonlarını kullanır. Ayrıca günlüğe kaydetmeyi kısmen kapatabildiğinizden (bir günlük iletisinin önem derecesine, kaynağına ve hedeflenen kitlesine bağlı olarak), bu günlük kaydı ifadelerinden bazıları derleyici tarafından sürüm derlemeleri tarafından sıfır koduna çıkarılabilir. (Bunun aslında VC ile olduğunu gördüm.)

Son zamanlarda kütüphaneye pek bir şey yapılmadı ve SO'daki diğer kişiler bagajın bazı açılardan eksik olduğunu gördüler, ancak eskiden çalıştığım bir şirkette adamı oldukça duyarlı bulduk ve o zaman inek işçilerimden biri bile taahhüt erişimi var ve ona bazı kod ekledi, böylece bir atış değerinde bulabilirsiniz.

Gereksinimlerinizi sıralamak için:

verim

En iyi buldum. Özellikle derleme zamanında günlük iletilerini hariç tutma ve derleyicinin bunları tamamen ortadan kaldırması çok cazipti.

kullanım kolaylığı (akışa veya biçimlendirmeye veya buna benzer bir şeye izin ver)

Yanlış bir şey yaptığınızda, şablonların meta malzemelerinin klasik korkunç derleyici hata mesajları var, ancak kullanım kolaylığı söz konusu olduğunda, bu

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

yenmek zor.
Ancak, önceden paketlenmiş birkaç tane (stderr, dosya, Windows günlüğü, vb.) Bu kadar sofistike olmadığı için kendi günlük lavabolarınızı (günlük mesajlarının gittiği yer) oluşturmanız gerekebilir. Performansın temel bir hedef olması nedeniyle, her şeyin iç yapısı biraz karmaşıktır (günlük mesajı formatlayıcılarının günlük lavabolarına oldukça karışık olması gibi), ancak bunu yaptık (buna yardımcı olan bir hata ayıklayıcıya adım attığımı hatırlıyorum) ve bir kez kendi mesaj biçimlendiricilerinizi yazmanın veya günlükleri kaydetmenin o kadar zor olmadığını anladım.

güvenilir (sızıntı veya çökme!)

Bu tür ciddi sorunları bulamadan kullandık. Orada neredeyse hiç dinamik bellek tahsisi yok, bu yüzden yanlış bir şey yaptığını hayal etmek bile zor. Tabii ki, sadece tek bir üründe gerçek dünya testlerine tabi tuttuk.

platformlar arası (en azından Windows, MacOSX, Linux / Ubuntu)

Onu kullandığımızda, Win32, OSX ve aralarında Ubuntu gibi birkaç farklı Linux dağıtımında kullandık.

Çoklu iş parçacığına gelince: Bunu kullanmadık, ancak lib'in mimarisini hatırladığım kadarıyla, bunu sadece günlük lavabolarında ele almanız gerekir. ICBWT.


Teşekkürler, bunu bilmiyordum. En azından orijinal fikirde, boost :: log'un basitleştirilmiş (ve performanslı) bir versiyonuna benziyor.
Klaim

@Klaim: En son C ++ günlük kitaplıklarına baktığımda boost'un bir şeyleri olduğunu düşünmüyorum, bu yüzden boost :: log hakkında bilmiyorum.
sbi

1
@Joe: "İfade şablonları" terimini anlıyor musunuz ??
sbi

1
Yaptım sanıyordum, ama şimdi indirdim ve templog kaynak kodunu okumaya başladım ve C ++ beni yeniden aşıyor gibi görünüyor.

1
@sbi: Karışıklığımın bir kısmı, "bir kerede birkaç katmandan geçti" ifadenizdi - Bir kerede İngilizce , hemen ya da birlikte anlamına gelebilir , bu durumda karşıttır. İlk olarak okudum ve siz (şimdi açıkçası benim için) ikincisi demek istediniz. Açıklamak için zaman ayırdığınız için teşekkür ederiz.


0

İlginizi çekebilir Baical araçları seti:

  • Günlükler, izler ve telemetri için açık kaynaklı ve çapraz platform (Win, Linux, x86 / x64) kütüphanesi - P7
  • İnanılmaz derecede hızlı (gömülü aygıtlar için tasarlanmıştır) - ağa saniyede 3 milyon günlük, modern CPU'da 5 milyon dosya. Günlük kaydı için her günlük mesajı için bu kadar hızlı ve ayrıntılı bilgi sağlayan başka bir kütüphane bilmiyorum.
  • İplik kasası
  • Her izleme mesajı şunları içerir:
    • SMS
    • seviye
    • kesin zaman (100ns)
    • kaynak dosya, işlev adı ve satır
    • modül kimliği ve modül adı
    • evre kimliği ve evre adı
    • işlemci çekirdek dizini
  • Günlükleri ve telemetriyi almak ve görüntülemek için sunucu uygulaması
  • Birden çok kaynaktan günlükleri gerçek zamanlı olarak toplayabilir, analiz edebilir, arayabilir, filtreleyebilirsiniz

06/2017 tarihinden itibaren dize biçimlendirmesinde% s henüz desteklenmemektedir.
Romeno
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.