在我的单个页面中,在我刚刚在屏幕打开时遇到问题之前,我需要渲染的纹理太多了但是我能够解决这个问题:
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
请给我一些有关下一步改进的建议。
编辑:以下是我的探查器输出。
答案 0 :(得分:2)
你可以尝试一些事情来找出造成低fps的原因。
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呈现的更多信息:
希望这会有所帮助:)