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

3
作为对这篇文章的跟进,我创建了一个Qt3D项目,这是Qt3D示例的修改版本。 我在openSUSE Linux上使用GCC-7的Qt 5.13.1运行我的项目。 在我的项目中,我可以在连续光线投射之间使用时间延迟。 我做了一些意外的观察:


当运行此行时,位于main.cpp文件中,光线投射在某个点卡住无法继续进行:

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

然而,当我运行这行代码时,即使将时间延迟设置为0毫秒,所有连续的光线投射都能够正常进行,没有任何问题:
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;
    }

我想知道为什么?

1个回答

3
不同行为的原因在于如何调用trigger()函数。在第一个情况(没有延迟)中,执行等待trigger()函数退出。但是,在第二种情况下,函数调用被安排为执行,并且QTimer::singleShot()函数几乎立即退出,而不会等待trigger()函数调用返回。

已点赞 =),但我不明白为什么“NoDelay”会导致光线投射停止不完整。 - user3405291
1
因为它会等待trigger()完成并返回。关键区别在于执行顺序。 - vahancho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接