level_load_unload_stress.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. #
  2. # Copyright (c) Contributors to the Open 3D Engine Project.
  3. # For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. #
  5. # SPDX-License-Identifier: Apache-2.0 OR MIT
  6. #
  7. #
  8. import os
  9. import azlmbr.legacy.general as azgeneral
  10. def RunLevelReloadTest(levels: list[str],
  11. iterationsCount: int = 3,
  12. iterationsEnterExit: int = 1,
  13. idleFramesOpen: int = 3,
  14. idleFramesEnter: int = 3,
  15. idleFramesExit: int = 3):
  16. """
  17. For each level name listed in @levels:
  18. 1- Loads the level
  19. 2- Waits (if requested)
  20. 3- Enters/Exit Game mode as many times defined in @iterationsEnterExit
  21. Repeats all of the above @iterationsCount times.
  22. """
  23. for idx in range(iterationsCount):
  24. print(f"Iteration {idx}")
  25. for levelName in levels:
  26. azgeneral.open_level_no_prompt(levelName)
  27. if idleFramesOpen > 0:
  28. azgeneral.idle_wait_frames(idleFramesOpen)
  29. for jdx in range(iterationsEnterExit):
  30. print(f"Iteration {idx}. Enter/Exit {jdx}")
  31. azgeneral.enter_game_mode()
  32. if idleFramesEnter > 0:
  33. azgeneral.idle_wait_frames(idleFramesEnter)
  34. azgeneral.exit_game_mode()
  35. if idleFramesExit > 0:
  36. azgeneral.idle_wait_frames(idleFramesExit)
  37. # Quick Example on how to run this test using default levels from AutomatedTesting for 10 iterations:
  38. # pyRunFile C:\GIT\o3de\Gems\EditorPythonBindings\Editor\Scripts\level_load_unload_stress.py -i 10
  39. # pyRunFile C:\GIT\o3de\Gems\EditorPythonBindings\Editor\Scripts\level_load_unload_stress.py -i 10 --level CommsCenter,CypunkAptInterior,PoliceStation,TempleOfEnlightment
  40. # pyRunFile C:\GIT\o3de\Gems\EditorPythonBindings\Editor\Scripts\level_load_unload_stress.py -n 1 -x 1 --level CommsCenter,CypunkAptInterior,PoliceStation,TempleOfEnlightment
  41. def MainFunc():
  42. import argparse
  43. parser = argparse.ArgumentParser(
  44. description="Level loading test that validates that there are no crashes due to changing levels quickly."
  45. )
  46. parser.add_argument(
  47. "-i",
  48. "--iterations",
  49. type=int,
  50. default=3,
  51. help="How many times will load all levels in the list",
  52. )
  53. parser.add_argument(
  54. "-e",
  55. "--enter_exit_iterations",
  56. type=int,
  57. default=2,
  58. help="How many times will enter and exit game mode, for each level in the list.",
  59. )
  60. parser.add_argument(
  61. "-o",
  62. "--idle_frames_open",
  63. type=int,
  64. default=3,
  65. help="How many frames to wait after opening a level",
  66. )
  67. parser.add_argument(
  68. "-n",
  69. "--idle_frames_enter",
  70. type=int,
  71. default=3,
  72. help="How many frames to wait after entering game mode.",
  73. )
  74. parser.add_argument(
  75. "-x",
  76. "--idle_frames_exit",
  77. type=int,
  78. default=3,
  79. help="How many frames to wait after exiting game mode.",
  80. )
  81. parser.add_argument(
  82. "--levels",
  83. default="Graphics/hermanubis,Graphics/macbeth_shaderballs",
  84. help="Comma seperated list of level names.",
  85. )
  86. args = parser.parse_args()
  87. iterations = args.iterations
  88. iterationsEnterExit = args.enter_exit_iterations
  89. idleFramesOpen = args.idle_frames_open
  90. idleFramesEnter = args.idle_frames_enter
  91. idleFramesExit = args.idle_frames_exit
  92. levels = args.levels.split(",")
  93. print(f"Original levels list:\n{levels}")
  94. nonEmptyNames = []
  95. for levelName in levels:
  96. if levelName:
  97. nonEmptyNames.append(levelName)
  98. print(f"Valid levels list:\n{nonEmptyNames}")
  99. RunLevelReloadTest(nonEmptyNames, iterations, iterationsEnterExit, idleFramesOpen, idleFramesEnter, idleFramesExit)
  100. print(f"PASSED. Completed {iterations} iterations!")
  101. if __name__ == "__main__":
  102. MainFunc()