Tuesday, July 20, 2010

Ошибка ли?

Обнаружил интересную особенность в обработке анимации(gif) в gtk+. Непосредственно ошибку обнаружил не я, но я все таки решил проверить, можно ее повторить без лишнего кода. Оказалось да - но распространяется она не только на случай, когда файл загружается частями gdk_pixbuf_loader_write и потом показывается анимация (gdk_pixbuf_loader_get_animation + gdk_pixbuf_animation_get_iter), но даже если загрузить анимацию сразу через gtk_image_new_from_file. В любом случае используется до 1GB памяти - что не очень хорошо для 6MB файла, да и вообще плохо. 

Если верить документации на gdk_pixbuf_animation_get_iter - то библотека сама контолирует выделение pixbuf и после сдвига его использовать нельзя. Я думал что после загрузки через gdk_pixbuf_loader - создается копия данных и как только количество этих данных становиться больше чем нужно, для минимального отображение, посылается сигнал на прорисовку - что в принципе подтвердилось, так как если брать статическую картинку(gdk-pixbuf-animation-get-static-image), то затраты памяти значительно меньше. Далее я думал, что gdk_pixbuf_animation - при создании создает только 1 кадр, и при запросе на сдвиг времени выдает следующий по порядку(пропуская лишние, если нужно) и удаляет предыдущий копию. Но похоже это не так так как если самому вызывать очитку отображенного кадра(unref) при удалении обьекта анимации создается сообщения о повторном удалении обьектов. Думаю создаються все кадра и не удаляются.

И ошибка или так задумано?