在iOS6的UIWebView组件中,我遇到了滚动性能差的问题。虽然在iOS5中,滚动非常流畅。因此,我上网搜索了一下,并找到了这篇iOS6 beta更改日志的一部分。
WebKit不再为具有-webkit-transform:preserve-3d选项的元素始终创建硬件加速图层。作者应停止使用此选项作为获得硬件加速的方法。
这可能是原因,因为我的应用程序显示的html网站使用了大量的css3变换。请问是否有任何解决方案或建议,如何强制Webview切换回加速渲染模式?
在iOS6的UIWebView组件中,我遇到了滚动性能差的问题。虽然在iOS5中,滚动非常流畅。因此,我上网搜索了一下,并找到了这篇iOS6 beta更改日志的一部分。
WebKit不再为具有-webkit-transform:preserve-3d选项的元素始终创建硬件加速图层。作者应停止使用此选项作为获得硬件加速的方法。
这可能是原因,因为我的应用程序显示的html网站使用了大量的css3变换。请问是否有任何解决方案或建议,如何强制Webview切换回加速渲染模式?
如果您使用3D变换(例如-webkit-transform: translateZ(0)
),UIWebView仍然会进行硬件加速。但是,如果您只使用-webkit-transform-style: preserve-3d
,它将不再进行硬件加速。
如果您有一个使用3D变换的示例,在iOS 6上变慢了,请在Apple的错误报告工具中报告此问题。
function animate(node) {
node.style.webkitAnimation = 'sample 5s infinite';
node.style.webkitPerspective = 1000;
node.style.webkitBackfaceVisibility = 'hidden';
}
这似乎加强了调用GPU会导致减速的现象。
编辑2:还有一个额外的示例托管在http://bvgam.es/apple/,在iOS 5.1上运行流畅,在iOS 6上只能获得1-2 FPS。
<!DOCTYPE html>
<html>
<head>
<title>Animation Playground</title>
<style>
@-webkit-keyframes sample {
0% { -webkit-transform: translate3d(0px, 0px, 0px); opacity: 1; }
10% { -webkit-transform: translate3d(0px, 0px, 0px); opacity: 0; }
20% { -webkit-transform: translate3d(10px, 0px, 0px); opacity: 1; }
40% { -webkit-transform: translate3d(10px, 10px, 0px); opacity: 0; }
50% { -webkit-transform: translate3d(10px, 20px, 0px); opacity: 1; }
80% { -webkit-transform: translate3d(20px, 20px, 0px); opacity: 0; }
100% { -webkit-transform: translate3d(0px, 0px, 0px); opacity: 1; }
}
</style>
<script type="text/javascript">
function fib(node, a, b) {
node.innerHTML = a;
setTimeout(function() {
fib(node, a + b, b);
}, 0);
}
function animate(node) {
node.style.webkitAnimation = 'sample 5s infinite';
}
function createNode(row, column) {
var node = document.createElement('div');
node.style.width = '7px';
node.style.height = '7px';
node.style.position = 'absolute';
node.style.top = 30 + (row * 9) + 'px';
node.style.left = (column * 9) + 'px';
node.style.background = 'green';
return node;
}
function run() {
for (var row = 0; row < 20; ++row) {
for (var column = 0; column < 20; ++column) {
var node = createNode(row, column);
document.body.appendChild(node);
animate(node);
}
}
var output = document.getElementById('output');
fib(output, 0, 1);
}
</script>
</head>
<body onload="run()">
<div id="output" style="font-size: 40px; position: absolute; left: 220px;"></div>
</body>
</html>
尝试将所有实例的 -webkit-transform: translate3d(0,0,0);
替换为
-webkit-transform: translate3d(0,0,0) scale3d(1,1,1);
这对我有效
CSS变换在iOS 6上确实比较慢,至少在我的iPhone 4应用程序中是这样。
我将基本的translate()设置为元素,而不是translate3d(),性能保持不变,所以我认为即使是translate3d()也不再触发GPU加速。这听起来像是一个bug。
作为一种解决方法,我尝试在元素上设置不同的CSS属性(如rotate3d(),scale3d(),perspective等),但它们似乎都无法触发硬件加速。
-webkit-transform: translate3d(0,0,0);
替换为-webkit-perspective: 1000; -webkit-backface-visibility: hidden;
。这对我有用。似乎-webkit-transform: translate3d(0,0,0);
不再调用硬件加速。那些报告说在iOS 6中-webkit-transform: translate3d(0,0,0);速度较慢的人,请提供一个URL以展示这一点。