CS5 隐藏层非常缓慢

Posted

技术标签:

【中文标题】CS5 隐藏层非常缓慢【英文标题】:CS5 Hiding layers is painfully slow 【发布时间】:2012-08-15 22:51:10 【问题描述】:

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

【问题讨论】:

您是否考虑过将每一层的 innerhtml 保存到一个数组中,然后将其设置为“”?然后要恢复一个层,只需从数组中复制它的 innerHTML 即可。隐藏=>temp[i]=layerSets[i].innerHTML;layerSets[i].innerHTML=""; ... 显示=>layerSets[i].innerHTML=temp[i]; 您是否正在运行 Vista? 在 Vista 和 Windows 7 上的结果相同。 【参考方案1】:

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

【讨论】:

我在根级别为我的原始代码和您的原始代码计时了 38 层。他们花了同样长的时间(2.7分钟)。我正在运行不支持 GPU 的标准版本。您是否启用了 GPU 支持? 我在 i7-2630 @ 2GHz 和 8GB RAM 上再次运行了您的第一个示例,其中包含 38 层。这次花了 1.7 分钟(快了 1 分钟),对于仅关闭图层来说仍然太多了。是否有一些调试信息可以关闭以加快速度? 我测试了我的第一个脚本 (for 循环) 与 50 层 2560x1712 像素的 605mb 文件,耗时约 8 秒。这是我在 PS 中使用的性能设置(所有默认 AFAIK)i.imgur.com/VoRNg.jpg 无论如何,我尝试关闭 GPU 支持,但效果不大,因为我使用的是板载显卡并且没有显卡。要么你正在处理一些海量的高分辨率文件,要么有其他东西让你陷入困境。我在一个 64 位 AMD 双核 3.20 GHz 和 4gb 内存(虽然只有 2gb 分配给 photoshop)无论如何,我不认为你的代码是这里的问题。【参考方案2】:

看看这个ps-scripts iteration over layers is slow - explanation 这也可能对您有所帮助。

【讨论】:

以上是关于CS5 隐藏层非常缓慢的主要内容,如果未能解决你的问题,请参考以下文章

1.鼠标点击换样式+2.下拉菜单缓慢显示/隐藏样式效果

FMX TMemo 非常缓慢

非常缓慢的软件向量,尤其是 CoreGraphics 与 OpenGL

为啥 Firebase 功能部署非常缓慢?

几页深后,页面转换变得非常缓慢

非常简单的 MySQL 索引查询运行非常缓慢