Използвам Python-Fu в GIMP 2.8.14 на OS X, за да автоматизирам производството на конвейера на активи за игра.
Но забелязах, че методът pdb.gimp_image_scale е по-бавен, когато го изпълнявам от моя скрипт, в сравнение с вградената функция "Изображение > Мащабиране на изображение... ".
Намаляването на бяло изображение от 8000x8000 до 2000x2000 отнема 6,8 секунди от скрипт в сравнение с 1,7 секунди от GUI. Това не е толкова критично, но намаляването на моите активи с много слоеве отнема 3 минути и 47 секунди от скрипт, в сравнение с 40 секунди от GUI.
Моят монитор на активността ми показа, че използването на процесора, когато изпълних скрипта си, достига само до около 30 %, където вграденото GUI мащабиране използва до 100%, което означава, че в OS X едно ядро на процесора работи възможно най-бързо.
Някой има ли идея как мога да променя това поведение?
Странното нещо: Това изглежда е причина само за gimp_image_scale. Други операции като gimp_image_select_contiguous_color, gimp_selection_grow, gimp_selection_feather и gimp_edit_bucket_fill_full карат използването на процесора до 100%.
В Windows е същото, но всъщност не е толкова лошо: 1 минута 28 секунди чрез скрипт и 33 секунди чрез вграден GUI.
from gimpfu import *
def scale_image(scale):
image = gimp.image_list()[0]
w = image.width
h = image.height
pdb.gimp_progress_init("Scaling Image...",None)
pdb.gimp_context_set_interpolation(INTERPOLATION_LANCZOS)
pdb.gimp_image_scale(image, w/scale, h/scale)
pass
register(
"jeanluc_scale_image",
"Scale Image",
"Scale Image",
"JeanLuc",
"JeanLuc",
"2015",
"Scale Image...",
"*",
[
(PF_INT, "scale", "Scale of Image", 1)
],
[],
scale_image,
menu="<Image>/JeanLuc"
)
main()
АКТУАЛИЗАЦИЯ1: Открих, че Activity Monitor има функция „Хронология на процесора“, където видях, че предположението ми е погрешно: 100% не е на 1 ядро, а е разпределено 25% на 4 ядра.
Така че защо и в двата случая работи само при 25% процента? и защо gimp_image_scale не е многонишков?
Многонишково мащабиране чрез GUI (вляво) срещу еднонишково чрез скрипт (вдясно)
АКТУАЛИЗАЦИЯ 2: Когато стартирам скрипта си от "Filters>Python-Fu>Console", той всъщност е многонишков и бърз.
АКТУАЛИЗАЦИЯ 3: Когато стартирам скрипта си без входна стойност (напр. мащаб) и твърдо кодирам стойността, той също работи многопоточно и бързо. Изглежда, че когато мащабирането се задейства от диалоговия прозорец, то е еднопоточно.