babylon.sceneOptimizer.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  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(priority, maximumSize) {
  24. if (typeof priority === "undefined") { priority = 0; }
  25. if (typeof maximumSize === "undefined") { maximumSize = 1024; }
  26. var _this = this;
  27. _super.call(this, priority);
  28. this.priority = priority;
  29. this.maximumSize = maximumSize;
  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(priority, maximumScale) {
  53. if (typeof priority === "undefined") { priority = 0; }
  54. if (typeof maximumScale === "undefined") { maximumScale = 2; }
  55. var _this = this;
  56. _super.call(this, priority);
  57. this.priority = priority;
  58. this.maximumScale = maximumScale;
  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. var RenderTargetsSceneOptimization = (function (_super) {
  118. __extends(RenderTargetsSceneOptimization, _super);
  119. function RenderTargetsSceneOptimization() {
  120. _super.apply(this, arguments);
  121. this.apply = function (scene) {
  122. scene.renderTargetsEnabled = false;
  123. return true;
  124. };
  125. }
  126. return RenderTargetsSceneOptimization;
  127. })(SceneOptimization);
  128. BABYLON.RenderTargetsSceneOptimization = RenderTargetsSceneOptimization;
  129. // Options
  130. var SceneOptimizerOptions = (function () {
  131. function SceneOptimizerOptions(targetFrameRate, trackerDuration) {
  132. if (typeof targetFrameRate === "undefined") { targetFrameRate = 60; }
  133. if (typeof trackerDuration === "undefined") { trackerDuration = 2000; }
  134. this.targetFrameRate = targetFrameRate;
  135. this.trackerDuration = trackerDuration;
  136. this.optimizations = new Array();
  137. }
  138. SceneOptimizerOptions.LowDegradationAllowed = function (targetFrameRate) {
  139. var result = new SceneOptimizerOptions(targetFrameRate);
  140. var priority = 0;
  141. result.optimizations.push(new ShadowsSceneOptimization(priority));
  142. result.optimizations.push(new LensFlaresSceneOptimization(priority));
  143. // Next priority
  144. priority++;
  145. result.optimizations.push(new PostProcessesSceneOptimization(priority));
  146. result.optimizations.push(new ParticlesSceneOptimization(priority));
  147. // Next priority
  148. priority++;
  149. result.optimizations.push(new TextureSceneOptimization(priority, 1024));
  150. return result;
  151. };
  152. SceneOptimizerOptions.ModerateDegradationAllowed = function (targetFrameRate) {
  153. var result = new SceneOptimizerOptions(targetFrameRate);
  154. var priority = 0;
  155. result.optimizations.push(new ShadowsSceneOptimization(priority));
  156. result.optimizations.push(new LensFlaresSceneOptimization(priority));
  157. // Next priority
  158. priority++;
  159. result.optimizations.push(new PostProcessesSceneOptimization(priority));
  160. result.optimizations.push(new ParticlesSceneOptimization(priority));
  161. // Next priority
  162. priority++;
  163. result.optimizations.push(new TextureSceneOptimization(priority, 512));
  164. // Next priority
  165. priority++;
  166. result.optimizations.push(new RenderTargetsSceneOptimization(priority));
  167. // Next priority
  168. priority++;
  169. result.optimizations.push(new HardwareScalingSceneOptimization(priority, 2));
  170. return result;
  171. };
  172. SceneOptimizerOptions.HighDegradationAllowed = function (targetFrameRate) {
  173. var result = new SceneOptimizerOptions(targetFrameRate);
  174. var priority = 0;
  175. result.optimizations.push(new ShadowsSceneOptimization(priority));
  176. result.optimizations.push(new LensFlaresSceneOptimization(priority));
  177. // Next priority
  178. priority++;
  179. result.optimizations.push(new PostProcessesSceneOptimization(priority));
  180. result.optimizations.push(new ParticlesSceneOptimization(priority));
  181. // Next priority
  182. priority++;
  183. result.optimizations.push(new TextureSceneOptimization(priority, 256));
  184. // Next priority
  185. priority++;
  186. result.optimizations.push(new RenderTargetsSceneOptimization(priority));
  187. // Next priority
  188. priority++;
  189. result.optimizations.push(new HardwareScalingSceneOptimization(priority, 4));
  190. return result;
  191. };
  192. return SceneOptimizerOptions;
  193. })();
  194. BABYLON.SceneOptimizerOptions = SceneOptimizerOptions;
  195. // Scene optimizer tool
  196. var SceneOptimizer = (function () {
  197. function SceneOptimizer() {
  198. }
  199. SceneOptimizer._CheckCurrentState = function (scene, options, currentPriorityLevel, onSuccess, onFailure) {
  200. // TODO: add an epsilon
  201. if (BABYLON.Tools.GetFps() >= options.targetFrameRate) {
  202. if (onSuccess) {
  203. onSuccess();
  204. }
  205. return;
  206. }
  207. // Apply current level of optimizations
  208. var allDone = true;
  209. var noOptimizationApplied = true;
  210. for (var index = 0; index < options.optimizations.length; index++) {
  211. var optimization = options.optimizations[index];
  212. if (optimization.priority === currentPriorityLevel) {
  213. noOptimizationApplied = false;
  214. allDone = allDone && optimization.apply(scene);
  215. }
  216. }
  217. // If no optimization was applied, this is a failure :(
  218. if (noOptimizationApplied) {
  219. if (onFailure) {
  220. onFailure();
  221. }
  222. return;
  223. }
  224. // If all optimizations were done, move to next level
  225. if (allDone) {
  226. currentPriorityLevel++;
  227. }
  228. // Let's the system running for a specific amount of time before checking FPS
  229. scene.executeWhenReady(function () {
  230. setTimeout(function () {
  231. SceneOptimizer._CheckCurrentState(scene, options, currentPriorityLevel, onSuccess, onFailure);
  232. }, options.trackerDuration);
  233. });
  234. };
  235. SceneOptimizer.OptimizeAsync = function (scene, options, onSuccess, onFailure) {
  236. if (!options) {
  237. options = SceneOptimizerOptions.ModerateDegradationAllowed();
  238. }
  239. // Let's the system running for a specific amount of time before checking FPS
  240. scene.executeWhenReady(function () {
  241. setTimeout(function () {
  242. SceneOptimizer._CheckCurrentState(scene, options, 0, onSuccess, onFailure);
  243. }, options.trackerDuration);
  244. });
  245. };
  246. return SceneOptimizer;
  247. })();
  248. BABYLON.SceneOptimizer = SceneOptimizer;
  249. })(BABYLON || (BABYLON = {}));
  250. //# sourceMappingURL=babylon.sceneOptimizer.js.map