首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL与CPU/GPU定时器同步

OpenGL与CPU/GPU定时器同步
EN

Stack Overflow用户
提问于 2014-11-25 15:08:38
回答 1查看 1.4K关注 0票数 1

我正在尝试制作一个CPU和GPU分析器,用于电子游戏。目标是拥有屏幕上的2张图表,给出帧的不同任务所花费的时间。这是一个非常粗略的例子,说明它是什么样子的:

我使用QueryPerformanceCounter (在Windows上)获取CPU时间,使用glQueryCounter(GL_TIMESTAMP)获取GPU时间。

问题是,我为CPU和GPU获得的时间并不是相对于相同的来源。我第一次尝试解决这个问题,是在应用程序初始化期间对GPU时间戳(使用glGetInteger64v(GL_TIMESTAMP))进行阻塞调用,然后是CPU时间的get。这两次之间的差异使我基本上可以将GPU时间转换为CPU时间,并使这两个图形同步。但是过了几秒钟(或几分钟),时间在漂移,我的图形不再正确地同步了。

游戏开始后,我不能再打一个拦截电话来获得GPU的时间,因为我不想松开一个框架,让游戏结结巴巴。

有没有人尝试这样做,或者对如何在不影响性能的情况下同步CPU和GPU时间有任何建议?

我有另一个想法,但我不知道它是否会正常工作:让一个单独的线程进行阻塞调用,以获得GPU时间,也得到CPU时间,并以某种方式将差异发送回主线程。然后线程会休眠几秒钟,然后重新开始。如果这个看起来不错的话,我会尝试并更新这篇文章。

编辑:,我在上面的一个AMD和NV卡上尝试了这个想法,它看起来很好。即使在多次调用glGetInteger64v(GL_TIMESTAMP)时(每次调用之间的睡眠仅为1ms ),它似乎对性能没有任何影响。我仍然需要进行更深入的测试,但到目前为止,这似乎是一个很好的解决方案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-29 15:01:06

我创建了一个单独的线程,对glGetInteger64v(GL_TIMESTAMP)进行阻塞调用。它在性能上没有明显的差别,即使在每个呼叫之间等待一些愚蠢的小东西,比如1ms。尽管需要注意的是,在此修改之前,我已经有了几个OpenGL上下文。

在最后的代码中,我在每次调用glGetInteger64v(GL_TIMESTAMP)之间等待30秒。这似乎经常足以避免任何可见的漂移,在所有的个人电脑,我测试。

我测试了Nvidia卡(GTX 460,GTX 660,GTX 780 HD,GTX 780米)和AMD (Radeon HD 7950),所有这些都带有Intel CPU。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27130200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档