stats.ts 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. /**
  2. * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  5. */
  6. import { Renderable } from './renderable';
  7. export default function createStats (renderables: Renderable[]) {
  8. const prevGpuTimes: number[] = []
  9. for (let i = 0; i < renderables.length; i++) {
  10. prevGpuTimes[i] = 0
  11. }
  12. let frameTimeCount = 0
  13. let totalTime = 1.1
  14. let N = 50
  15. const totalFrameTime: number[] = []
  16. const avgFrameTime: number[] = []
  17. for (let i = 0; i < renderables.length; ++i) {
  18. totalFrameTime[i] = 0.0
  19. avgFrameTime[i] = 0.0
  20. }
  21. return {
  22. add: (renderable: Renderable) => {
  23. renderables.push(renderable)
  24. prevGpuTimes.push(0)
  25. totalFrameTime.push(0)
  26. avgFrameTime.push(0)
  27. },
  28. update: (deltaTime: number) => {
  29. totalTime += deltaTime
  30. if (totalTime > 1.0) {
  31. totalTime = 0
  32. // for (let i = 0; i < renderables.length; i++) {
  33. // const renderable = renderables[i]
  34. // const str = `${renderable.name}: ${Math.round(100.0 * avgFrameTime[i]) / 100.0}ms`
  35. // console.log(str)
  36. // }
  37. const sumFrameTime = avgFrameTime.reduce((x: number, y: number) => x + y, 0)
  38. const str = `${Math.round(100.0 * sumFrameTime) / 100.0}ms`
  39. console.log(str)
  40. }
  41. frameTimeCount++
  42. for (let i = 0; i < renderables.length; i++) {
  43. const renderable = renderables[i]
  44. const frameTime = renderable.stats.gpuTime - prevGpuTimes[i]
  45. totalFrameTime[i] += frameTime
  46. if (frameTimeCount === N) {
  47. avgFrameTime[i] = totalFrameTime[i] / N
  48. totalFrameTime[i] = 0.0
  49. }
  50. prevGpuTimes[i] = renderable.stats.gpuTime
  51. }
  52. if (frameTimeCount === N) frameTimeCount = 0
  53. }
  54. }
  55. }