Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 26.09.2018
Сообщений: 4

Шаблоны + инлайны

26.03.2019, 17:55. Показов 926. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите пожалуйста, вот я сейчас использую шаблоны в надежде но то, что они мне нагенерируют много всяких разных пайплайнов для обработки графики без повторного переписывания одного и того же кода. И вот у меня есть такой шаблон для альфа смешения

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/* premultiplied target */
template<typename target_format>
struct ps_merger_premultiplied
{
    static inline void merge(PolygonShader& ps, COLOR4& src_c, void* target)
    {
        COLOR4 dst_c;
 
        // take
        const unsigned int c = *((unsigned int*)target);
        target_format::to_color(c, c >> 24, dst_c);
 
        // blend
        float inv_src_alpha = 1.0f - src_c.a;
        src_c.r = src_c.r + dst_c.r * inv_src_alpha;
        src_c.g = src_c.g + dst_c.g * inv_src_alpha;
        src_c.b = src_c.b + dst_c.b * inv_src_alpha;
        src_c.a = src_c.a + dst_c.a * inv_src_alpha;
 
        // put
        ((target_format*)target)->from_color(src_c);
    }
};
и один из вариантов target_format

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
struct b8g8r8a8_srgb
{
    unsigned int packed;
    inline b8g8r8a8_srgb(void) {}
    inline b8g8r8a8_srgb(unsigned int uint) { packed = uint; }
    static inline void to_color(unsigned int c, unsigned int a, COLOR4& color)
    {
#ifdef SAMPLER_USE_TABLES_SRGB
        color.r = srgb2float[(c >> 16) & 0xFF];
        color.g = srgb2float[(c >>  8) & 0xFF];
        color.b = srgb2float[c & 0xFF];
        color.a = linear2float[a];
#else
        color.r = ((float)((c >> 16) & 0xFF)) / 255.0f;
        color.g = ((float)((c >> 8) & 0xFF)) / 255.0f;
        color.b = ((float)(c & 0xFF)) / 255.0f;
        color.a = ((float)a) / 255.0f;
        color.srgb2lin();
#endif
    }
    inline void from_color(const COLOR4& color)
    {
        COLOR4 clr = color;
        clr.lin2srgb();
        const unsigned char r = clr.r > 1.0f ? 255 : (clr.r < 0.0f ? 0 : (unsigned char)(clr.r * 255.0f + 0.5f));
        const unsigned char g = clr.g > 1.0f ? 255 : (clr.g < 0.0f ? 0 : (unsigned char)(clr.g * 255.0f + 0.5f));
        const unsigned char b = clr.b > 1.0f ? 255 : (clr.b < 0.0f ? 0 : (unsigned char)(clr.b * 255.0f + 0.5f));
        const unsigned char a = clr.a > 1.0f ? 255 : (clr.a < 0.0f ? 0 : (unsigned char)(clr.a * 255.0f + 0.5f));
        packed = (a << 24) | (r << 16) | (g << 8) | b;
    }
};
и вроде бы всё должно быть хорошо, но я воспользовался специализацией и влепил отдельный "смешиватель" для формата b8g8r8a8_srgb
таким вот образом:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#if 1
    // immediate work faster
 
    template<>
    static inline void ps_merger_premultiplied<b8g8r8a8_srgb>::merge(PolygonShader&, COLOR4& src_c, void* target)
    {
        COLOR4 dst_c;
 
        // take
        const unsigned int c = *((unsigned int*)target);
        dst_c.r = srgb2float[(c >> 16) & 0xFF];
        dst_c.g = srgb2float[(c >>  8) & 0xFF];
        dst_c.b = srgb2float[c & 0xFF];
        dst_c.a = linear2float[c >> 24];
 
        // blend
        float inv_src_alpha = 1.0f - src_c.a;
        src_c.r = src_c.r + dst_c.r * inv_src_alpha;
        src_c.g = src_c.g + dst_c.g * inv_src_alpha;
        src_c.b = src_c.b + dst_c.b * inv_src_alpha;
        src_c.a = src_c.a + dst_c.a * inv_src_alpha;
 
        // put
        src_c.lin2srgb();
        const unsigned char r = src_c.r > 1.0f ? 255 : (src_c.r < 0.0f ? 0 : (unsigned char)(src_c.r * 255.0f + 0.5f));
        const unsigned char g = src_c.g > 1.0f ? 255 : (src_c.g < 0.0f ? 0 : (unsigned char)(src_c.g * 255.0f + 0.5f));
        const unsigned char b = src_c.b > 1.0f ? 255 : (src_c.b < 0.0f ? 0 : (unsigned char)(src_c.b * 255.0f + 0.5f));
        const unsigned char a = src_c.a > 1.0f ? 255 : (src_c.a < 0.0f ? 0 : (unsigned char)(src_c.a * 255.0f + 0.5f));
        *((unsigned int*)target) = (a << 24) | (r << 16) | (g << 8) | b;
    }
