我正在开发一个传统的 Roguelike 项目。我有一个玩家日志,显示发生了什么,在这里移动,机器人攻击玩家,玩家施放能力等。这是相当有用的信息,并且经常更新,每次玩家采取行动时,都会生成至少一行,如果有的话周围有任何敌人也会产生线条吗?
我使用包裹在滚动矩形内的视口内的 TMP 来显示日志的最后 10 行左右,并且滚动矩形使我们能够向上滚动以查看之前的行。
最初,我会天真地向 TMP.text 添加行,这只会增长,但是,我很快注意到性能问题,每当附加文本时,TMP.GenerateTextMesh/GenerateText 调用都会快速增长到明显的程度一百行左右后游戏速度变慢。
为了部分解决这个问题,我现在将日志的文本存储在旋转循环缓冲区中,并在 TMP.text 中仅保留 20 行左右,这使得性能变得不错。但是,当添加新行或用户滚动查看旧行时,.text 值仍然需要更改。即使文本量相对较小(20 行左右),对 TMP.GenerateText 的调用也需要大约 10 毫秒(启用深度分析器),这对于相对简单的 UI 来说是一个疯狂的成本。成本是每次更新的,因此一旦制作文本,渲染成本就很便宜,但如果您的文本字段经常更改,则成本过高。
是否有更好的解决方案来显示内容频繁变化的动态文本字段?我想任何带有聊天客户端的东西都会面临类似的问题,所以必须有一个解决方案。
根据 derHugo 的想法,当用户频繁按键并生成大量文本更改时,每 X 毫秒批量处理传入文本会产生巨大的性能差异。
现在,当新文本进入时,如果批处理时间尚未开始,它将启动批处理计时器,收集接下来 250 毫秒的所有文本,然后使用新数据更新 TMP。
确保您没有创建如此多的字体资源,而是复制具有相同字体图集的原始材料,并使用您想要的绽放或光线进行自定义。 当您不需要桌面版本时,请使用移动模式。
确保包含 TMP 组件的画布未启用像素完美。该设置将在每个滚动事件上触发GenerateText调用,并可能以大量方式触发坦克性能。
如果您需要像素完美,您可以将文本组件放在子画布中,并关闭像素完美,并将其他元素保留在父画布中。