- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我在我的 d3 应用程序中使用旋转 tick 函数时,整个应用程序变慢了。
例如:如果您取消注释行//var angle = 0;在下面jsfiddle它运行速度快 20 倍。
这是为什么?轮换是非常昂贵还是我做错了什么?
function tick() {
link.attr("x1", function(d) { return d.source.x; })
.attr("y1", function(d) { return d.source.y; })
.attr("x2", function(d) { return d.target.x; })
.attr("y2", function(d) { return d.target.y; });
linktext.attr("transform", function(d) {
var xDiff = d.source.x - d.target.x;
var yDiff = d.source.y - d.target.y;
var angle = Math.atan2(yDiff, xDiff) * (180.0 / Math.PI);
//var angle = 0;
return "translate(" + (d.source.x + d.target.x) / 2 + ","
+ (d.source.y + d.target.y) / 2 + ")rotate(" + angle + ")";
});
node.attr("cx", function(d) { return d.x; })
.attr("cy", function(d) { return d.y; });
}
注意:我修改了原始的 jsfiddle 发现 here
最佳答案
为了追查问题的根源,我试着让文本的各个方面相同/不同。参见 this version of your fiddle .请注意,每个文本元素的文本和 Angular 都不同(因此不可能进行优化)但是每个元素的 Angular 是恒定的——它不会在每次刻度时改变。
结果呢?一开始有点迟钝(当图形中有很多重叠时),但它很快就会在 30fps 以下变得流畅。
同样如此(最终帧速率略高于 30fps),即使文本内容每次更新都发生变化,如 this version .
这与 the usual rule of optimizing animation 相矛盾,改变转换应该比改变内容更有效。
根据 Chrome 帧速率检查器,大部分时间都花在了 your original fiddle 的每次重绘上。 (在我的电脑上时钟大约为 4fps)正在被“绘画设置”步骤占用——即计算图像的每个“层”。
This blog has a quick-and-easy recap of the different steps of a repaint .引用:
The following steps render the elements in the DOM into images on your screen:
Trigger - Elements are loaded into the DOM, or are modified in some way
Recalculate Styles - Styles are applied to elements (or re-calculated)
Layout - Elements are laid out geometrically, according to their positions on the screen
Paint Setup - The DOM is split up into render layers, which will be used to fill out the pixels for each element
Paint - Each layer is painted into a bitmap and is uploaded to the GPU as a texture by a software rasterizer
Composite Layers - The layers are composited together by the GPU and drawn to a final screen image
通常,转换可以在最后的“合成”步骤中由 GPU 高效完成(现代操作系统上的现代浏览器会自动将工作转移到 GPU)。
这可能不会发生的原因有两个。首先是这种优化甚至可能不适用于 SVG(尽管我很确定最新 Chrome 的默认设置是优化 SVG 转换)。然而,即使浏览器对 SVG 转换使用了一些 GPU 优化,您的 GPU 在内存耗尽之前也只能处理有限数量的层。有将近 200 个单独转换的文本元素(以及上下分层的未转换内容),这可能会成为瓶颈。参见 this HTML5Rocks post或 this MSDN article ,其中给出了一些会取消独立层组合的性能限制示例。
无论幕后发生了什么,最终结果都是您的 CPU 而不是 GPU 每次都在计算旋转并将文本分层在一起,这效率不高。
那么,您能做些什么呢?
我尝试通过使用矩阵变换来优化代码,而不是先计算 Angular ,然后让浏览器计算旋转 (see live version) ...但这并没有产生明显的区别。更改为简单的倾斜变换而不是旋转有一点帮助(帧速率高达 11fps),但这只是在滞后的动画之上添加了难看的文本。
不幸的是,看起来您真的不得不以一种或另一种方式妥协。一些选项:
隐藏文本直到强制布局停止,然后才计算旋转。 Working example
关键代码(Javascript):
var vis = d3.select(".intgraph").append("svg:svg")
.attr("width", w)
.attr("height", h)
.append("svg:g")
.on("click", function(){
if ( force.alpha() )
force.stop();
else
force.resume();
});
force.on("start", function(){
vis.classed("running", true);
})
.on("end", function () {
linktext.attr("transform", function (d) {
var xDiff = d.source.x - d.target.x,
xMid = d.source.x - xDiff / 2;
var yDiff = d.source.y - d.target.y,
yMid = d.source.y - yDiff / 2;
var hyp = Math.sqrt(xDiff * xDiff + yDiff * yDiff),
cos = xDiff / hyp,
sin = yDiff / hyp;
return "matrix(" +
[cos, sin, -sin, cos, xMid, yMid] + ")";
});
vis.classed("running", false);
});
CSS:
.running text {
display:none;
}
显示文本,但不旋转它(可选,将其旋转到强制布局停止时的位置,如上所述)。
关于javascript - d3 : rotations and force directed layouts,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23430115/
我有这部分代码将 div 围绕一个圆圈对齐: angle = 0; mangle = 0; for(i = 1; i<= count; i++) { $("#p" +i).css
为什么平衡得到一个AVL树的过程叫做旋转 ? (当你在它时,什么是 单 和 双 旋转?) 我的每一本教科书都公然使用这个词,没有任何解释。 最佳答案 这是在你的树的子树中改变根的操作,这是非常简单的操
作为进入处理的一个小作业,我必须编写一些代码才能获得以下内容: 使用 public void setup() { size(300,200); noFill(); rect(100,
我遇到了 Google Chrome 控制台报告的问题。我使用的是 Ubuntu 12.04。控制台中的问题是: Uncaught TypeError: Cannot read propert
在统一编辑器中,当我启用“Pivot”时,游戏对象将围绕“枢轴点”位置旋转,当我启用“Center”时,游戏对象将围绕“中心点”旋转 但是如果我使用脚本旋转,它总是围绕“中心点”旋转,例如,这是我的场
rotate() 算法会从左边选择序列的元素。它的工作机制如图 1 所示。 图 1 rotate()算法的工作方式(点此查看大图) 为了理解如何旋转序列,可以将序列中的元素想象成手镯上的珠子。rota
在三个JS中,是否可以用鼠标旋转对象而不是用OrbitControls.js旋转相机( https://threejs.org/docs/#examples/controls/OrbitControl
我正在学习 CSS 过渡和转换。这是 HTML: Transformatons and Transitions animate animate2 d
我们有一个图像,它似乎在旋转时消失了一秒钟。这个问题存在于 IE8 中,但在 IE9 和其他支持 HTML5 的浏览器中工作正常。我们使用了 jQuery 旋转插件。 HTML CSS #obj {
作为评估的一部分,我被赋予了这项任务......“‘旋转’按钮应该翻转元素的纵横比。” 为了完成这个,我定位了元素并切换了一个类名(旋转),然后添加了这个 CSS... .main-inner.rot
我从 Unity 插件 Final IK 中看到了这行代码。 整个函数是这样的: //Limits rotation to a single degree of freedom (along axis
我正在尝试在动画关键帧内同时应用 -webkit-filter:hue-rotate() 和 -webkit-transform:rotate()。不幸的是,即使是 Chrome Canary 也无法
我正在尝试制作看起来像这样的波斯尼亚和黑塞哥维那国旗。 我正在努力实现星星的排列方式。它们位于 45 度倾斜轴上,但星星本身没有旋转。 以下是我正在尝试的最低限度代码,但它也会旋转星星。 有什么办法可
我正在尝试使用 ratcave for python 创建一个项目。但是当我导入 ratcave 时,出现以下错误: AttributeError: 'scipy.spatial.transform.
我正在尝试使用 ratcave for python 创建一个项目。但是当我导入 ratcave 时,出现以下错误: AttributeError: 'scipy.spatial.transform.
我的问题是我使用支持 CSS2 和 javascript 但不支持 css3 的 html 到 pdf 生成器 (acts_as_flying_saucer),所以我不能使用 transform: r
我做了以下转换: // Translate my cube to origin myCubeModelMatrix = glm::translate( myCubeModelMatrix, vec3(
我正在将一些基于 PIL 的代码转换为 NumPy,但我发现 skimage.transform.rotate函数比 PIL 的 Image.rotate 慢显着。 作为一个粗略的比较,使用 skim
前言 .我知道过去曾多次问过这个问题,但没有一个解决方案实际上对我有用。自从提出类似问题(根据耗时过滤的 Google 搜索)以来,也已经有好几年了,因此大多数较旧的答案都已过时。如果有任何方法可以让
我试图将元素从其起始旋转点旋转 360 度,而不是从 0deg。例如,如果起点是 90deg,它会从 90deg 旋转到 90deg(整圈)。 我的目标是使用简单的@keyframes 动画来旋转元素
我是一名优秀的程序员,十分优秀!