使用Qt构建光线追踪器,无法在paintEvent中逐像素显示

Building a ray tracer with Qt, cannot display pixel by pixel in paintEvent

我正在使用 Qt 构建带有 GUI 的光线追踪器。理想的效果是在计算像素的 RGB 值后立即绘制像素,就像在大多数专业渲染器中一样。但是我发现我的跟踪器只能在下面的循环后显示整个渲染图像:

for(int i=0; i<row; ++i)
    for(int j=0; j<column; ++j) {
        compute pixel value;
        painter.drawPoint(i, j);
    }

我正在绘制到主窗口的中央小部件。我重新实现了 QWidget paintEvent 函数并将上面的循环放在这个函数中。似乎 paintEvent 只在执行一次后显示整个屏幕,在此过程中它给了我这个:

我不知道这是 paintEvent 的工作原理还是我做错了什么。

反正不能实时显示像素。这对于交互式示踪剂来说是非常不令人满意的。希望大伙能给出一些解释and/or的解决办法。一百万个感谢!

OS 向您发出 "not responsive" 警报,因为您正在 GUI 线程 中进行所有计算。

这意味着事件循环卡在 进行繁重的计算中,无法处理其他事件。

在 Windows 系统上,这意味着它不会对 Windows 消息做出反应。这就是为什么在一段时间后 OS 告诉您应用程序没有响应。

您应该在独立线程中执行繁重的计算,当您想要更新 GUI 并让 GUI 线程执行渲染时,将结果传递给 GUI 线程。

除此之外,您应该考虑绘制到后台缓冲区,如评论中所建议的(尽管请注意 QPixmap 不是线程安全的)。

QPainter::drawPoint() 非常慢,而且它是绘制整个中心区域的低效方法。

请查看文档 here 以了解有关如何保持 GUI 响应的更多详细信息。