Zab
> Загрузка в регистр стоит значительно дороже, чем арифметические операции.
Из иммедиата? Аналогично самым быстрым арифметическим операциям.
Вот если грузить по адресу — могут быть варианты.
Zab
> Маски это дорого, на самом деле. Процессоры так устроены, что с константами на них работать дорого, а в масках как раз константы.
что за ерунду ты несёшь? В масках данные, которые проверяются на "константы". Где эти константы спокойно подменяются на обычное число, в случае необходимости.
Zab
> Маски это дорого, на самом деле. Процессоры так устроены, что с константами на них работать дорого, а в масках как раз константы.
Под константами подразумеваеется то что мы объявляем под "const"?
Ну тогда, получается, я правильно делаю что константами не пользуюсь в принципе. :)
Вы ни на ассемблере, ни в кодах никогда не программировали, что ли? Константы про которые я говорил, это не константы языка высокого уровня, это значения, прописанные в коде программы. Большинство простых операций в регистрах осуществляются за один тик, заполнение регистра из оперативной памяти - минимум 6 тиков. Многие вещи распараллеливаются, потому изъятие кода из памяти практически не в счет, оно предсказуемо в большинстве случаев изымается заранее, пока идет работа над предыдущими операциями, но с константами это не так.
Zab
> потому изъятие кода из памяти практически не в счет
Большинство битовых констант — это, внезапно, код.
На самом деле, если арифметики много и данные в L1, то даже чтение из памяти — практически бесплатно, ибо занимает другие порты и выполняется параллельно с арифметикой.
Zab
> заполнение регистра из оперативной памяти - минимум 6 тиков.
в корне не верное заявление. Вот если бы ты написал что "может занимать до 6 тиков" - это совершенно другой разговор.
MikeNew
> Ну тогда, получается, я правильно делаю что константами не пользуюсь в принципе.
нет ни чего ни правильного, не ни правильного в том, что ты не используешь константы.
Под константами понимается очень многое: обычные числа - которые ты вставляешь в код, перечисления - им автоматически значения присваиваются и другое.
Если ты не используешь константы, то (как я думаю) тебе сложно будет подружиться с масками. Потому что именно с именованными константами пользуются зачастую в масках (реже - перечисления, но там тоже выставляют значения, чтоб понимать, к чему это относится).
Mirrel
> Потому что именно с именованными константами пользуются зачастую в масках (реже - перечисления, но там тоже выставляют значения, чтоб понимать, к чему это относится).
Я, наверное, как-то не так представляю себе работу с масками.
Можно пожалуйста какой-нибудь небольшой код, где видно что с масками надо использовать именно константы?
MikeNew
> Можно пожалуйста какой-нибудь небольшой код, где видно что с масками надо использовать именно константы?
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
commandList->ClearDepthStencilView(dsvHandle, D3D12_CLEAR_FLAG_DEPTH | D3D12_CLEAR_FLAG_STENCIL, 1.0f, 0, 0 );
Если вам нужны булевы отдельные значения и нет цели их компактно хранить или совершать над ними параллельные одинаковые операции, маски лучше не использовать, распихать хотя бы по отдельным байтам, быстрее все работать будет.
}:+()___ [Smile]
> Большинство битовых констант — это, внезапно, код.
Учитывай, что константы обычно хранятся не в том сегменте, где команды, и предварительная выборка для них не работает.
В некоторых системах команд ты можешь запихнуть константы в последовательность команд, но делать ты это будешь сам, в кодах или на ассемблере, компиляторы такой код не порождают. x86 - не из таких систем команд, там это сделать вряд ли выйдет.
Zab
> компиляторы такой код не порождают
:facepalm:
Открой для себя godbolt, там можно предметно посмотреть, что порождают, а что — нет.
skalogryz
> glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
К этому ещё можно добавить как они объявлены:
// AttribMask GL_CURRENT_BIT = $00000001; GL_POINT_BIT = $00000002; GL_LINE_BIT = $00000004; GL_POLYGON_BIT = $00000008; GL_POLYGON_STIPPLE_BIT = $00000010; GL_PIXEL_MODE_BIT = $00000020; GL_LIGHTING_BIT = $00000040; GL_FOG_BIT = $00000080; GL_DEPTH_BUFFER_BIT = $00000100; GL_ACCUM_BUFFER_BIT = $00000200; GL_STENCIL_BUFFER_BIT = $00000400; GL_VIEWPORT_BIT = $00000800; GL_TRANSFORM_BIT = $00001000; GL_ENABLE_BIT = $00002000; GL_COLOR_BUFFER_BIT = $00004000; GL_HINT_BIT = $00008000; GL_EVAL_BIT = $00010000; GL_LIST_BIT = $00020000; GL_TEXTURE_BIT = $00040000; GL_SCISSOR_BIT = $00080000; GL_ALL_ATTRIB_BITS = $000FFFFF;
из чего видим, что выборка идёт именно из битов.
MikeNew
> Под константами подразумеваеется то что мы объявляем под "const"?
То, что мы объявляем под "const" имеет значение только для твоего компилятора, чтобы он предупредил тебя, где ты сам себе противоречишь
На реальный сгенерирированный код это почти никогда не будет влиять, как минимум потому, что есть const_cast
MikeNew
> правильно делаю что константами не пользуюсь в принципе
Заявление в духе "правильно делаю, что не пользуюсь ремнями безопасности"... Ну, дело твоё - отладкой твоего кода потом ведь не мне заниматься придётся.
Битмаски в тайлмапах
Тема в архиве.