我正在尝试制作一个CPU和GPU分析器,用于视频游戏。目标是在屏幕上显示两个图表,提供帧中不同任务所花费的时间。以下是其非常简单的示例:
问题是我得到的CPU和GPU时间不是相对于同一起点的。我第一次尝试修复这个问题是在应用程序初始化期间进行阻塞调用以获取GPU时间戳(使用glGetInteger64v(GL_TIMESTAMP)),紧随其后的是获取CPU时间。两个时间之间的差异使我基本上可以将GPU时间转换为CPU时间并使两个图表同步。但是几秒钟(或几分钟)后,时间就会漂移,我的图表不再正确同步。
我不能在游戏开始后再进行另一个阻止调用以获得GPU时间,因为我不想失去一帧并使游戏卡顿。
有人尝试过这样做或者有任何关于如何在不影响性能的情况下同步CPU和GPU时间的建议吗?
我还有另一个想法,但我不知道它是否能很好地工作:让单独的线程进行阻塞调用以获取GPU时间,也获取CPU时间,并以某种方式将差异发送回主线程。然后,线程将休眠几秒钟,然后重新启动。如果这个方法看起来不错,我会尝试并更新帖子。
编辑:我在AMD和NV卡上尝试了上面的想法,看起来效果不错。即使调用glGetInteger64v(GL_TIMESTAMP)很多次(每次之间只有1ms的睡眠),似乎对性能没有影响。我仍然需要进行更深入的测试,但到目前为止,这看起来是一个不错的解决方案。