Я использую Python-Fu внутри GIMP 2.8.14 на OS X, чтобы автоматизировать создание конвейера ресурсов для игры.
Но я заметил, что метод pdb.gimp_image_scale работает медленнее, когда я запускаю его из мой скрипт по сравнению со встроенной функцией «Изображение > Масштабировать изображение...».
Уменьшение белого изображения с 8000x8000 до 2000x2000 занимает 6,8 секунды с помощью сценария по сравнению с 1,7 секунды с помощью графического интерфейса. Это не так критично, но масштабирование моих активов с большим количеством слоев занимает 3 минуты 47 секунд по сценарию, по сравнению с 40 секундами с помощью графического интерфейса.
Мой монитор активности показал, что загрузка ЦП при выполнении моего скрипта достигает примерно 30 %, где встроенный графический интерфейс использует масштабирование до 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 секунды через встроенный графический интерфейс.
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 не многопоточный?
Многопоточное масштабирование через графический интерфейс (слева) и однопоточное масштабирование через скрипт (справа)
ОБНОВЛЕНИЕ 2: когда я запускаю свой скрипт из консоли «Фильтры>Python-Fu>», он на самом деле является многопоточным и быстрым.
ОБНОВЛЕНИЕ 3: когда я запускаю свой скрипт без входного значения (например, масштаба) и жестко задаю значение, он также работает многопоточно и быстро. Похоже, что когда масштабирование запускается из диалогового окна, оно является однопоточным.