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 TextureOptimization = (function (_super) {
  22. __extends(TextureOptimization, _super);
  23. function TextureOptimization(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 TextureOptimization;
  48. })(SceneOptimization);
  49. BABYLON.TextureOptimization = TextureOptimization;
  50. var HardwareScalingOptimization = (function (_super) {
  51. __extends(HardwareScalingOptimization, _super);
  52. function HardwareScalingOptimization(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 HardwareScalingOptimization;
  67. })(SceneOptimization);
  68. BABYLON.HardwareScalingOptimization = HardwareScalingOptimization;
  69. var ShadowsOptimization = (function (_super) {
  70. __extends(ShadowsOptimization, _super);
  71. function ShadowsOptimization() {
  72. _super.apply(this, arguments);
  73. this.apply = function (scene) {
  74. scene.shadowsEnabled = false;
  75. return true;
  76. };
  77. }
  78. return ShadowsOptimization;
  79. })(SceneOptimization);
  80. BABYLON.ShadowsOptimization = ShadowsOptimization;
  81. var PostProcessesOptimization = (function (_super) {
  82. __extends(PostProcessesOptimization, _super);
  83. function PostProcessesOptimization() {
  84. _super.apply(this, arguments);
  85. this.apply = function (scene) {
  86. scene.postProcessesEnabled = false;
  87. return true;
  88. };
  89. }
  90. return PostProcessesOptimization;
  91. })(SceneOptimization);
  92. BABYLON.PostProcessesOptimization = PostProcessesOptimization;
  93. var LensFlaresOptimization = (function (_super) {
  94. __extends(LensFlaresOptimization, _super);
  95. function LensFlaresOptimization() {
  96. _super.apply(this, arguments);
  97. this.apply = function (scene) {
  98. scene.lensFlaresEnabled = false;
  99. return true;
  100. };
  101. }
  102. return LensFlaresOptimization;
  103. })(SceneOptimization);
  104. BABYLON.LensFlaresOptimization = LensFlaresOptimization;
  105. var ParticlesOptimization = (function (_super) {
  106. __extends(ParticlesOptimization, _super);
  107. function ParticlesOptimization() {
  108. _super.apply(this, arguments);
  109. this.apply = function (scene) {
  110. scene.particlesEnabled = false;
  111. return true;
  112. };
  113. }
  114. return ParticlesOptimization;
  115. })(SceneOptimization);
  116. BABYLON.ParticlesOptimization = ParticlesOptimization;
  117. var RenderTargetsOptimization = (function (_super) {
  118. __extends(RenderTargetsOptimization, _super);
  119. function RenderTargetsOptimization() {
  120. _super.apply(this, arguments);
  121. this.apply = function (scene) {
  122. scene.renderTargetsEnabled = false;
  123. return true;
  124. };
  125. }
  126. return RenderTargetsOptimization;
  127. })(SceneOptimization);
  128. BABYLON.RenderTargetsOptimization = RenderTargetsOptimization;
  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 ShadowsOptimization(priority));
  142. result.optimizations.push(new LensFlaresOptimization(priority));
  143. // Next priority
  144. priority++;
  145. result.optimizations.push(new PostProcessesOptimization(priority));
  146. result.optimizations.push(new ParticlesOptimization(priority));
  147. // Next priority
  148. priority++;
  149. result.optimizations.push(new TextureOptimization(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 ShadowsOptimization(priority));
  156. result.optimizations.push(new LensFlaresOptimization(priority));
  157. // Next priority
  158. priority++;
  159. result.optimizations.push(new PostProcessesOptimization(priority));
  160. result.optimizations.push(new ParticlesOptimization(priority));
  161. // Next priority
  162. priority++;
  163. result.optimizations.push(new TextureOptimization(priority, 512));
  164. // Next priority
  165. priority++;
  166. result.optimizations.push(new RenderTargetsOptimization(priority));
  167. // Next priority
  168. priority++;
  169. result.optimizations.push(new HardwareScalingOptimization(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 ShadowsOptimization(priority));
  176. result.optimizations.push(new LensFlaresOptimization(priority));
  177. // Next priority
  178. priority++;
  179. result.optimizations.push(new PostProcessesOptimization(priority));
  180. result.optimizations.push(new ParticlesOptimization(priority));
  181. // Next priority
  182. priority++;
  183. result.optimizations.push(new TextureOptimization(priority, 256));
  184. // Next priority
  185. priority++;
  186. result.optimizations.push(new RenderTargetsOptimization(priority));
  187. // Next priority
  188. priority++;
  189. result.optimizations.push(new HardwareScalingOptimization(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