在Unity构建中,Debug.Log会导致延迟吗?

6

我的同事们说保留 Debug.Log 会导致延迟。 但我认为它有助于增强和加速我们的开发。 此外,我发现在生产环境中可以禁用 Debug.Log 的选项。

请给我你的意见。


1
Debug.Log 意味着在发布版本中这些调用将会被删除,使用条件编译,但你应该检查。 - johnny 5
2个回答

9
当调用Debug.Log()时,它会影响性能,因为它需要进行一些堆栈跟踪解析并将一些内容写入文件。
由于它必须深入到堆栈跟踪中,所以如果有很多Debug.Log语句,则可能会在您的构建中看到性能下降。
您可能希望通过仅在Debug Build中调用Debug.Log语句来规避这个问题。从Unity文档中可以得知:

在“构建设置”对话框中有一个名为“开发版本”的复选框。

因此,您可以这样做,只有在选中该复选框时才会调用:
if (Debug.isDebugBuild) {
     Debug.Log ("If you can see this, you are in Debug Mode");
}

一个更简单的选择是进入播放器设置并取消选中“使用播放器日志”: enter image description here 这将停止写入日志文件。

哇,我从未想过print()是一个包装器,用于提取堆栈跟踪的Debug.Log。当我研究分析器输出并看到所有提取堆栈调用时,我感到非常惊讶。 - DataGreed

5
如果每帧有几个日志记录,那么是的,这会降低性能。但是聪明地使用它只会为您提供非常重要的反馈,以了解代码内部发生了什么。它还有助于检测一些无法预测的问题,例如某些 Web 服务不起作用等等。我的建议是使用日志记录,但要聪明地使用
我建议您编写自己的日志记录器类。然后,您可以针对特定类型/场景/环境/任何内容禁用/启用日志记录。此外,我更喜欢在开头添加日志的位置,例如[ClassName.MethodName()] LOG-MESSAGE。创建自己的日志记录器类将为您带来许多好处,而且不需要花费太多时间。我个人为自己制作了自定义的日志记录器类,它可以禁用特定类型的日志记录(因此您只需在需要时打开/关闭调试,而无需更改代码,只需一个标志),并格式化日志消息,使其看起来更美观。它最终还是使用Debug.Log。它编译到单独的程序集中,因此如果您在Unity控制台中单击日志,则仍会将您重定向到触发日志的代码行。如果您不将其编译到程序集中,则会将您重定向到触发Debug.Log的自定义日志记录器方法。
这只是我使用自定义日志记录器的建议,但总的来说,我强烈建议使用日志记录。 当用户完成一些有趣的操作时触发几个日志记录不会对您的应用程序产生影响。

1
只是一个小问题,你是如何获取类和方法名称的?我已经尝试了不同的C#方法,但似乎都不起作用,而其他方法则对我来说过于复杂。最多我只能记录UnityObjectName + message。这是一个麻烦,因为我有一个静态方法在调试,但是,你知道,在Unity中双击会显示我的方法而不是调用它的类和方法。 - Salvador Lemus
1
string stackTrace = UnityEngine.StackTraceUtility.ExtractStackTrace(); string[] array = stackTrace.Split(new string[] {"\n"}, StringSplitOptions.None);然后,在数组中,您可以将每个堆栈跟踪帧分开。试试看吧! 结果会像这样: [调用Debug.log的方法] [前一个方法] [前一个前一个方法] 等等...如果将记录器类编译为单独的程序集(只需创建单独的Unity项目并搜索如何生成程序集即可。如果有问题,请告诉我),双击后它将按预期运行 - piotrmitrega
你好!我刚刚尝试了你的解决方案,似乎并不是我正在寻找的,或者我做错了什么。无论如何,你的代码向我展示了Unity中Log进程的堆栈,但由于所有的日志都来自我的Log实现,所以堆栈显示了我的脚本,我不知道我是否做错了什么,但感谢你的帮助,我会继续研究。 - Salvador Lemus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接