C++ 分析函数内存和CPU使用情况

C++ 分析函数内存和CPU使用情况,c++,visual-studio,debugging,sfml,C++,Visual Studio,Debugging,Sfml,我正在制作一个视频游戏,这是一个相当小的2D射击游戏。最近我注意到,当场景中有9颗或更多子弹时,帧速率会急剧下降。我的笔记本电脑可以处理高级3D游戏,而且我的游戏非常简单,所以硬件应该不会有问题 所以现在我有一个非常大的代码(至少对一个人来说),我很困惑我应该在哪里寻找?与项目符号相关的函数和类太多,例如,我不知道如何分析渲染函数或更新函数是否存在问题?我可以将MVS 2015调试工具用于其他程序,但对于一个游戏来说,这是不实际的,例如,如果我在渲染函数之前放置一个断点,它应该在一秒钟内检查60

我正在制作一个视频游戏,这是一个相当小的2D射击游戏。最近我注意到,当场景中有9颗或更多子弹时,帧速率会急剧下降。我的笔记本电脑可以处理高级3D游戏,而且我的游戏非常简单,所以硬件应该不会有问题

所以现在我有一个非常大的代码(至少对一个人来说),我很困惑我应该在哪里寻找?与项目符号相关的函数和类太多,例如,我不知道如何分析渲染函数或更新函数是否存在问题?我可以将MVS 2015调试工具用于其他程序,但对于一个游戏来说,这是不实际的,例如,如果我在渲染函数之前放置一个断点,它应该在一秒钟内检查60次,而且我不能输入任何内容,因此我将永远不会有子弹来测试渲染函数!我试着使用任务管理器,我意识到每一个子弹的CPU使用率都会快速上升,但是当游戏速度减慢时,只有10%的CPU被使用

因此,我的问题是:

  • 当我不能使用调试工具时,如何分析函数

  • 为什么游戏在仍然可以使用系统资源的情况下会变慢


要查看哪个部分消耗了大部分处理能力,应该使用函数。它不“调试”,但完成后会创建一个报告

这是一个很好的工具


为什么游戏会慢下来?取决于您的实现。我可以创建一个将两个数字相除的程序,并使计算结果花费5分钟。

要查看哪个部分消耗了大部分处理能力,应该使用函数。它不“调试”,但完成后会创建一个报告

这是一个很好的工具


为什么游戏会慢下来?取决于您的实现。我可以创建一个程序,将两个数字相除,并使计算结果花费5分钟。

当涉及到内存孔时,Valgrind是一个很好的工具,正如量子物理学家已经指出的那样。 对于计时,我将编写自己的小型跟踪/分析工具(如果我的IDE还没有)。使用文本调试输出将短消息写入日志文件。诸如此类:

void HandleBullet() {
    printf("HandleBullet START: %i", GetSysTime());
    // do your function stuff
    printf("HandleBullet END: %i", GetSysTime()); // or calculate time of function directly
}
在您认为需要花费太长时间的所有函数中编写调试消息。 在执行一段时间后,您可以查看该文件,看看是否发生了明显的事情(在某处阻塞)。
如果没有,请使用您选择的高级语言为您创建的日志文件编写一个小型解析器,以整理和分析您的输出。计算一些东西,比如在某个函数中花费的总时间,或者绘制哪个函数花费的时间最长。如果您坚持日志消息样式,这对您来说应该不会太难

说到记忆洞,Valgrind是一个很好的工具,量子物理学家已经指出了这一点。 对于计时,我将编写自己的小型跟踪/分析工具(如果我的IDE还没有)。使用文本调试输出将短消息写入日志文件。诸如此类:

void HandleBullet() {
    printf("HandleBullet START: %i", GetSysTime());
    // do your function stuff
    printf("HandleBullet END: %i", GetSysTime()); // or calculate time of function directly
}
在您认为需要花费太长时间的所有函数中编写调试消息。 在执行一段时间后,您可以查看该文件,看看是否发生了明显的事情(在某处阻塞)。
如果没有,请使用您选择的高级语言为您创建的日志文件编写一个小型解析器,以整理和分析您的输出。计算一些东西,比如在某个函数中花费的总时间,或者绘制哪个函数花费的时间最长。如果您坚持日志消息样式,这对您来说应该不会太难

我们也在视频游戏行业,我们在PC上使用一个非常简单的工具来分析CPU:非常困倦


这很简单,但确实帮助了我很多次。只需从IDE启动程序,让“非常困倦”运行几千个样本,就可以了

我们也在视频游戏行业,我们在PC上使用一个非常简单的工具来分析CPU:非常困倦


这很简单,但确实帮助了我很多次。只需从IDE启动程序,让“非常困倦”运行几千个样本,就可以了

你需要做的是一些。通过这种方式,您可以看到哪些函数占用的时间最多或调用的次数最多,然后您可以开始查看它们以进行优化。虽然你似乎有一个好的开始,因为你知道这一定与“子弹”有关。你需要做的是一些。通过这种方式,您可以看到哪些函数占用的时间最多或调用的次数最多,然后您可以开始查看它们以进行优化。虽然您似乎有一个良好的开端,因为您知道它一定与“子弹”有关。Visual Studio有自己的堆和CPU分析器,但它们可能在社区版本中不可用,我不确定。@shayan老实说,我还没有从书中了解到这一点。我从实践中学习。尝试一下,在实践中学习。网上有很多教程。@shayan我理解,但讽刺的是,我的答案仍然适用。想想
sleep
命令。这完全取决于您的实现。你永远也找不到这个问题的单一答案。@Shayan good code实际上是一个视角的问题。老实说,你的书可能声称是关于编写好代码的,但这并不意味着它是一本关于如何编写好代码的好书。关于你关于为什么它不能使用更多的CPU资源的帖子,你把它开发成多线程了吗?程序不会自动检测可用的CPU资源量,只是从中获取资源,除非你开发游戏来实现这一点。@Shayan很多高级3D游戏都利用了一些功能,例如将工作下载到GPU上,使用计算着色器,甚至在你的CPU上做他们自己的负载平衡,为了让他们占用资源,这些特性不仅仅是程序自带的,还需要开发