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 隐藏层非常缓慢的主要内容,如果未能解决你的问题,请参考以下文章