Filtry i style warstwy przestały zamrażać program
Zaczęło się od jednego zgłoszenia: płótno A4, warstwa ze stylem, przeciągnięcie suwaka szerokości obrysu — i program zamiera na dwadzieścia sekund. To nie była wina komputera.
Kiedy zaczęliśmy ciągnąć za ten wątek, okazało się, że pod spodem siedzi cała rodzina podobnych spraw. Nie błędów, które coś psują — takich, które po prostu każą czekać. Ta seria zmian jest o nich.
Liczyliśmy rzeczy, których nie widać
Największa oszczędność wzięła się z pytania, które brzmi banalnie: po co liczyć styl warstwy na całej stronie, skoro warstwa zajmuje jej róg?
Mały dymek, logo albo podpis ze stylem kosztował dotąd tyle samo, co styl rozciągnięty na całym arkuszu — każdy efekt przechodził przez wszystkie 8,7 miliona pikseli, choć treści było tam kilkaset tysięcy. Teraz styl liczy się na prostokącie obejmującym zawartość warstwy plus zasięg efektów. 1235 ms → 66 ms.
Brzmi prosto, ale ma pułapkę, która kosztowałaby nas potem tygodnie szukania. Trzy rodziny efektów — szum, gradienty i kafelkowanie wzorka — liczą wartość nie z kształtu warstwy, tylko z położenia piksela. Policzone na przesuniętym fragmencie dają inny obraz: ziarno szumu przeskakuje, gradient rozciąga się na wycinku zamiast na całej stronie. I nikt by tego nie zgłosił jako błąd, bo „prawie się zgadza". Te efekty dostały informację o tym, gdzie leżą względem płótna.
Sprawdzian, który najpierw sam siebie nie przeszedł
Przy zmianach tego rodzaju najważniejsze jest zdanie: „obraz wygląda dokładnie tak samo jak przedtem". Łatwo je napisać. Trudniej udowodnić.
Powstał więc automatyczny sprawdzian: dziewiętnaście przypadków stylu, każdy sprowadzony do jednej liczby, porównywanej z wartością wyliczoną przez kod sprzed zmiany. Zmiana choćby jednego piksela i sprawdzian pęka.
Tylko że zielony wynik sam w sobie niczego nie dowodzi — dopóki nie wiadomo, czy ten sprawdzian w ogóle potrafi zapłonąć. Więc popsuliśmy go celowo, po kolei: usunięcie informacji o położeniu osobno dla szumu, osobno dla gradientu, osobno dla poświaty. Za pierwszym razem przeszedł mimo zepsucia. Powód okazał się pouczający: warstwa testowa leżała w rogu strony, więc przesunięcie wynosiło zero i sprawdzian nie sprawdzał niczego. Po odsunięciu jej w głąb — pękał za każdym razem, tak jak powinien.
To była najbardziej wartościowa godzina z całej serii.
Reszta rodziny
Faza i płaskorzeźba. Efekt potrzebuje mapy odległości od krawędzi kształtu. Powstawała przez powtarzanie kurczenia sylwetki tyle razy, ile wynosił rozmiar efektu — przy większych ustawieniach kilkaset przebiegów po całej stronie. Da się to policzyć dwoma przebiegami, i to nie jako przybliżenie, tylko dokładnie. 1179 ms → 384 ms, obraz identyczny.
Wygładzanie powierzchni (to, które wyrównuje płaszczyzny, zostawiając krawędzie) liczyło się w jednym wątku, choć sąsiedni filtr dostał podział na wątki dawno temu. Po prostu został pominięty. 6161 ms → 1491 ms.
Miękkie cienie przestały pokazywać pasy. Styl powstaje w bardzo dokładnych liczbach, ale po drodze na ekran był spłaszczany do zwykłego obrazu i zaraz rozpakowywany z powrotem. Duży, łagodny cień ma ponad 36 tysięcy poziomów krycia — po tej drodze zostawało ich 85. Stąd widoczne schodki zamiast gładkiego przejścia. Teraz nic po drodze nie ginie.
Kiedy dajemy wybór, a kiedy po prostu naprawiamy
Przy rozmyciu gaussowskim pojawiła się lista Jakość: Fast / Good. Ale nie dlatego, że „szybciej
zawsze się przyda" — najpierw zmierzyliśmy, czy poziomy w ogóle dają różny obraz. Dają: różnica
sięga półtora poziomu jasności na 255, przy liczeniu krótszym prawie czterokrotnie. To wystarczy,
żeby wybór miał sens, więc Good zostało domyślne, a Fast jest dla szukania ustawienia.
I zasada odwrotna, ważniejsza: tam, gdzie tańszy sposób liczenia daje wynik nieodróżnialny, nie dodajemy żadnego ustawienia. Faza, obrys i wygładzanie powierzchni przyspieszyły bez najmniejszej zmiany wyglądu — więc nie ma tam czego przekręcać. Opcja, która nie zmienia nic poza czasem oczekiwania, to nie jest wybór dla użytkownika, tylko przerzucenie na niego naszej niepewności.
Co z tego ma osoba rysująca
Przeciąganie suwaków w oknie stylu i w oknach filtrów ma po prostu nadążać. Duże wygładzanie przestaje być operacją „idź na kawę". Miękkie cienie wyglądają gładko. A klawisz Esc nadal przerywa liczenie — pilnowaliśmy tego świadomie przy zrównoleglaniu, bo najłatwiej stracić właśnie to, co ratuje człowieka z sześciosekundowego czekania.
Żadna z tych zmian nie zmienia wyglądu tego, co już narysowaliście. To był warunek wstępny, nie efekt uboczny.