]> source.dussan.org Git - tigervnc.git/commitdiff
Track statistics for CopyRect
authorPierre Ossman <ossman@cendio.se>
Tue, 22 Sep 2015 09:09:00 +0000 (11:09 +0200)
committerPierre Ossman <ossman@cendio.se>
Tue, 22 Sep 2015 09:09:00 +0000 (11:09 +0200)
common/rfb/EncodeManager.cxx
common/rfb/EncodeManager.h

index 9122cd75a36ddcc0156e64e28ec923c86afb7df1..0cd5206023b82b50ac865a4e063214340ebcfd01 100644 (file)
@@ -135,6 +135,7 @@ EncodeManager::EncodeManager(SConnection* conn_) : conn(conn_)
   encoders[encoderZRLE] = new ZRLEEncoder(conn);
 
   updates = 0;
+  memset(&copyStats, 0, sizeof(copyStats));
   stats.resize(encoderClassMax);
   for (iter = stats.begin();iter != stats.end();++iter) {
     StatsVector::value_type::iterator iter2;
@@ -170,6 +171,25 @@ void EncodeManager::logStats()
 
   vlog.info("Framebuffer updates: %u", updates);
 
+  if (copyStats.rects != 0) {
+    vlog.info("  %s:", "CopyRect");
+
+    rects += copyStats.rects;
+    pixels += copyStats.pixels;
+    bytes += copyStats.bytes;
+    equivalent += copyStats.equivalent;
+
+    ratio = (double)copyStats.equivalent / copyStats.bytes;
+
+    siPrefix(copyStats.rects, "rects", a, sizeof(a));
+    siPrefix(copyStats.pixels, "pixels", b, sizeof(b));
+    vlog.info("    %s: %s, %s", "Copies", a, b);
+    iecPrefix(copyStats.bytes, "B", a, sizeof(a));
+    vlog.info("    %*s  %s (1:%g ratio)",
+              (int)strlen("Copies"), "",
+              a, ratio);
+  }
+
   for (i = 0;i < stats.size();i++) {
     // Did this class do anything at all?
     for (j = 0;j < stats[i].size();j++) {
@@ -450,11 +470,22 @@ void EncodeManager::writeCopyRects(const UpdateInfo& ui)
   std::vector<Rect> rects;
   std::vector<Rect>::const_iterator rect;
 
+  beforeLength = conn->getOutStream()->length();
+
   ui.copied.get_rects(&rects, ui.copy_delta.x <= 0, ui.copy_delta.y <= 0);
   for (rect = rects.begin(); rect != rects.end(); ++rect) {
+    int equiv;
+
+    copyStats.rects++;
+    copyStats.pixels += rect->area();
+    equiv = 12 + rect->area() * conn->cp.pf().bpp/8;
+    copyStats.equivalent += equiv;
+
     conn->writer()->writeCopyRect(*rect, rect->tl.x - ui.copy_delta.x,
                                    rect->tl.y - ui.copy_delta.y);
   }
+
+  copyStats.bytes += conn->getOutStream()->length() - beforeLength;
 }
 
 void EncodeManager::writeSolidRects(Region *changed, const PixelBuffer* pb)
index a3df8f746160af77c90b863370426175bbbf2612..79db950c9af5d8546687fcf238bee83e3237620d 100644 (file)
@@ -112,6 +112,7 @@ namespace rfb {
     typedef std::vector< std::vector<struct EncoderStats> > StatsVector;
 
     unsigned updates;
+    EncoderStats copyStats;
     StatsVector stats;
     int activeType;
     int beforeLength;