在我的单个页面中,有太多纹理需要渲染,然后我才遇到屏幕打开问题,但我能够解决这个建议:
OnBecomeVisible for Canvas UI Objects
这是我为此目的使用的实际代码:
public void OnValueChangeRefreshCards (Vector2 valueChange)
{
elapsedYDist += valueChange.y;
if (elapsedYDist > 3f) {
elapsedYDist = 0f;
for (int i = 0; i < GameConstants.TOTAL_ROSE_COUNT; i++) {
Card card = roseList [i].GetComponent<Card> ();
if (RendererExtensions.IsVisibleFrom (card.MyRectTransform, Camera.main))
card.roseImage.enabled = true;
else
card.roseImage.enabled = false;
}
}
}
但现在我开始出现过多的帧率丢失相关问题,所以即使滚动页面对我来说也变得非常困难。 请查看随附的视频,了解有关我所面临问题的更多信息。 NameThatRose - Low Frame Rate
请给我一些下一步改进的建议。
编辑:这是我的分析器输出。
最佳答案
您可以尝试一些方法来找出导致低帧率的原因。
- 使用profiler深入剖析以找出哪个 UI 调用花费了更多时间。就像我所做的一样here .
由于 Image 继承自
UIMaskableGraphics
,它会在列表中的每个图像的每一帧调用MaskableGraphics.OnEnable()
。这会占用您在这里看到的时间:
我相信您的
OnValueChanged
方法在每一帧都会被调用,这只会增加启用/禁用迭代及其处理时间。您可以将调用限制在某个时间,例如每秒处理 4 次。float timeSinceLastUpdate = 0; void Update() { timeSinceLastUpdate += Time.deltaTime; } public void OnValueChangeRefreshCards (Vector2 valueChange) { if(timeSinceLastUpdate < 0.25f) { return; } timeSinceLastUpdate = 0; // do your stuff here... }
您有 250 多张图像要处理每一帧,这对于旧版 Android 设备来说是个大问题,同样,
MaskableGraphics.OnEnable()
调用可能是罪魁祸首。如果需要,您可以避免更改状态:if (RendererExtensions.IsVisibleFrom (card.MyRectTransform, Camera.main)) { if(!card.roseImage.enalbed) card.roseImage.enabled = true; } else { if(card.roseImage.enalbed) card.roseImage.enabled = false; }
此外,以下是一些有助于在 Unity 中优化 UI 的链接:
更新:
以下博客提供了有关 UI 渲染的更多信息:
希望这有帮助:)
关于android - 提高过多 UI 图像的帧速率 - Unity UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47671113/