Disable DPR > 1 on Safari due to bugs and performance issues.
authorJoe Wreschnig <joe.wreschnig@gmail.com>
Wed, 17 Sep 2014 21:34:13 +0000 (23:34 +0200)
committerJoe Wreschnig <joe.wreschnig@gmail.com>
Wed, 17 Sep 2014 21:34:13 +0000 (23:34 +0200)
src/yuu/core.js
src/yuu/gfx.js

index cbeb2a0acb236a9aa52ca3002d3f11d8782264b3..24e3f2bf375a856fde2ce4ac9195f0e8cb484fc5 100644 (file)
@@ -7,6 +7,9 @@
 (function (yuu) {
     "use strict";
 
+    yuu.isSafari = function (ua) {
+        return /^((?!chrome).)*safari/i.test(ua || navigator.userAgent);
+    };
 
     yuu.require = function (m) {
         try { return require(m); }
index 2c3088e8868e6ad6cb62435e919bdcaec36a0305..3765aaac3540adc06d0bf685ebd3071c4409769c 100644 (file)
     var gl;
     var canvas;
 
-    var dpr = yuu.DPR = this.devicePixelRatio || 1;
+    // Safari on OS X has issues with DPR != 1 where the backbuffer
+    // scales down, then back up. I'm pretty sure this is not a
+    // problem with this code, because I see similar artifacting on
+    // most demos, e.g.
+    // https://www.khronos.org/registry/webgl/sdk/demos/google/shiny-teapot/index.html
+    //
+    // With DPR = 1 this presumably still happens but the negative
+    // effect is lessened.
+    //
+    // Safari on iOS does _not_ have this problem (another reason why
+    // I suspect it's a bug in Safari and not this code), but reducing
+    // fragment count by 75% is generally a good idea on these devices
+    // anyway.
+    var dpr = yuu.DPR = !yuu.isSafari()
+        ? (this.devicePixelRatio || 1)
+        : 1;
 
     yT.defineProperty(Int8Array.prototype, "GL_TYPE", 0x1400);
     yT.defineProperty(Uint8Array.prototype, "GL_TYPE", 0x1401);