test_perf_broadphase.gd 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. extends Test
  2. const BOX_SIZE = Vector3(0.8, 0.8, 0.8)
  3. const BOX_SPACE = Vector3(1.0, 1.0, 1.0)
  4. export(int, 1, 1000) var row_size = 20
  5. export(int, 1, 1000) var column_size = 20
  6. export(int, 1, 1000) var depth_size = 20
  7. var _objects = []
  8. var _log_physics = false
  9. var _log_physics_time = 0
  10. var _log_physics_time_start = 0
  11. func _ready():
  12. yield(start_timer(1.0), "timeout")
  13. if is_timer_canceled():
  14. return
  15. _log_physics_start()
  16. _create_objects()
  17. yield(wait_for_physics_ticks(5), "wait_done")
  18. _log_physics_stop()
  19. yield(start_timer(1.0), "timeout")
  20. if is_timer_canceled():
  21. return
  22. _log_physics_start()
  23. _add_objects()
  24. yield(wait_for_physics_ticks(5), "wait_done")
  25. _log_physics_stop()
  26. yield(start_timer(1.0), "timeout")
  27. if is_timer_canceled():
  28. return
  29. _log_physics_start()
  30. _move_objects()
  31. yield(wait_for_physics_ticks(5), "wait_done")
  32. _log_physics_stop()
  33. yield(start_timer(1.0), "timeout")
  34. if is_timer_canceled():
  35. return
  36. _log_physics_start()
  37. _remove_objects()
  38. yield(wait_for_physics_ticks(5), "wait_done")
  39. _log_physics_stop()
  40. yield(start_timer(1.0), "timeout")
  41. if is_timer_canceled():
  42. return
  43. Log.print_log("* Done.")
  44. func _exit_tree():
  45. for object in _objects:
  46. object.free()
  47. func _physics_process(_delta):
  48. if _log_physics:
  49. var time = OS.get_ticks_usec()
  50. var time_delta = time - _log_physics_time
  51. var time_total = time - _log_physics_time_start
  52. _log_physics_time = time
  53. Log.print_log(" Physics Tick: %.3f ms (total = %.3f ms)" % [0.001 * time_delta, 0.001 * time_total])
  54. func _log_physics_start():
  55. _log_physics = true
  56. _log_physics_time_start = OS.get_ticks_usec()
  57. _log_physics_time = _log_physics_time_start
  58. func _log_physics_stop():
  59. _log_physics = false
  60. func _create_objects():
  61. _objects.clear()
  62. Log.print_log("* Creating objects...")
  63. var timer = OS.get_ticks_usec()
  64. var pos_x = -0.5 * (row_size - 1) * BOX_SPACE.x
  65. for row in row_size:
  66. var pos_y = -0.5 * (column_size - 1) * BOX_SPACE.y
  67. for column in column_size:
  68. var pos_z = -0.5 * (depth_size - 1) * BOX_SPACE.z
  69. for depth in depth_size:
  70. # Create a new object and shape every time to avoid the overhead of connecting many bodies to the same shape.
  71. var box = create_rigidbody_box(BOX_SIZE)
  72. box.gravity_scale = 0.0
  73. box.transform.origin = Vector3(pos_x, pos_y, pos_z)
  74. _objects.push_back(box)
  75. pos_z += BOX_SPACE.z
  76. pos_y += BOX_SPACE.y
  77. pos_x += BOX_SPACE.x
  78. timer = OS.get_ticks_usec() - timer
  79. Log.print_log(" Create Time: %.3f ms" % (0.001 * timer))
  80. func _add_objects():
  81. var root_node = $Objects
  82. Log.print_log("* Adding objects...")
  83. var timer = OS.get_ticks_usec()
  84. for object in _objects:
  85. root_node.add_child(object)
  86. timer = OS.get_ticks_usec() - timer
  87. Log.print_log(" Add Time: %.3f ms" % (0.001 * timer))
  88. func _move_objects():
  89. Log.print_log("* Moving objects...")
  90. var timer = OS.get_ticks_usec()
  91. for object in _objects:
  92. object.transform.origin += BOX_SPACE
  93. timer = OS.get_ticks_usec() - timer
  94. Log.print_log(" Move Time: %.3f ms" % (0.001 * timer))
  95. func _remove_objects():
  96. var root_node = $Objects
  97. Log.print_log("* Removing objects...")
  98. var timer = OS.get_ticks_usec()
  99. # Remove objects in reversed order to avoid the overhead of changing children index in parent.
  100. var object_count = _objects.size()
  101. for object_index in range(object_count):
  102. root_node.remove_child(_objects[object_count - object_index - 1])
  103. timer = OS.get_ticks_usec() - timer
  104. Log.print_log(" Remove Time: %.3f ms" % (0.001 * timer))