CS5隐藏图层的速度非常慢

CS5 Hiding layers is painfully slow

本文关键字:非常 速度 隐藏 图层 CS5      更新时间:2023-09-26

是不是只有我认为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双核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个对象中的一个属性仍然需要很长时间。如有任何优化帮助,我们将不胜感激:)

我唯一能想到的就是尝试在包含所有层和组的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

看看这个ps脚本在层上的迭代很慢-解释这可能对你也有帮助。