urho3d/urho3d

Toolset Visual Studio 2022 (v143) поломан

1vanK opened this issue · 12 comments

1vanK commented

Если скомпилировать движок с тулсетом Visual Studio 2022 (v143) в релизной версии пушка из примера https://github.com/urho3d-learn/editor при анимации сжимается в блин. В отладочной версии, а также с тулсетом Visual Studio 2019 (v142) анимация у пушки нормальная

1vanK commented
void AnimationState::ApplyTrack(AnimationStateTrack& stateTrack, float weight, bool silent)
{
    Vector3 newPosition;
    Quaternion newRotation;
    Vector3 newScale;

    if (interpolate)
    {
        ...
    }
    else
    {
        if (!!(channelMask & AnimationChannels::Position))
            newPosition = keyFrame->position_;
        if (!!(channelMask & AnimationChannels::Rotation))
            newRotation = keyFrame->rotation_;
        if (!!(channelMask & AnimationChannels::Scale))
        {
            newScale = keyFrame->scale_;
            //URHO3D_LOGINFO("!!!!! newScale " + String(newScale.x_) + " "
            //    + String(newScale.y_) + " " + String(newScale.z_));
        }
    }
}

Если раскомментировать вывод в лог, то всё работает. Без вывода в лог оптимизатор хавает переменную newScale и игра багует.
Можно вручную установить newScale = Vector3::ONE; вместо newScale = keyFrame->scale_; и тогда тоже работает.

1vanK commented

Эта ошибка есть даже в версии 1.8.0: https://github.com/urho3d/Urho3D/releases/tag/1.8

1vanK commented

Возможно всплыли последствия нарушения strict alias rules, которые в Урхо нарушаются повсеместно

1vanK commented

Проблема воспроизводится в версии https://github.com/urho3d/Urho3D/releases/tag/1.8-ALPHA

1vanK commented

Ошибка есть в 64-битной версии -G "Visual Studio 17 2022" -A x64, но нет в 32-битной -G "Visual Studio 17 2022" -A Win32

1vanK commented

Такая же проблема в 18-м примере (и в нативной и в AS версии)

изображение

1vanK commented

Такой способ позволяет обойти проблему, но это тупо

        if (!!(channelMask & AnimationChannels::Position))
            newPosition = keyFrame->position_;
        if (!!(channelMask & AnimationChannels::Rotation))
            newRotation = keyFrame->rotation_;
        if (!!(channelMask & AnimationChannels::Scale))
        {
            newScale = keyFrame->scale_;
            
            newScale *= 2.f;
            newScale *= 0.5f;
        }
1vanK commented

Еще помогает замена конструктора копирования у Vector3:

    /// Assign from another vector.
    //Vector3& operator =(const Vector3& rhs) noexcept = default;

    Vector3& operator =(const Vector3& rhs) noexcept
    {
        x_ = rhs.x_;
        y_ = rhs.y_;
        z_ = rhs.z_;

        return *this;
    }

Но легче просто подождать исправления бага в компиляторе

1vanK commented

VS 17.5.0 Preview 1.0 обновилась до VS 17.5.0 Preview 2.0, проблема осталась

1vanK commented

Временный фикс добавил, но очевидно, что другие баги могут вылезать вообще в рандомных местах

1vanK commented

Опции CMake для вопроизведения в будущем

cmake.exe repo -B build_vs -G "Visual Studio 17" -A x64^
 -D URHO3D_OPENGL=1 -D URHO3D_D3D9=1 -D URHO3D_D3D11=1^
 -D URHO3D_LIB_TYPE=STATIC -D URHO3D_STATIC_RUNTIME=0 -D URHO3D_HASH_DEBUG=0 -D URHO3D_MINIDUMPS=0 -D URHO3D_TESTING=1^
 -D URHO3D_ANGELSCRIPT=1 -D URHO3D_FORCE_AS_MAX_PORTABILITY=0 -D URHO3D_LUA=1 -D URHO3D_LUAJIT=0 -D URHO3D_GENERATEBINDINGS=1^
 -D URHO3D_SAMPLES=1 -D URHO3D_TOOLS=1 -D URHO3D_DOCS=0^
 -D URHO3D_NETWORK=1 -D URHO3D_DATABASE_SQLITE=1 -D URHO3D_TRACY_PROFILING=0 -D URHO3D_PHYSICS2D=1 -D URHO3D_URHO2D=1
1vanK commented

Обновилось до Version 17.5.0 Preview 3.0, проблема осталась