CS5隐藏层非常缓慢

时间:2012-08-20 15:24:29

标签: javascript optimization photoshop flash-cs5 photoshop-script

只有我认为CS5脚本运行缓慢吗? 这几行需要1分钟才能执行。

for (n=0; n<app.activeDocument.layerSets.length; n++) {
  app.activeDocument.layerSets[n].visible = false;
}

layerSets的数量是20。 我在Vista Home Premium系统上运行CS5.1 64位版本,AMD Athlon 64 X2双核5200+和8GB RAM。

我尝试将脚本导出为.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个对象中的属性即可。任何有关优化的帮助都将受到赞赏:)

2 个答案:

答案 0 :(得分:2)

我唯一能想到的是尝试遍历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

答案 1 :(得分:1)

看看这个ps-scripts iteration over layers is slow - explanation 哪个也可以帮到你。