只是我认为CS5脚本的运行速度非常慢吗?
这几行执行需要1分钟以上的时间。
for (n=0; n<app.activeDocument.layerSets.length; n++) {
app.activeDocument.layerSets[n].visible = false;
}
layerSet的数量为20。
我正在Vista Home Premium系统(具有8GB RAM的AMD Athlon 64 X2 Dual Core 5200+)上运行CS5.1 64位版本。
我尝试将脚本导出为.JSXBIN,但仍需要1分钟以上。当CS5.1运行.JSXBIN脚本时,CS5.1的CPU使用率从3%变为57%。
这里一定有问题,我该如何加快脚本速度?
// 谢谢
*编辑*
似乎CS5自己的DOM实现就是这里的问题。通过将与DOM相关的值读入局部变量,该脚本将速度提高了两倍以上。
var LayerCount = app.activeDocument.layerSets.length;
var LayerRoot = app.activeDocument.layerSets;
for (n=0; n<LayerCount; n++) {
LayerRoot[n].visible = false;
}
...但是,到目前为止,仅更改20个对象中的属性就花了很多时间。任何有关优化的帮助将不胜感激:)
最佳答案
我唯一想到的是尝试遍历app.activeDocument.layers
中包含所有图层和组的各个图层。当您执行此操作时,您会注意到分组的图层仍将保留其原始visible
属性,但由于其父组已隐藏而被隐藏。
#target photoshop
var myLayers = app.activeDocument.layers;
var myLayersLength = myLayers.length;
for (var i=0; i<myLayersLength; i++) {
myLayers[i].visible = false;
}
编辑:因此,我在一个具有50层的400mb文件上测试了该解决方案,它的工作时间不到一秒钟。您确定问题出在Photoshop吗?
如果您必须遍历每个单独的层和子层来执行操作,则可以递归执行:
#target photoshop
var doc = app.activeDocument;
findLayers(doc);
function findLayers(set) {
for (var i=0; i<set.layerSets.length; i++) {
//recursive call
findLayers(set.layerSets[i]);
//iterate sub-layers and hide
for (var j=0; j<set.layerSets[i].layers.length; j++) {
set.layerSets[i].layers[j].visible = false;
}
}
//hide top-level layers
for (var l=0; l<set.layers.length; l++) {
set.layers[l].visible = false;
}
}
这在我的机器上花费了更长的时间,约20秒,但是会触及文档中的每个单独的层。
注意:我还从问题中测试了您的原始脚本,它们无法在未分组的图层上运行,因为您要遍历
document.layerSets
而不是document.layers