具有大量动态内容的 Unity TextMeshPro(或替代方案)的性能

问题描述 投票:0回答:4

我正在开发一个传统的 Roguelike 项目。我有一个玩家日志,显示发生了什么,在这里移动,机器人攻击玩家,玩家施放能力等。这是相当有用的信息,并且经常更新,每次玩家采取行动时,都会生成至少一行,如果有的话周围有任何敌人也会产生线条吗?

我使用包裹在滚动矩形内的视口内的 TMP 来显示日志的最后 10 行左右,并且滚动矩形使我们能够向上滚动以查看之前的行。

最初,我会天真地向 TMP.text 添加行,这只会增长,但是,我很快注意到性能问题,每当附加文本时,TMP.GenerateTextMesh/GenerateText 调用都会快速增长到明显的程度一百行左右后游戏速度变慢。

为了部分解决这个问题,我现在将日志的文本存储在旋转循环缓冲区中,并在 TMP.text 中仅保留 20 行左右,这使得性能变得不错。但是,当添加新行或用户滚动查看旧行时,.text 值仍然需要更改。即使文本量相对较小(20 行左右),对 TMP.GenerateText 的调用也需要大约 10 毫秒(启用深度分析器),这对于相对简单的 UI 来说是一个疯狂的成本。成本是每次更新的,因此一旦制作文本,渲染成本就很便宜,但如果您的文本字段经常更改,则成本过高。

是否有更好的解决方案来显示内容频繁变化的动态文本字段?我想任何带有聊天客户端的东西都会面临类似的问题,所以必须有一个解决方案。

unity-game-engine textmeshpro
4个回答
0
投票

根据 derHugo 的想法,当用户频繁按键并生成大量文本更改时,每 X 毫秒批量处理传入文本会产生巨大的性能差异。

现在,当新文本进入时,如果批处理时间尚未开始,它将启动批处理计时器,收集接下来 250 毫秒的所有文本,然后使用新数据更新 TMP。


0
投票
  1. 将每一行拆分为单独的 TextMeshPro-Component
  2. 如果可以的话,禁用其他功能,尤其是自动调整大小
  3. 使用较小的字体图集分辨率
  4. 使用较少字符的字体
  5. 不使用ContentSizeFitter,自行调整RectTransform的大小
  6. 从拉伸模式值禁用 RectTransform.anchors
  7. 禁用 RectMask.Culling (您可以通过反射来实现)
  8. 禁用 RectMask.Softness (您可以通过反射来实现)
  9. 通过 CanvasGroup.alpha = 0 隐藏标签,而不是通过 TMPro.alpha 或 GameObject.SetActive 或 TMPro.enabled 或 TMPro.text = Empty
  10. 如果不需要,禁用 ScrollRect
  11. 如果可以的话,不要调整 RectTransform 的大小(单行控制台)
  12. 不使用LayoutGroup,自行定位TMPro

0
投票

确保您没有创建如此多的字体资源,而是复制具有相同字体图集的原始材料,并使用您想要的绽放或光线进行自定义。 当您不需要桌面版本时,请使用移动模式。


0
投票

确保包含 TMP 组件的画布未启用像素完美。该设置将在每个滚动事件上触发GenerateText调用,并可能以大量方式触发坦克性能。

如果您需要像素完美,您可以将文本组件放在子画布中,并关闭像素完美,并将其他元素保留在父画布中。

© www.soinside.com 2019 - 2024. All rights reserved.