
性能优化
文章平均质量分 91
RuntimeCube
这个作者很懒,什么都没留下…
展开
-
[C#] Foreach 循环还会产生垃圾吗?
虽然所有其他收集类型都没有改变它们产生的垃圾量,但至少它们使用的垃圾量都不比 Unity 5.2 中的垃圾量多。Dictionary、HashSet、LinkedList、Queue 和 Stack 现在在第一个循环上创建相同的 8 或 16 字节更少的垃圾,并在之后的任何循环上创建零垃圾。一年前,我写了一篇文章,标题为使用 Unity 5.2 进行 Foreach 循环创建垃圾,并使用各种集合测试了 foreach:列表、字典、数组等。所有代码和运行它的步骤仍然适用。翻译 2024-04-23 15:58:00 · 252 阅读 · 0 评论 -
[C#] C# String.Format() 和 StringBuilder
这很重要的原因是,在内部,String.Format() 实际上创建了一个 StringBuilder 并调用 StringBuilder.AppendFormat()!正如您所看到的,了解何时使用 String.Format 以及何时使用 StringBuilder.AppendFormat() 非常重要。而且,删除对 String.Format 的调用还可以提高性能。如果您试图避免通过使用 String.Format() 连接字符串来创建 StringBuilder,了解这一点也很重要。翻译 2024-04-21 21:08:47 · 353 阅读 · 0 评论 -
[C#] 何时在 .NET Core 中使用 String 与 StringBuilder
在 .NET Core 中处理字符串时,您会经常使用的两个流行类是 String 和 StringBuilder 类。在使用这两个类构建最小化分配且高性能的应用程序时,您应该了解最佳实践。本文讨论在 C# 中使用字符串时可以遵循的最佳实践。翻译 2024-04-21 19:56:10 · 254 阅读 · 0 评论 -
[C#] 从 Array 数据创建 ReadOnlySequence
在这篇文章中,我们进行了理论练习,并进一步了解了 ReadOnlySequence 类型。我保留对我的“SequenceReader 简介”博文中评论的最初回答。我认为我所展示的代码对于所提出的实际问题来说并不是一个明智的选择。然而,我喜欢这样的问题,因为它让我意识到,我实际上并没有考虑过 ReadOnlySequence 是如何创建的。通过小样本的调查,我更多地了解了这种类型的行为方式,我认为这是值得投入的时间。我希望您发现阅读这篇文章同样有用或至少有趣!翻译 2024-04-21 15:38:20 · 249 阅读 · 0 评论 -
[C#] SequenceReader 简介
可能值得首先解决这个问题,因为这是 .NET Core 中相当新的类型,并且您会遇到它的情况有限。不久前,添加了 Span 和 Memory 类型。它们都支持通过一致的 API 处理各种类型的连续内存区域。从那时起,许多新的构造都建立在这些类型提供的基础上。System.IO.Pipelines 就是一个这样的例子,它是一种用于处理 IO 的高性能 API。传统上,许多 IO 操作都使用流。流的一个问题是,它们让你负责管理缓冲区和在缓冲区之间复制数据。翻译 2024-04-21 10:20:32 · 408 阅读 · 0 评论 -
[Memory] 内存掌握:Unity 和 .NET 垃圾回收的比较
大家好,我叫 Dmitrii Ivashchenko,是 MY.GAMES 的软件工程师。在本文中,我们将讨论 Unity 和 .NET 中垃圾收集之间的差异。C# 编程语言的主要优点之一是自动内存管理。它消除了开发人员手动释放未使用对象的内存的需要,并显着缩短了开发时间。然而,这也可能导致大量与内存泄漏和意外应用程序崩溃相关的问题。翻译 2024-04-16 13:53:50 · 262 阅读 · 0 评论 -
[Testing] Unity性能测试
Unity 性能测试,单元测试,基准测试翻译 2024-04-15 13:47:21 · 405 阅读 · 0 评论 -
[C#] 使用 Span<T> 结构编写高性能 C# 简介
今天我们来谈谈 Span,它已经被讨论了好几年了,因为它是随 C#7.2 引入的,并在 .NET Core 2.1 及更高版本的运行时中得到支持。在本文中,我们将通过一些示例来介绍如何使用 Span ,并讨论为什么在编写下一行代码时应该考虑使用它。翻译 2024-04-10 23:37:58 · 1277 阅读 · 0 评论 -
[C#] Burst编译通用算法
许多算法被反复使用:搜索、排序、过滤等。C# 通过 LINQ 和 Array.Sort 等函数提供这些算法,但这些算法无法由 Burst 编译,因为不支持接口和委托。那么我们如何实现这些通用算法以避免一遍又一遍地重写它们呢?今天我们将探索一种解决这个问题的技术。请继续阅读以了解具体方法!翻译 2024-03-10 21:30:29 · 179 阅读 · 0 评论 -
[C#] LINQ 性能更新
为了与这些功能进行比较,测试包括完全“手动”版本和“正常”版本,该版本以更实用的方式使用相同的委托。现在,测试已更新为更加简单,并且更少依赖委托,以避免将测试框架的性能与正在测试的代码混淆。如果您想自己进行测试,只需将上述代码粘贴到 Unity 项目 “资产”(Assets)目录下的 TestScript.cs 文件中,并将其附加到新的空项目中的主摄像头游戏对象上即可。可用性完全是另一回事。今天,我们将使用 Unity 2018.1 和 IL2CPP 更新该文章的测试,看看 LINQ 最近的表现如何。翻译 2024-02-25 20:51:46 · 162 阅读 · 0 评论 -
[C#] LINQ 到底产生了多少垃圾?
考虑到这些信息,很容易建议不要逐帧使用 LINQ,因为在大多数游戏中,GC 分配即使不是完全禁止,通常也应该保持在最低限度。在最糟糕的情况下,OrderBy 的分配量高达 0.5 KB,而 ToDictionary 的情况也差不多糟糕,分配了 434 字节。其中 10 个函数分配了不止一次,而其余 7 个函数只分配了一次。对于今天的测试,我们将使用每种方法的一个重载,以保持事情简单明了。然后,只需在 CPU 使用情况剖析器的层次结构视图的 GC 分配列和内存剖析器的每帧 GC 分配中记录帧即可。翻译 2024-02-25 20:38:14 · 513 阅读 · 0 评论 -
[C#] LINQ 的CPU性能
如果您想自己尝试测试,只需将上述代码粘贴到 Unity 项目的 Assets 目录中的 TestScript.cs 文件中,并将其附加到新的空项目中的主相机游戏对象。这是可以预料的,因为他们通过了解问题的所有细节来“作弊”:元素类型、枚举类型以及每个元素要执行的函数。如果您发现带有 LINQ 查询的函数会减慢您的应用程序的速度,请考虑使用“手动”方法重写 LINQ 查询。我们将使用一个包含 1024 个元素的数组(全部为零),并在Where()中查找值1,并将Select中的每个元素加倍。翻译 2024-02-25 19:17:18 · 283 阅读 · 0 评论 -
[C#] 对象池产生的问题
很常见的是,有人问有关避免垃圾收集器的问题,但得到的答案却是“只需使用池”,就好像这立即完全解决了问题一样。虽然池通常会让垃圾收集器陷入困境,但它们也会带来一系列你必须处理的新问题。今天的文章将讨论其中的几个问题,以便您了解所涉及的权衡,并希望避免一些陷阱。翻译 2024-02-25 19:08:02 · 136 阅读 · 0 评论 -
[c#] Unity 如何禁用 GC
例如,如果我们在加载一个游戏关卡后开始使用 100 MB 的内存,并且我们知道在该关卡期间不会分配超过 100 MB 的内存,那么我们在任何可以使用的设备上都没有问题。但实际上,这些函数是 Unity 使用的现成 GC 的一部分,文件头中的最新日期是 2001 年,因此这种技术很可能会继续有效,直到 Unity 最终取代 GC。如果它不为零,则 GC 被禁用。对于游戏的帧速率关键部分禁用 GC 并在之后重新启用它(例如在加载屏幕上)可能是一个很大的好处,对于某些游戏来说是值得的,但应该非常小心地使用。翻译 2024-02-17 22:20:06 · 481 阅读 · 0 评论 -
[Unity] Catan Universe: Unity 的移动设备优化
时间是稀缺的、昂贵的、不可恢复的,这些形容词不胜枚举。我们在生活中没有太多的时间,这就是为什么我们,开发人员,可能是游戏部门最昂贵的资源。为了明智地花费时间,对完成任务可能有的不同选择进行预先研究往往是一个绝妙的主意。然而,再多的研究和准备工作也不能使你免于做出痛苦的、但很需要的超时工作。这份文件是在不同的日子里写成的;凝聚力可能会显得有些偏差。另外,本条目的结构相当不存在,但如果要我勾勒一个结构,那就是以下内容。关于本文档关于 Catan Universe关于我目标起始点和参考装置。翻译 2022-10-30 20:32:05 · 697 阅读 · 0 评论 -
[Unity] 我的像素去哪儿了?当Unity的帧调试器不够用时
RenderDoc既不是一个完美的工具,也不是Unity的帧调试器的替代品,而是一个补充工具,如果你需要那种低级别的信息,你可以轻松使用。它还很有趣,可以看到一个人可以走多远;但你走得越远,就越复杂,因为你需要对GPU硬件结构有更好的了解。我承认,使用RenderDoc可能相当耗费时间,所以记住:在优化之前先进行profile。在95%的情况下,使用Unity的帧调试器可能刚刚好,但你应该为剩下的5%做好准备,这将使你的生活像杯具一样艰难。在使用profiler的同时使用这些工具。翻译 2022-10-25 08:04:58 · 388 阅读 · 0 评论 -
[Unity] Unity Sprites:SpriteRenderer 与 CanvasRenderer(UI 图像)
下次你在使用sprite时,请考虑以下问题。如果你只有几个sprite,使用你喜欢的任何东西。如果你有成百上千的精灵,请重读本帖。使用 profiler 和 frame debugger 来了解正在发生的事情。避免使用透明度。如果你的预算允许,可以尝试用不透明的替代品来取代精灵。避免在屏幕上渲染大的sprite,因为会发生更多的overdraw。你可以在场景视图中通过选择 overdraw 作为渲染模式来轻松检查 overdraw 问题。这对粒子系统至关重要。翻译 2022-10-24 21:54:24 · 6390 阅读 · 0 评论 -
[Render] Arm Graphics Analyzer 用户指南 [4] - 分析你的捕获
了解不同的方式,你可以更详细地分析你的捕获。翻译 2022-10-19 19:22:47 · 295 阅读 · 0 评论 -
[Render] Arm Graphics Analyzer 用户指南 [3] - 开始
本章介绍了如何使用主机GUI来配置和捕获帧缓冲区内容。它还描述了如何使用图形分析器中的捕获模式来捕获额外的内容。翻译 2022-10-16 19:48:21 · 424 阅读 · 0 评论 -
[Render] Arm Graphics Analyzer 用户指南 [2] - 开始之前
按照本节中的步骤准备您的应用程序,准备好使用 Graphics Analyzer 进行跟踪翻译 2022-10-16 16:44:26 · 647 阅读 · 0 评论 -
[Render] Arm Graphics Analyzer 用户指南 [1] - 介绍
以下小节描述了 Arm 文档中使用的约定。词汇表Arm® 词汇表是 Arm 文档中使用的术语列表,以及这些术语的定义。Arm 术语表不包含行业标准术语,除非 Arm 的含义与普遍接受的含义不同。排版约定约定含义斜体引文加粗突出显示界面元素,例如菜单名称。在适当的情况下,也用于描述性列表中的术语。等宽字体表示您可以在键盘上输入的文本,例如命令、文件和程序名称以及源代码。等宽字体加下划线表示命令或选项的允许缩写。您可以输入带下划线的文本而不是完整的命令或选项名称等宽字体 斜体。翻译 2022-09-27 22:22:38 · 905 阅读 · 0 评论 -
[Profiling] 剖析 Unity 游戏的终极指南[5] - 分析和调试工具索引(完结)
使用 Unity 的工具开始您的分析,如果您需要更多详细信息,请使用适用于您的目标平台的本机分析器和调试工具。请参阅下面的此类工具的索引。翻译 2022-09-25 20:29:27 · 520 阅读 · 0 评论 -
[Profiling] 剖析 Unity 游戏的终极指南[4] - Unity分析和调试工具(下)
Memory Profiler 是 Unity 包管理器中的一个附加包。 使用 Memory Profiler 对内存进行快照,无论是在编辑器中还是在Player中运行。翻译 2022-09-25 19:02:37 · 1482 阅读 · 0 评论 -
[Profiling] 剖析 Unity 游戏的终极指南[4] - Unity分析和调试工具(上)
本节深入探讨 Unity 中可用的每个分析和调试工具的功能。翻译 2022-09-25 10:42:22 · 1480 阅读 · 0 评论 -
[Profiling] 剖析 Unity 游戏的终极指南[3] - 内存分析
了解目标设备的内存限制并制定预算对于多平台开发至关重要。在设计场景和关卡时,请坚持为每个目标设备设置的内存预算。通过设置限制和指导方针,您可以确保您的应用程序在每个平台的硬件规范范围内运行良好。您可以在开发人员文档中找到设备内存规格。例如,根据文档,Xbox One 游戏机在前台运行的游戏的最大可用内存限制为 5 GB。围绕Mehs和着色器复杂性设置内容预算以及纹理压缩也很有用。这些都影响分配了多少内存。这些预算数字可以在项目的开发周期中参考。翻译 2022-09-20 22:23:08 · 1579 阅读 · 0 评论 -
[Profiling] 剖析 Unity 游戏的终极指南[2] - 分析工作流程
VSync 将应用程序的帧率与显示器的刷新率同步。这意味着,如果您有一个 60Hz 的显示器并且您的游戏在 16.66 毫秒的帧预算内运行,那么它将被迫以 60 fps 的速度运行,而不是被允许运行得更快。将 fps 与显示器的刷新率同步可以减轻 GPU 的负担并防止出现屏幕撕裂等视觉伪影。在 Unity 中,您可以将 VSync Count 配置为质量设置(编辑 > 项目设置 > 质量)中的属性。但是,在某些平台上,获取 GPU 时序数据可能具有挑战性。翻译 2022-09-20 20:35:35 · 1361 阅读 · 0 评论 -
[Profiling] 剖析 Unity 游戏的终极指南[1] - 介绍
流畅的性能对于为玩家创造身临其境的游戏体验至关重要。通过针对各种平台和设备分析和优化您的游戏性能,您可以扩大您的玩家群并增加成功的机会。本指南汇集了有关如何在 Unity 中分析应用程序、管理其内存以及从头到尾优化其功耗的高级建议和知识。精益、高性能的代码和优化的内存使用可提高低端和高端设备的性能。注意热控制有助于移动设备上宝贵的电池周期。翻译 2022-09-05 21:27:39 · 369 阅读 · 0 评论