babylon.sceneOptimizer.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. var __extends = this.__extends || function (d, b) {
  2. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  3. function __() { this.constructor = d; }
  4. __.prototype = b.prototype;
  5. d.prototype = new __();
  6. };
  7. var BABYLON;
  8. (function (BABYLON) {
  9. // Standard optimizations
  10. var SceneOptimization = (function () {
  11. function SceneOptimization(priority) {
  12. if (typeof priority === "undefined") { priority = 0; }
  13. this.priority = priority;
  14. this.apply = function (scene) {
  15. return true;
  16. };
  17. }
  18. return SceneOptimization;
  19. })();
  20. BABYLON.SceneOptimization = SceneOptimization;
  21. var TextureSceneOptimization = (function (_super) {
  22. __extends(TextureSceneOptimization, _super);
  23. function TextureSceneOptimization(maximumSize, priority) {
  24. if (typeof maximumSize === "undefined") { maximumSize = 1024; }
  25. if (typeof priority === "undefined") { priority = 0; }
  26. var _this = this;
  27. _super.call(this, priority);
  28. this.maximumSize = maximumSize;
  29. this.priority = priority;
  30. this.apply = function (scene) {
  31. var allDone = true;
  32. for (var index = 0; index < scene.textures.length; index++) {
  33. var texture = scene.textures[index];
  34. if (!texture.canRescale) {
  35. continue;
  36. }
  37. var currentSize = texture.getSize();
  38. var maxDimension = Math.max(currentSize.width, currentSize.height);
  39. if (maxDimension > _this.maximumSize) {
  40. texture.scale(0.5);
  41. allDone = false;
  42. }
  43. }
  44. return allDone;
  45. };
  46. }
  47. return TextureSceneOptimization;
  48. })(SceneOptimization);
  49. BABYLON.TextureSceneOptimization = TextureSceneOptimization;
  50. var HardwareScalingSceneOptimization = (function (_super) {
  51. __extends(HardwareScalingSceneOptimization, _super);
  52. function HardwareScalingSceneOptimization(maximumScale, priority) {
  53. if (typeof maximumScale === "undefined") { maximumScale = 2; }
  54. if (typeof priority === "undefined") { priority = 0; }
  55. var _this = this;
  56. _super.call(this, priority);
  57. this.maximumScale = maximumScale;
  58. this.priority = priority;
  59. this._currentScale = 1;
  60. this.apply = function (scene) {
  61. _this._currentScale++;
  62. scene.getEngine().setHardwareScalingLevel(_this._currentScale);
  63. return _this._currentScale >= _this.maximumScale;
  64. };
  65. }
  66. return HardwareScalingSceneOptimization;
  67. })(SceneOptimization);
  68. BABYLON.HardwareScalingSceneOptimization = HardwareScalingSceneOptimization;
  69. var ShadowsSceneOptimization = (function (_super) {
  70. __extends(ShadowsSceneOptimization, _super);
  71. function ShadowsSceneOptimization() {
  72. _super.apply(this, arguments);
  73. this.apply = function (scene) {
  74. scene.shadowsEnabled = false;
  75. return true;
  76. };
  77. }
  78. return ShadowsSceneOptimization;
  79. })(SceneOptimization);
  80. BABYLON.ShadowsSceneOptimization = ShadowsSceneOptimization;
  81. var PostProcessesSceneOptimization = (function (_super) {
  82. __extends(PostProcessesSceneOptimization, _super);
  83. function PostProcessesSceneOptimization() {
  84. _super.apply(this, arguments);
  85. this.apply = function (scene) {
  86. scene.postProcessesEnabled = false;
  87. return true;
  88. };
  89. }
  90. return PostProcessesSceneOptimization;
  91. })(SceneOptimization);
  92. BABYLON.PostProcessesSceneOptimization = PostProcessesSceneOptimization;
  93. var LensFlaresSceneOptimization = (function (_super) {
  94. __extends(LensFlaresSceneOptimization, _super);
  95. function LensFlaresSceneOptimization() {
  96. _super.apply(this, arguments);
  97. this.apply = function (scene) {
  98. scene.lensFlaresEnabled = false;
  99. return true;
  100. };
  101. }
  102. return LensFlaresSceneOptimization;
  103. })(SceneOptimization);
  104. BABYLON.LensFlaresSceneOptimization = LensFlaresSceneOptimization;
  105. var ParticlesSceneOptimization = (function (_super) {
  106. __extends(ParticlesSceneOptimization, _super);
  107. function ParticlesSceneOptimization() {
  108. _super.apply(this, arguments);
  109. this.apply = function (scene) {
  110. scene.particlesEnabled = false;
  111. return true;
  112. };
  113. }
  114. return ParticlesSceneOptimization;
  115. })(SceneOptimization);
  116. BABYLON.ParticlesSceneOptimization = ParticlesSceneOptimization;
  117. // Options
  118. var SceneOptimizerOptions = (function () {
  119. function SceneOptimizerOptions(targetFrameRate, trackerDuration) {
  120. if (typeof targetFrameRate === "undefined") { targetFrameRate = 60; }
  121. if (typeof trackerDuration === "undefined") { trackerDuration = 2000; }
  122. this.targetFrameRate = targetFrameRate;
  123. this.trackerDuration = trackerDuration;
  124. this.optimizations = new Array();
  125. }
  126. SceneOptimizerOptions.LowDegradationAllowed = function (targetFrameRate) {
  127. var result = new SceneOptimizerOptions(targetFrameRate);
  128. var priority = 0;
  129. result.optimizations.push(new ShadowsSceneOptimization(priority));
  130. result.optimizations.push(new LensFlaresSceneOptimization(priority));
  131. // Next priority
  132. priority++;
  133. result.optimizations.push(new PostProcessesSceneOptimization(priority));
  134. result.optimizations.push(new ParticlesSceneOptimization(priority));
  135. // Next priority
  136. priority++;
  137. result.optimizations.push(new TextureSceneOptimization(priority, 1024));
  138. return result;
  139. };
  140. SceneOptimizerOptions.ModerateDegradationAllowed = function (targetFrameRate) {
  141. var result = new SceneOptimizerOptions(targetFrameRate);
  142. var priority = 0;
  143. result.optimizations.push(new ShadowsSceneOptimization(priority));
  144. result.optimizations.push(new LensFlaresSceneOptimization(priority));
  145. // Next priority
  146. priority++;
  147. result.optimizations.push(new PostProcessesSceneOptimization(priority));
  148. result.optimizations.push(new ParticlesSceneOptimization(priority));
  149. // Next priority
  150. priority++;
  151. result.optimizations.push(new TextureSceneOptimization(priority, 512));
  152. // Next priority
  153. priority++;
  154. result.optimizations.push(new HardwareScalingSceneOptimization(priority, 2));
  155. return result;
  156. };
  157. SceneOptimizerOptions.HighDegradationAllowed = function (targetFrameRate) {
  158. var result = new SceneOptimizerOptions(targetFrameRate);
  159. var priority = 0;
  160. result.optimizations.push(new ShadowsSceneOptimization(priority));
  161. result.optimizations.push(new LensFlaresSceneOptimization(priority));
  162. // Next priority
  163. priority++;
  164. result.optimizations.push(new PostProcessesSceneOptimization(priority));
  165. result.optimizations.push(new ParticlesSceneOptimization(priority));
  166. // Next priority
  167. priority++;
  168. result.optimizations.push(new TextureSceneOptimization(priority, 256));
  169. // Next priority
  170. priority++;
  171. result.optimizations.push(new HardwareScalingSceneOptimization(priority, 4));
  172. return result;
  173. };
  174. return SceneOptimizerOptions;
  175. })();
  176. BABYLON.SceneOptimizerOptions = SceneOptimizerOptions;
  177. // Scene optimizer tool
  178. var SceneOptimizer = (function () {
  179. function SceneOptimizer() {
  180. }
  181. SceneOptimizer._CheckCurrentState = function (scene, options, currentPriorityLevel, onSuccess, onFailure) {
  182. // TODO: add an epsilon
  183. if (BABYLON.Tools.GetFps() >= options.targetFrameRate) {
  184. if (onSuccess) {
  185. onSuccess();
  186. }
  187. return;
  188. }
  189. // Apply current level of optimizations
  190. var allDone = true;
  191. var noOptimizationApplied = true;
  192. for (var index = 0; index < options.optimizations.length; index++) {
  193. var optimization = options.optimizations[index];
  194. if (optimization.priority === currentPriorityLevel) {
  195. noOptimizationApplied = false;
  196. allDone = allDone && optimization.apply(scene);
  197. }
  198. }
  199. // If no optimization was applied, this is a failure :(
  200. if (noOptimizationApplied) {
  201. if (onFailure) {
  202. onFailure();
  203. }
  204. return;
  205. }
  206. // If all optimizations were done, move to next level
  207. if (allDone) {
  208. currentPriorityLevel++;
  209. }
  210. // Let's the system running for a specific amount of time before checking FPS
  211. scene.executeWhenReady(function () {
  212. setTimeout(function () {
  213. SceneOptimizer._CheckCurrentState(scene, options, currentPriorityLevel, onSuccess, onFailure);
  214. }, options.trackerDuration);
  215. });
  216. };
  217. SceneOptimizer.OptimizeAsync = function (scene, options, onSuccess, onFailure) {
  218. if (!options) {
  219. options = SceneOptimizerOptions.ModerateDegradationAllowed();
  220. }
  221. // Let's the system running for a specific amount of time before checking FPS
  222. scene.executeWhenReady(function () {
  223. setTimeout(function () {
  224. SceneOptimizer._CheckCurrentState(scene, options, 0, onSuccess, onFailure);
  225. }, options.trackerDuration);
  226. });
  227. };
  228. return SceneOptimizer;
  229. })();
  230. BABYLON.SceneOptimizer = SceneOptimizer;
  231. })(BABYLON || (BABYLON = {}));
  232. //# sourceMappingURL=babylon.sceneOptimizer.js.map