CS5隐藏层非常缓慢

Max*_*and 14 javascript photoshop optimization photoshop-script flash-cs5

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

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

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

我尝试将脚本导出为.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;
}
Run Code Online (Sandbox Code Playgroud)

...但是,仍然需要更改20个对象中的属性.任何优化的帮助将不胜感激:)

pdi*_*izz 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;
}
Run Code Online (Sandbox Code Playgroud)

编辑:所以我在一个 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这需要更长的时间,在我的机器上约为 20 秒,但它会触及文档中的每个图层。

注意:我还测试了问题中的原始脚本,它们不适用于未分组的图层,因为您正在迭代document.layerSets而不是document.layers