连续光线投射之间的时间延迟

Time delay between consecutive ray castings

作为 this post, I have created a Qt3D project which is a modified version of a Qt3D example 的跟进。我正在 运行 在 openSUSE Linux 和 GCC-7 上使用 Qt 5.13.1 连接我的项目。在我的项目中,我可以在连续的光线投射之间使用时间延迟。我做了一些意想不到的观察:


main.cpp 文件上,当我 运行 这一行时,光线投射在某个点卡住了,无法继续:

ConsecutiveRayCaster *consecutiveRayCaster = new ConsecutiveRayCaster(scene, TimeDelayStatus::NoDelay);

然而,当我运行这一行时,即使时间延迟设置为0 msec,所有连续的光线投射都没有任何问题,:

ConsecutiveRayCaster *consecutiveRayCaster = new ConsecutiveRayCaster(scene, TimeDelayStatus::SomeDelay, 0 /* milliseconds */);

这个开关带来了不同:

switch (m_timeDelayStatus) {
case NoDelay:
    rayCaster->trigger(origin, direction, length);
    break;
case SomeDelay:
    QTimer::singleShot(m_timeDelayBetweenRayCasts, [rayCaster, origin, direction, length](){ rayCaster->trigger(origin, direction, length); });
    break;
    }

我想知道为什么?

不同行为的原因在于 trigger() 函数的调用方式。在第一种情况下(无延迟),执行会一直等到 trigger() 函数退出。然而在第二种情况下,函数调用被安排执行并且 QTimer::singleShot() 函数几乎立即退出而不等待 trigger() 函数调用 returns.