У меня есть галерея объектов в 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:
Предварительная загрузка изображений существенно исправила ситуацию:
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();
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Допустим, есть некоторая иерархия классов, где каждый последующий класс наследуется от предыдущего