在 Unity3d UI 面板中进行数据虚拟化

Having data virtualization in Unity3d UI panel

我的应用程序中有一个 UI 面板,我在运行时以编程方式在其中实例化游戏对象,我遇到的问题是我必须在该面板中创建超过 1000 个游戏对象(有时多达 6000 个)并且这需要很长时间来冻结 UI 并尝试使用协程也会导致一些延迟。
有什么方法可以在用户滚动面板时获得游戏对象列表并在 UI 面板中创建它们?
或者有人可以建议一种更好的方法来将游戏对象添加到面板而不会出现任何滞后或 UI 冻结?

更新:
我添加这个是为了明确我的目标。
我有一长串项目,我试图将它们放入列表中,每个项目都有一张图片、一些按钮和一些文本,下面是单个项目的示例:

现在我需要在面板中实例化这个复杂的示例,并且每个项目都会根据实例化后传递的 ID 自行更改。
但是我有一个面板容量问题,即使我在一次将那么多对象放在一个面板中时剪切了一些项目,在面板中滚动也会让它变得非常缓慢和痛苦
我的面板还需要一个滚动条,所以我必须让面板中的所有对象都可用

希望这些信息对您有所帮助。

好的,我刚刚编写了一个生成 1000 个文本 UI 元素的测试程序。

public class MakeLoadsOfUI : MonoBehaviour {

    public GameObject prefab;
    // Use this for initialization
    void Start () 
    {
        MakeUI();

    }

    void MakeUI()
    {
        float startTime = Time.realtimeSinceStartup;
        for (int i = 0; i < 1000; i++)
        {
            int x=i/40, y=i%40;

            GameObject obj = (GameObject)Instantiate(prefab);
            obj.transform.SetParent(transform);   // attack to the canvas
            RectTransform rt = obj.GetComponent<RectTransform>();
            rt.anchoredPosition = new Vector2((x-10)*25, (y-10)*20);
            obj.GetComponent<Text>().text = "UI:" + i;
        }
        float endTime = Time.realtimeSinceStartup;
        Debug.Log("time taken:" + (endTime - startTime));
    }
}

1000个元素耗时0.15秒,还算合理。如果您有不同的结果,请详细说明,解释您是如何做到的。

当你这样描述时,它更清晰、更简单。

看看任何移动应用程序:他们不会将 6000 人的记录放在一个页面上。它通常分页或分组,带有搜索选项。所以改为这样做。

如果您查看 Facebook 移动应用程序(一个很好的标准),如果您开始滚动查看较旧的帖子,每隔几秒它就会暂停一两秒以加载接下来的几篇帖子。与 youtube 应用程序相同。

由于这个 65535 统一限制,只需设置分页限制(比如 100-200 项)。