#endif
и чисто из-за того, что всё непосредственно находится в одном месте, есть заметное прибавление в скорости (5-10%)
т.е. получается что шаблоны + инлайны мне помогут не более чем вызов функций по ссылкам ( typedef void (*to_color)(unsigned int c, unsigned int a, COLOR4& color) )
или я что-то делаю не правильно?
я не ковырялся в ассемблере, так как просто по fps уже понятно что в данном месте инлайны не хотят работать
и их форсировать нельзя, так как x64.. может быть есть какой-то другой способ насильно инлайнить?

(vs2017, оптимизация /O2 /Ob2 /Oi /Ot)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.03.2019, 17:55
Ответы с готовыми решениями:

«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами».
«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». Есть ли разница в этих понятиях? Если есть, то в чём? И где (в каких...

Шаблоны. Плохо понимаемые моменты из книги "Шаблоны С++. Справочник разработчика". (Вандевурд, Джосаттис)
Так как изучаю эту книгу, то в некоторых местах возникают вопросы. Чтобы не плодить много тем, корни у которых одни, решил создать эту...

Помогите писать на С++ через шаблоны. Консуле я писал, но надо писать исползуя шаблоны
В одномерном массиве, состоящем из п вещественных элементов, вычислить: 1) количество элементов массива, равных 0; 2) сумму элементов...

3
 Аватар для FFPowerMan
2158 / 1238 / 509
Регистрация: 11.10.2018
Сообщений: 6,282
26.03.2019, 18:05
Цитата Сообщение от mihakrvl Посмотреть сообщение
C++
1
static inline void merge(PolygonShader& ps, COLOR4& src_c, void* target)
- зачем тут inline писать, если функция явно не inline. Тем более, что если тут методы, то это явно класс. Да и static, наверное, больше к классу бы подошло нежели к структуре.
0
0 / 0 / 0
Регистрация: 26.09.2018
Сообщений: 4
26.03.2019, 18:17  [ТС]
функция как раз инлайн, так как должна по плану встраиваться в другую функцию:

C++
1
2
3
4
5
6
7
8
9
10
    template<typename target_format, typename source, typename modulator, typename merger>
    static void shader(PolygonShader& ps, float x, VECTOR4& v, void* target)
    {       
        COLOR4 c;
        if(!source::get(ps, x, v, *((target_format*)target), c))
        {
            modulator::modulate(ps, c);
            merger::merge(ps, c, target);
        }
    }
merger может быть разным, в зависимости от способа блендинга
source тоже, может быть связано либо с сэмплером текстуры, либо просто с цветом
modulator тоже разный может быть, может умножать цвета на альфу как нужно, в зависимости от формата цвета (текстуры), наличия прозрачности и дополнительного цвета

в итоге по плану должно быть нагенерировано много функций "для всех случаев", может быть несколько сотен, главное чтобы inline работало... но оно, похоже не работет, и тогда нужно либо заставить его работать как-то, либо переходить на вызов функций по ссылкам
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
26.03.2019, 19:20
Цитата Сообщение от mihakrvl Посмотреть сообщение
либо переходить на вызов функций по ссылкам
Вызовы функций по ссылкам или по указателям почти не отличаются от вызовов не-inline функций (если не хуже, т.к. ещё будет разыменовывание указателей на них).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.03.2019, 19:20
Помогаю со студенческими работами здесь

Хранить шаблоны документов в базе и выводить данные в эти шаблоны
Доброго времени суток. Интересует вопрос: мне необходимо формировать вордовские документы по шаблону. У меня создан шаблон документа...

Чем отличаются шаблоны HTML и шаблоны WordPress
В чём различие между шаблонами HTML и WordPress. Кроме того, что создаются они разными способами. Конкретно имею в виду, почему их...

Шаблоны C++11
#include &lt;iostream&gt; template&lt;typename T1, typename T2&gt; auto func(T1 a, T2 b) -&gt; decltype(a&gt;b?b:a) { return a&gt;b?b:a; ...

Шаблоны
Добрый день. Не могли бы объяснить вот этот вопрос: Допускают ли шаблоны вложенность описания?

шаблоны
помогите с задачей пожалуйста нужно описать шаблон класса для хранения последовательности пар ключ - значение, написать функцию ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru