Przez bardzo długi czas myślałem, że w potoku pikseli istnieje jakiś mechanizm wyłącznika awaryjnego. Przypadek użycia jest następujący:
- zmieniasz parametr modułu,
- podglądy (centralny podgląd w ciemni oraz miniatura w lewym panelu, używana także dla histogramu i próbników koloru) przeliczają swój potok, aby uwzględnić tę zmianę,
- jeden z podglądów kończy renderowanie przed drugim, a wynik jest oczywiście nie tym, czego chciałeś,
- zmieniasz ponownie parametr modułu, nie czekając na zakończenie przeliczania.
W takim przypadku chcesz zabić wszystkie aktywne potoki, ponieważ ich wynik nie zostanie użyty, i natychmiast rozpocząć przeliczanie wszystkiego z nowymi parametrami. Tyle że Darktable tego nie robi — pozwala potokowi zakończyć się przed jego ponownym uruchomieniem, a patrząc na komentarze w kodzie źródłowym, wygląda na to, że jest to dość niedawna regresja, a nie pierwotnie zamierzone zachowanie.
Zaimplementowałem (ponownie) tę funkcję w Anselu, ale jest to trudne, ponieważ mamy do czynienia z różnymi wątkami (GUI, historia edycji oraz potok na CPU/OpenCL) i musimy je odpowiednio zsynchronizować.
Jeśli pójdzie to źle, możesz doświadczyć zniekształconych podglądów wynikających z niespójnych stanów pamięci podręcznej. Jest to problem wyłącznie z GUI, a strategia zaradcza polega na przejściu do menu globalnego -> Run -> Invalidate all caches.
Aby debugować, możesz uruchomić Ansela z:
1$ ansel -d perfPodczas interakcji z suwakami i listami rozwijanymi w GUI (na przykład tutaj w module ekspozycji) otrzymasz:
1100,407003 [dev_process_all] sending killswitch signal on running pipelines took 0,000 secs (0,000 CPU)
2100,509816 [dev_pixelpipe] took 0,011 secs (0,023 CPU) processed `exposure` on GPU, blended on GPU [full]
3100,510498 [dev_pixelpipe] took 0,019 secs (0,035 CPU) processed `exposure` on GPU, blended on GPU [preview]
4100,533228 [dev_pixelpipe] took 0,023 secs (0,061 CPU) processed `lens correction` on GPU, blended on GPU [full]
5100,558939 [dev_pixelpipe] took 0,026 secs (0,129 CPU) processed `tone equalizer` on CPU, blended on CPU [full]
6100,563703 [dev_pixelpipe] took 0,005 secs (0,008 CPU) processed `unbreak input profile` on GPU, blended on GPU [full]
7...Normalne zachowanie polega na tym, że wiersz [dev_process_all] sending killswitch signal powinien pojawić się w momencie Twojej interakcji i powinno po nim nastąpić przeliczanie rozpoczynające się od modułu, z którym wchodziłeś w interakcję (nie od tego przed nim ani po nim), aż do końca (moduł kodowania wyświetlania).
Translated from English by : Claude. In case of conflict, inconsistency or error, the English version shall prevail.