Как сделать быструю галерею в OnGUI() Unity?

203
16 сентября 2021, 18:00

У меня есть галерея объектов в Unity, :

Она начинает тормозить очень сильно когда там 1160 объектов. Как мне улучшить свой код ? Да и как выполнять один раз то что в void OnGUI(), сейчас если я ставлю условия (if(!_m_Pos.Equals(temp_m_Pos))) такое :

...
    protected Vector2 _m_Pos;
    protected Vector2 temp_m_Pos;
...
    void OnGUI()
    {
        DrawLayouts();
        DrawHeader();
        DrawLeft();
        DrawRight();
        DrawFooter();
    }
...
    void DrawLeft() {
        GUILayout.BeginArea(LeftSection);
        GUILayout.BeginVertical();
        if( myList != null && myList.Count > 1 && myList[1] != null ) {
            if(treeBool==false) {
                _m_Pos = GUILayout.BeginScrollView(_m_Pos, false, true,GUILayout.Width(LeftSection.width), GUILayout.Height(LeftSection.height-20));
                int count = 0; 
                if(!_m_Pos.Equals(temp_m_Pos)) {
                   ...
                   temp_m_Pos=_m_Pos;
                }
                GUILayout.EndScrollView();
            } else {
                m_SimpleTreeView.OnGUI(new Rect(0, 0, LeftSection.width, LeftSection.height-20));
            }
        } else {
            GUILayout.Label("Объекты не определены, определите объекты.");
        }
        treeBool = GUI.Toggle (new Rect (0, LeftSection.height-20, 100, 20), treeBool, "Дерево");
        GUILayout.EndVertical();
        GUILayout.EndArea();
    }

Перестают отрисовываться объекты. Сам код галереи :

void DrawLeft() {
    GUILayout.BeginArea(LeftSection);
    GUILayout.BeginVertical();
    if( myList != null && myList.Count > 1 && myList[1] != null ) {
        if(treeBool==false) {
            _m_Pos = GUILayout.BeginScrollView(_m_Pos, false, true,GUILayout.Width(LeftSection.width), GUILayout.Height(LeftSection.height-20));
            int count = 0; 
            if(_m_Pos.Equals(temp_m_Pos)) {
                for(int l=0;l<myList.Count;l++) {
                    Texture2D myOtherTex = LoadTexture(myList[l].url_texture);
                    Texture tex = myOtherTex as Texture;
                    double countColumn = Math.Floor((double)LeftSection.width/tex.width);
                    if(l % (int)countColumn == 0) {
                        count = 0;
                        if(count==0)
                            GUILayout.BeginHorizontal();
                        if (GUILayout.Button(tex)) {
                            // SelectKeyString = myList[l].key;
                            // Debug.Log(myList[l].key);
                            SelectObject(l);
                        }
                    } else {
                        if (GUILayout.Button(tex)) {
                            // SelectKeyString = myList[l].key;
                            // Debug.Log(myList[l].key);
                            SelectObject(l);
                        }
                        count++;
                        if(count==(int)countColumn-1||l==myList.Count-1)
                            GUILayout.EndHorizontal();
                    }
                }
                temp_m_Pos=_m_Pos;
            }
            GUILayout.EndScrollView();
        } else {
            m_SimpleTreeView.OnGUI(new Rect(0, 0, LeftSection.width, LeftSection.height-20));
        }
    } else {
        GUILayout.Label("Объекты не определены, определите объекты.");
    }
    treeBool = GUI.Toggle (new Rect (0, LeftSection.height-20, 100, 20), treeBool, "Дерево");
    GUILayout.EndVertical();
    GUILayout.EndArea();
}

Вообще можно заставить работать быстрее то что постоянно отрисовывается в void OnGUI() ?

Profiler:

Answer 1

Предварительная загрузка изображений существенно исправила ситуацию:

    Texture2D myOtherTex = LoadTexture(myList[l].url_texture);
    Texture tex = myOtherTex as Texture;

перенёс в void OnEnable() Код теперь выглядит так :

        void OnEnable()
        {
            InitTextures();
            // GamObjTextFieldPrefabObjURL = new GameObject();
            InitOnGUI();
            ODBtemp = new ObjectDataBase();
            myList = ODBtemp.SelectAllObjMap();
            if (m_TreeViewState == null)
                m_TreeViewState = new TreeViewState ();
            m_SimpleTreeView = new SimpleTreeView(m_TreeViewState);
            TextureObj = new List<Texture>();
            for(int l=0;l<myList.Count;l++) {
                Texture2D myOtherTex = LoadTexture(myList[l].url_texture);
                Texture tex = myOtherTex as Texture;
                TextureObj.Add(tex);
                // List <GUILayout.Button> tempButton;
            }
        }
    ...
        void DrawLeft() {
            GUILayout.BeginArea(LeftSection);
            EditorGUILayout.BeginVertical();
            if( myList != null && myList.Count > 1 && myList[1] != null ) {
                if(treeBool==false) {
                    Profiler.BeginSample("MyPieceOfCode");
                    _m_Pos = EditorGUILayout.BeginScrollView(_m_Pos, false, true,GUILayout.Width(LeftSection.width), GUILayout.Height(LeftSection.height-20));
                    int count = 0;
                    for(int l=0;l<myList.Count;l++) {
                        // Texture2D myOtherTex = LoadTexture(myList[l].url_texture);
                        // Texture tex = myOtherTex as Texture;
                        double countColumn = Math.Floor((double)LeftSection.width/TextureObj[l].width);
                        if(l % (int)countColumn == 0) {
                            count = 0;
                            if(count==0)
                                EditorGUILayout.BeginHorizontal();
                            if (GUILayout.Button(TextureObj[l])) {
                                SelectObject(l);
                            }
                        } else {
                            if (GUILayout.Button(TextureObj[l])) {
                                SelectObject(l);
                            }
                            count++;
                            if(count==(int)countColumn-1||l==myList.Count-1)
                                EditorGUILayout.EndHorizontal();
                        }
                    }
                    temp_m_Pos=_m_Pos;
                    EditorGUILayout.EndScrollView();
                    Profiler.EndSample();
                } else {
                    m_SimpleTreeView.OnGUI(new Rect(0, 0, LeftSection.width, LeftSection.height-20));
                }
            } else {
                GUILayout.Label("Объекты не определены, определите объекты.");
            }
            treeBool = GUI.Toggle (new Rect (0, LeftSection.height-20, 100, 20), treeBool, "Дерево");
            EditorGUILayout.EndVertical();
            GUILayout.EndArea();
        }
...
    void OnGUI()
    {
        DrawLayouts();
        DrawHeader();
        DrawLeft();
        DrawRight();
        DrawFooter();
    }
READ ALSO
Serialize JSON ListView

Serialize JSON ListView

Подскажите, как исправить ошибку, всё никак не получается

261
Целесообразность фабричного метода

Целесообразность фабричного метода

Допустим, есть некоторая иерархия классов, где каждый последующий класс наследуется от предыдущего

251