分析函数内存和 CPU 使用情况
Analyzing function memory and CPU usage
我正在制作一个视频游戏,这是一个非常小的 2D 射击游戏。最近我注意到当场景中有大约 9 颗或更多子弹时,帧速率会急剧下降。我的笔记本电脑可以玩高级 3D 游戏,而且我的游戏非常非常简单,所以硬件应该不是问题。
所以现在我有一个非常大的代码(至少对于一个人来说)而且我很困惑我应该在哪里寻找?和子弹相关的函数太多了类,比如不知道怎么分析是渲染函数有问题还是更新函数有问题?其他程序我可以使用MVS 2015调试工具,但是对于一个游戏来说,它不实用,例如,如果我在渲染函数之前放置一个断点,它应该在一秒钟内检查60次而且我无法输入任何东西所以我永远不会有子弹来测试渲染功能!我尝试使用任务管理器,我发现每个子弹的 CPU 使用率上升得非常快,但是当游戏速度变慢时,只使用了 CPU 的 10%!
所以我的问题是:
无法使用调试工具如何分析函数?
为什么游戏在使用系统资源的情况下变慢了?
要查看哪个部分消耗了最多的处理能力,您应该使用一个函数profiler。它不会 "debug",但会在完成后创建一份报告。
Valgrind 是一个很好的工具。
为什么游戏变慢了?取决于您的实施。我可以创建一个程序来除以两个数字,并让它花费 5 分钟来计算结果。
当谈到内存漏洞时,Valgrind 是一个很好的工具,正如量子物理学家已经指出的那样。
为了计时,我会编写自己的小型 tracing/profiling 工具(如果我的 IDE 还没有的话)。使用文本调试输出将短消息写入日志文件。类似的东西:
void HandleBullet() {
printf("HandleBullet START: %i", GetSysTime());
// do your function stuff
printf("HandleBullet END: %i", GetSysTime()); // or calculate time of function directly
}
在您认为可能花费太长时间的所有函数中写入这些调试消息。
执行一段时间后,您可以查看该文件并查看是否发生了明显的事情(某处阻塞)。
如果没有,请使用您选择的高级语言为您创建的日志文件编写一个小型解析器来整理和分析您的输出。计算诸如在某些功能上花费的总时间之类的东西,或者计算哪些功能花费时间最长的图表。如果您坚持使用易于解析的日志消息样式,应该不会太难。
我们也在 video-game 行业,我们在 PC 上使用一个非常简单的工具进行 CPU 分析:非常困。
http://www.codersnotes.com/sleepy/
这很简单,但确实帮助了我很多次。只需从 IDE 启动程序,让非常困倦的 运行 获得几千个样本,然后就可以开始了!
我正在制作一个视频游戏,这是一个非常小的 2D 射击游戏。最近我注意到当场景中有大约 9 颗或更多子弹时,帧速率会急剧下降。我的笔记本电脑可以玩高级 3D 游戏,而且我的游戏非常非常简单,所以硬件应该不是问题。
所以现在我有一个非常大的代码(至少对于一个人来说)而且我很困惑我应该在哪里寻找?和子弹相关的函数太多了类,比如不知道怎么分析是渲染函数有问题还是更新函数有问题?其他程序我可以使用MVS 2015调试工具,但是对于一个游戏来说,它不实用,例如,如果我在渲染函数之前放置一个断点,它应该在一秒钟内检查60次而且我无法输入任何东西所以我永远不会有子弹来测试渲染功能!我尝试使用任务管理器,我发现每个子弹的 CPU 使用率上升得非常快,但是当游戏速度变慢时,只使用了 CPU 的 10%!
所以我的问题是:
无法使用调试工具如何分析函数?
为什么游戏在使用系统资源的情况下变慢了?
要查看哪个部分消耗了最多的处理能力,您应该使用一个函数profiler。它不会 "debug",但会在完成后创建一份报告。
Valgrind 是一个很好的工具。
为什么游戏变慢了?取决于您的实施。我可以创建一个程序来除以两个数字,并让它花费 5 分钟来计算结果。
当谈到内存漏洞时,Valgrind 是一个很好的工具,正如量子物理学家已经指出的那样。 为了计时,我会编写自己的小型 tracing/profiling 工具(如果我的 IDE 还没有的话)。使用文本调试输出将短消息写入日志文件。类似的东西:
void HandleBullet() {
printf("HandleBullet START: %i", GetSysTime());
// do your function stuff
printf("HandleBullet END: %i", GetSysTime()); // or calculate time of function directly
}
在您认为可能花费太长时间的所有函数中写入这些调试消息。 执行一段时间后,您可以查看该文件并查看是否发生了明显的事情(某处阻塞)。 如果没有,请使用您选择的高级语言为您创建的日志文件编写一个小型解析器来整理和分析您的输出。计算诸如在某些功能上花费的总时间之类的东西,或者计算哪些功能花费时间最长的图表。如果您坚持使用易于解析的日志消息样式,应该不会太难。
我们也在 video-game 行业,我们在 PC 上使用一个非常简单的工具进行 CPU 分析:非常困。
http://www.codersnotes.com/sleepy/
这很简单,但确实帮助了我很多次。只需从 IDE 启动程序,让非常困倦的 运行 获得几千个样本,然后就可以开始了!