- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
对于科学任务,屏幕上应显示具有稳定频率(最大 60 Hz)的闪烁区域。我尝试使用 Qt 5.6 实现稳定的刺激可视化。
根据这个blog entry和许多其他在线建议,我实现了三种不同的方法:继承自 QWindow 类、QOpenGLWindow 类和 QRasterWindow 类。我想获得 vsync 的优势并避免使用 QTimer。
可以显示闪烁区域。帧之间的稳定时间段也被测量为 16 到 17 毫秒。但是每隔几秒就会发现一些丢失的帧。可以很清楚地看到,没有刺激的稳定可视化。所有三种方法都会产生相同的效果。
我是否已正确执行我的代码或是否存在更好的解决方案?如果代码足以满足其目的,我是否必须假设这是硬件问题?显示一个简单的闪烁区域有那么难吗?
非常感谢你帮助我!
例如,您可以在此处查看我的 QWindow 类代码:
Window::Window(QWindow *parent)
: m_context(0)
, m_paintDevice(0)
, m_bFlickerState(true){
setSurfaceType(QSurface::OpenGLSurface);
QSurfaceFormat format;
format.setDepthBufferSize(24);
format.setStencilBufferSize(8);
format.setSwapInterval(1);
this->setFormat(format);
m_context.setFormat(format);
m_context.create();}
被覆盖事件函数调用的render()
函数是:
void Window::render(){
//calculating exposed time between frames
m_t1 = QTime::currentTime();
int curDelta = m_t0.msecsTo(m_t1);
m_t0 = m_t1;
qDebug()<< curDelta;
m_context.makeCurrent(this);
if (!m_paintDevice)
m_paintDevice = new QOpenGLPaintDevice;
if (m_paintDevice->size() != size())
m_paintDevice->setSize(size());
QPainter p(m_paintDevice);
// draw using QPainter
if(m_bFlickerState){
p.setBrush(Qt::white);
p.drawRect(0,0,this->width(),this->height());
}
p.end();
m_bFlickerState = !m_bFlickerState;
m_context.swapBuffers(this);
// animate continuously: schedule an update
QCoreApplication::postEvent( this, new QEvent(QEvent::UpdateRequest));}
最佳答案
我从 qt-forum 得到了一些专家的帮助。可以关注整个讨论here .结果是这样的:
"垂直同步很难 ;) 基本上它是在与系统固有的噪音作斗争。如果输出显示 16-17 毫秒,那就是问题所在。 17 毫秒太多了。这就是您看到的跳过。
有几件事可以减少噪音:
没有直接关系,但它会让你的代码更干净:
应用这些位,我能够从您的示例中删除跳过。请注意,跳过将发生在某些情况下,例如当您移动/调整窗口大小时或当操作系统/其他应用程序忙于做某事时。你无法控制它。"
关于c++ - Qt:vsync - 缺少渲染帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37239900/
根据 ffmpeg 文档 -vsync parameter Video sync method. For compatibility reasons old values can be specifi
我正在尝试使我的窗口应用程序与显示器刷新垂直同步。此代码可在“fullscreen = true”(报告 75FPS,显示器刷新率)下正常工作,但在窗口模式下仅报告 32FPS。有人知道我在这里做错了
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 6 年前。 Improve t
我正在决定是否将 VSync 用于我一直使用 OpenGL 开发的新游戏。目标是为用户提供最佳的游戏体验,并在性能和质量之间取得良好的平衡。该游戏设计为可在较旧的(Intel/上网本)计算机和较新的(
我正在用 C 语言制作一款适用于 linux 帧缓冲区的游戏。到目前为止,我有一个红色的 100x100 正方形,它与鼠标一起移动,就像指针一样。我已经实现了双缓冲并且它工作正常(方 block 不闪
当 vsync 不是一个选项时,与监视器刷新同步的首选方法是什么?我们启用了 vsync,但是,一些用户在驱动程序设置中将其禁用,并且这些用户会覆盖应用程序首选项。我们需要可靠的可预测帧长度来正确模拟
我正在寻找一种可移植方法来制作非阻塞 SwapBuffers(),即使 VSync 已激活。 换句话说,是否有可能收到事件通知或知道下一个 VSync 之前的延迟? 最佳答案 IIRC 此扩展可帮助:
我使用 UDP API 将相机源更新到 ImageSource,我有一个计时器更新 ViewModel 的 ImageSource,然后 WPF 数据绑定(bind)屏幕上的图像。 计时器的间隔时间与
在注意到我的游戏在构建到我的iOS设备上时非常不稳定时,我检查了事件探查器,发现vsync负责。经过一些研究,我发现为了解决游戏的抖动问题,我不得不将目标帧频设置为60,因为默认情况下将其设置为30。
我一直在研究游戏循环和物理。前几天,我添加了一些调试语句来查看我的游戏循环的每一帧花费了多少时间。正如预期的那样,结果在 16 毫秒范围内。但是,我尝试禁用 vsync,这些结果并没有改变。显然 vs
在我实现的 2D OpenGL 引擎中,我有一个固定的时间步长,如著名的 fix your timestep 中所述。文章,以及混合。 我有一个垂直移动的测试对象(y 轴)。运动中存在卡顿(预编程运动
我正在调查我的 Android 应用中的丢帧问题。它们是不规则的,平均每秒发生一次。我已将有问题的渲染器配对回一个非常简单的着色器,我相信帧渲染时间很短。 当我运行 systrace 时,我可以看到看
对于科学任务,屏幕上应显示具有稳定频率(最大 60 Hz)的闪烁区域。我尝试使用 Qt 5.6 实现稳定的刺激可视化。 根据这个blog entry和许多其他在线建议,我实现了三种不同的方法:继承自
我在同一个主线程中使用三个不同的 QGLWidgets,最好以 60fps 渲染,但我无法达到超过 20fps。这似乎是由 Vsync 引起的,因为每个小部件可能会尝试独立地与刷新率同步,因此它们会以
所以,我在窗口应用程序中使用 D3D。 我使用以下参数初始化 D3D: windowed: true; backbufferformat: D3DFMT_X8R8G8B8; presentinterv
对于我所有的 SDL/OpenGL 程序,帧速率都停留在 60fps,所以看起来 vsync 已启用,但不是由我,也不是在我的代码或我的设置中。所以我想现在是否有办法禁用它,也许在一些深层的 macO
使用时 AnimationController ,那vsync的目的是什么?范围? class Example extends StatefulWidget { @override _Exam
AnimationController 停止工作,因为不知何故 vsync 不再是命名参数。 这行代码停止工作。controller = AnimationController(duration: D
我目前正在为 Android 开发一款游戏,我想截取它的屏幕截图。我是在 eclipse 中使用 DDMS 工具这样做的。但是,大多数屏幕截图都是两帧的混合: ___________ |new fra
我正在使用 XWindow Drawable、Pixmap 和 XRender 在屏幕上绘制一些东西。我可以看到有时会出现闪烁。有没有办法等待VBLANK?我已经在谷歌上搜索了很多,感觉就像在森林里寻
我是一名优秀的程序员,十分优秀!