14

CS5 スクリプトの実行速度が非常に遅いと思うのは私だけですか? これらの数行の実行には 1 分以上かかります。

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

レイヤーセットの数は 20 です。Vista Home Premium システム、AMD Athlon 64 X2 デュアル コア 5200+、8GB RAM で CS5.1 64 ビット バージョンを実行しています。

スクリプトを .JSXBIN としてエクスポートしようとしましたが、それでも 1 分以上かかります。CS5.1 で .JSXBIN スクリプトを実行すると、CS5.1 の CPU 使用率が 3% から 57% になります。

ここに何か問題があるに違いありません。スクリプトを高速化するにはどうすればよいですか?

// ありがとう

* 編集 * CS5 独自の DOM 実装がここで問題になっているようです。DOM 関連の値をローカル変数に読み込むことで、スクリプトは 2 倍以上高速化されました。

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 レイヤーの 400 MB ファイルでこのソリューションをテストしたところ、1 秒もかからずに動作しました。問題は 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.layerSetsdocument.layers

于 2012-08-21T01:58:50.787 に答える
1

このps-scripts iteration overlayers is slow を見てください - 説明 これもあなたを助けることができるかもしれません。

于 2012-11-13T09:17:16.223 に答える