evilmartians / oklch-picker

Color Picker for LCH
https://oklch.com
Other
849 stars 65 forks source link

Shorten color conversions and speed up painting #80

Closed dom1n1k closed 1 year ago

dom1n1k commented 1 year ago

Реализация #79.

В чистом виде функция getSpace используется буквально в одном месте, поэтому там не получить ни заметного влияния, ни стабильного бенчмарка. Поэтому пришлось модифицировать generateGetSpace и generateGetPixel, которые вызываются много раз.

Константа COLOR_FN

Посмотрел подробнее – оказалось, что практически всегда в функции передается AnyLch. То есть COLOR_FN использовать можно. Я вынес эту проверку в функцию getProxyColor (насколько я знаю, JIT умеет инлайнить такое).

Есть всего одно исключение, где в getSpace может попасть что-то другое: https://github.com/evilmartians/oklch-picker/blob/16fce6f13ab8fb2c8e148767ae2d33a8ecffdd06/stores/current.ts#L194 Тут промежуточное преобразование может оказаться лишним. Но во-первых, именно может – в некоторых случаях да, в некоторых нет. А во-вторых, там обрабатываются единичные цвета, поэтому на перфоманс не влияет. В остальных случаях rgb-цвета проверяются напрямую функциями inRGB/inP3.

Хотя, если хочется сделать красивее, можно подумать над рефакторингом с уточнением типов.

Вообще, если бы у Culori был прямой переход OKLab->xyz65, можно было бы вообще убрать условие и делать промежуточный цвет xyz65 всегда. Но без прямой конвертации получается хуже.

Перфоманс

Выигрыш есть и он тем заметнее, чем больше включено цветовых режимов. Если включить всё, у меня по Full paint получается -30...35% в Хромиуме и -20...25% в FF.