Home Reference Source

viewer/stats.js

  1. /**
  2. * Keeps track of statistics. Initially only a UI, but can also be used "headless" by given a false value for the `active` constructor argument
  3. */
  4. export class Stats {
  5. constructor(active = true) {
  6. this.active = active;
  7. this.parameters = {};
  8. this.dirty = true;
  9. this.updateRequested = true;
  10. this.statsId = "stats";
  11. this.groups = {
  12. "Tiling": [
  13. "Rendering",
  14. "Empty",
  15. "Full",
  16. "Loading",
  17. "Loaded"
  18. ],
  19. "Loading time": [
  20. "Layer 1",
  21. "Layer 2",
  22. "Total"
  23. ], "Rendering": [
  24. "FPS"
  25. ], "Stats": [
  26. "Updates"
  27. ], "Models": [
  28. "Name",
  29. "Models to load",
  30. "Models loaded",
  31. "Objects",
  32. "Geometries",
  33. "Geometries reused",
  34. ], "Primitives": [
  35. "Primitives to load (L1)",
  36. "Primitives to load (L2)",
  37. "Nr primitives loaded",
  38. "Nr primitives hidden"
  39. ], "Data": [
  40. "GPU bytes",
  41. "GPU bytes reuse",
  42. "GPU bytes total"
  43. ], "Drawing": [
  44. "Triangles to draw (L1)",
  45. "Triangles to draw (L2)",
  46. "Draw calls per frame (L1)",
  47. "Draw calls per frame (L2)"
  48. ], "Network": [
  49. "Bytes OTL"
  50. ], "Buffers": [
  51. "Buffer groups",
  52. ], "BufferSet pool": [
  53. "Used",
  54. "Available",
  55. "Total memory"
  56. ], "Renderer settings": [
  57. "Object colors",
  58. "Small indices if possible",
  59. "Quantize normals",
  60. "Quantize vertices"
  61. ], "Loader settings": [
  62. "Object colors",
  63. "Quantize normals",
  64. "Quantize vertices",
  65. ]
  66. };
  67.  
  68. this.init();
  69. }
  70. init() {
  71. for (var groupName in this.groups) {
  72. var group = this.groups[groupName];
  73. var groupObject = {};
  74. this.parameters[groupName] = groupObject;
  75. for (var key of group) {
  76. groupObject[key] = 0;
  77. }
  78. }
  79. }
  80.  
  81. get(group, key) {
  82. return this.parameters[group][key];
  83. }
  84.  
  85. setParameter(group, key, value) {
  86. var group = this.parameters[group];
  87. if (group[key] == value) {
  88. return;
  89. }
  90. group[key] = value;
  91. this.dirty = true;
  92. }
  93.  
  94. inc(groupName, key, value) {
  95. var group = this.parameters[groupName];
  96. if (group[key] == null) {
  97. group[key] = 0;
  98. }
  99. if (value == null) {
  100. group[key] = group[key] + 1;
  101. } else {
  102. group[key] = group[key] + value;
  103. }
  104. this.dirty = true;
  105. }
  106.  
  107. dec(groupName, key, value) {
  108. var group = this.parameters[groupName];
  109. if (group[key] == null) {
  110. group[key] = 0;
  111. }
  112. if (value == null) {
  113. group[key] = group[key] - 1;
  114. } else {
  115. group[key] = group[key] - value;
  116. }
  117. this.dirty = true;
  118. }
  119.  
  120. numberWithCommas(x) {
  121. return Number(x).toLocaleString();
  122. }
  123.  
  124. requestUpdate() {
  125. this.updateRequested = true;
  126. }
  127. update() {
  128. if (this.active && document.getElementById(this.statsId)) {
  129. if (!this.updateRequested) {
  130. return;
  131. }
  132. this.inc("Stats", "Updates");
  133. this.updates++;
  134. for (var groupName in this.groups) {
  135. var group = this.groups[groupName];
  136. var groupElement = document.getElementById(groupName + "-group");
  137. if (groupElement == null) {
  138. groupElement = document.createElement("div");
  139. groupElement.id = groupName + "-group";
  140. document.getElementById(this.statsId).appendChild(groupElement);
  141. var groupTitle = document.createElement("h3");
  142. groupTitle.innerHTML = groupName;
  143. groupElement.appendChild(groupTitle);
  144. }
  145. for (var key of group) {
  146. var fullKey = groupName + "_" + key;
  147. var value = this.parameters[groupName][key];
  148. var element = document.getElementById(fullKey);
  149. if (element == null) {
  150. element = document.createElement("div");
  151. element.id = fullKey;
  152. groupElement.appendChild(element);
  153. }
  154. var newStringValue = value;
  155. if (value == null) {
  156. newStringValue = key + ": 0";
  157. } else {
  158. if (typeof value == "number") {
  159. newStringValue = key + ": " + this.numberWithCommas(value);
  160. } else {
  161. newStringValue = key + ": " + value;
  162. }
  163. }
  164. if (newStringValue != element.textContent) {
  165. element.textContent = newStringValue;
  166. }
  167. }
  168. }
  169. this.updateRequested = false;
  170. this.dirty = false;
  171. }
  172. }
  173. cleanup() {
  174. this.parameters = {};
  175. this.init();
  176. var stats = document.getElementById(this.statsId);
  177. if (stats != null) {
  178. while (stats.firstChild) {
  179. stats.removeChild(stats.firstChild);
  180. }
  181. this.dirty = true;
  182. }
  183. }
  184. }