1. C++ / Говнокод #5982

    +160

    1. 1
    2. 2
    float alpha = float(m_startAlpha) + 255.0f * (getElapsed() / (m_duration * (1.0f - float(m_startAlpha) / 255.0f)));
    m_target->setAlpha(static_cast<uint8_t>(alpha));

    Выдержка из обновления объекта-действия, производящего линейный фейд-аут объекта...

    Общение с чужим говнокодом не проходит бесследно... что же я курил, перед тем как ЭТО соорудить?

    Запостил: Kirinyale, 14 Марта 2011

    Комментарии (5) RSS

    • уточнение: не фейд-аут, а фейд-ин, но в фейд-ауте тоже было что подобное
      Ответить
    • Собственно, говнокодовым потенциалом тут обладает именно использование типа 'float' в программе. За исключением некоторых особых случаев, назначение типов 'float', 'short' и т.п. примерно совпадает с назначением битовых полей - они служат для экономии памяти при хранении массовых данных. Т.е. если есть у вас некая структурка, которая будет аллоцироваться миллионами экземпляров, то имеет смысл в ней использовать 'float' вместо 'double' и 'short' (или даже 'signed char') вместо 'int' (при условии, конечно, что диапазон/точность вас устраивают). Это существенно сэкономит память. А в остальных случаях смысла в использовании типа 'float' нет. В тексте программы плавающие вычисления делаются в типе 'double', даже если потом вы положите финальный результат во 'float'.

      Существуют исключения из этого принципа, не по коду выше трудно сказать, оно это или нет.
      Ответить
      • Не так давно один человек, лучше меня знакомый с DirectX, насмотревшись на double в нашем предыдущем проекте, взял и принудительно заменил его повсюду на float. Аргументов было два:
        1) Такая точность, которую даёт float, нам нигде нафиг не нужна. Даже при отсчёте времени (таких FPS, чтобы это стало критичным, наверно, ни одна нетекстовая игра не даст).
        2) DirectX по умолчанию весьма интересно ведёт себя с double, сводя любую возможную пользу от его использования к нулю.
        http://chrisvall.com/coding/directx-trouble-with-double-values-rounding-offnot-returning-a-proper-precision-value-after-initializing-directx

        Да, и с чего бы это вычислениям вестись в double, если я напишу что-нибудь типа (5.0f * 0.5f)?
        Ответить

    Добавить комментарий