В пику посту C++20 и 2D Graphics
Если представить «тортность» С++ в виде функции от версии, то её пик придется где-то между 11м и 14м плюсами. 11е плюсы добавили много того, что давно требовалось и вопияло. 14е плюс добавили немного нужностей, не вошедших в 11е и много того, что в общем-то не особо-то и нужно. То есть это наверно нужно каким нибудь ополоумевшим обезьянам, которые используют С++ как навороченый брейнфак, из которого надо выжать максимум. Но можно было дать им просто обфускатор же.
А дальше «остапа понесло», и донесло его до 2Д-графики как финала идиотизма. Далее я объясню почему, и прошу запастись терпением.
У мну как-то случился спор с безумным аноном, который рассказывал нам истории для кота и лампы про некое специальное железо в GPU, которое умеет в аппаратное 2D. Анон плевался ядовитым калом(зачем он носит кал во рту? это же мерзко), а я смиренно пытался донести до него ту простую истину, что надпись «наше железо умеет в Х» не означает, что железо умеет в Х в буквальном смысле. Там драйвер на самом деле сидит, который дает некоторый интерфейс, и адаптирует его запросы к конкретному железу.
OpenVG про которое шла речь(а именно оно в конечном итоге и будет приделано к С++20) работает на 3Д-железе просто потому, что оно 3Д и другого там нет. Это железо можно использовать как 2Д но блин у него же нет отдельного пути для заброса 2Д команд ибо зачем? 2Д это как 3Д только Z=0, и шейдеры особенные(на самом деле нет). Более того, в мануале от АРМа пишется про кэш путей(pathов) и этот кэш обсчитывается на обычном процессоре. Не умеет GPU в такие алгоритмы.
Кому интересно как это работает, читать тут: https://brage.bibsys.no/xmlui/bitstream/handle/11250/252871/565821_FULLTEXT01...
К чему я это всё. Как я уже сказал выше, 2Д это 3Д только с особенными шейдерами. По сути это урезанное 3Д. То, что хотят впилить в С++20 - это урезанное 3Д. Ключевое слово - урезанное. Вам дадут в зубы API, возможности которого будут вас ограничивать. Например вы хотите нарисовать овал, но закрасить его своим шейдером, а не одним из вариантов заливки, но API вам этого не даст. Представьте что вам на OpenGL4-оборудовании вам доступен OpenGL1.4 и всё. А это на самом деле охеренное ограничение. Это только издалека кажется что херня.
Еще одна проблема: 2Д используется для отрисовки интерфейса. А интерфейс это много повторяющихся объектов. То есть pathы у них разные, но они как бы это сказать ... параметризированы. То есть обвод кнопки у вас один и тот же, а параметрами будет её положение и габариты, плюс состояние кнопки. Ну и плюс градиент из CSS. И вот тут-то происходит попадалово на производительность.
Дело в том, что GPU лучше всего рисует когда у вас объекты сгруппированы по аргументам, минимум переключений шейдера и т.д.. А как рисуется интерфейс? А там никакой группировки нет, совсем наоборот. Каждый контрол сует свои команды как будто он один на пляже. Отрисовал фон, отрисовал обвод, отрисовал текст, отрисовал иконку. Следующий отрисовал фон, отрисовал обвод, отрисовал текст, отрисовал иконку. Следующий... А хуже всего то, что если у вас надо перерисовать область, которая НЕ ИЗМЕНИЛАСЬ, то вам придется дрючить код контролов заново. Кэширование? щас. Кэш там есть, но как я выше сказал, сводится он к тому, что драйвер что-то там у себя хранит
Причем эта ситуация ВЕЗДЕ такая. Все разработчики API слизывают друг у друга одну и ту же идею. Потом её стандартизуют. И она каменеет как говно мамонта.