14

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

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

layerSet 的数量是 20。我在 Vista Home Premium 系统上运行 CS5.1 64 位版本,AMD Athlon 64 X2 Dual Core 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 个对象中的属性仍然需要很多时间。任何有关优化的帮助将不胜感激:)

4

2 回答 2

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

于 2012-08-21T01:58:50.787 回答
1

看看这个ps-scripts 在图层上的迭代速度很慢 - 解释 这也可能对您有所帮助。

于 2012-11-13T09:17:16.223 回答