띄워둔게 스크롤뷰 하나에 목록이래봐야 20개인데 전부 활성화 시켜두면 프레임 절반으로 떨어지네.
특히 걍 띄워둘 때는 그나마 괜찮은데 드래그 하는 순간 10프레임까지 내려감...
스크롤뷰가 원래 이렇게 무겁나?
여러곳에서 써야하는데 벌써 이러니까 겁나네
얘가 스크롤뷰에서 쓰는 코드임.
_infos가 스크롤뷰 개별 오브젝트.
private GameManager _GameManager;
private UserData _UserData;
private Calculate _Calculate;
public Lobby _Lobby;
public HotButton _HotButton;
public GameObject[] _infos { get; private set; }
public Text _rateText;
public Transform _groups;
private Image[] _icons;
private Text[] _levels;
private Text[] _moneyTexts;
private Image[] _buttonSprites;
private Text[] _costTexts;
private Image[] _costIcons;
private Text[] _costValues;
private Image[] _sliders;
private void Awake()
{
GameObject obj = GameObject.FindWithTag("GameManager");
_GameManager = obj.GetComponent<GameManager>();
_UserData = _GameManager.GetComponent<UserData>();
_Calculate = _GameManager.GetComponent<Calculate>();
DefaultArray();
}
private void DefaultArray()
{
_infos = new GameObject[GameDef.ArrayGroup[0]];
_icons = new Image[GameDef.ArrayGroup[0]];
_levels = new Text[GameDef.ArrayGroup[0]];
_moneyTexts = new Text[GameDef.ArrayGroup[0]];
_buttonSprites = new Image[GameDef.ArrayGroup[0]];
_costTexts = new Text[GameDef.ArrayGroup[0]];
_costIcons = new Image[GameDef.ArrayGroup[0]];
_costValues = new Text[GameDef.ArrayGroup[0]];
_sliders = new Image[GameDef.ArrayGroup[0]];
}
public void DefaultSetting()
{
for(int i = 0; i < GameDef.ArrayGroup[0]; i++)
{
_infos[i] = _groups.transform.GetChild(i).gameObject;
_icons[i] = _infos[i].transform.GetChild(0).GetChild(0).GetComponent<Image>();
_levels[i] = _infos[i].transform.GetChild(0).GetChild(1).GetComponent<Text>();
_moneyTexts[i] = _infos[i].transform.GetChild(1).GetChild(2).GetComponent<Text>();
_buttonSprites[i] = _infos[i].transform.GetChild(2).GetComponent<Image>();
_costTexts[i] = _infos[i].transform.GetChild(2).GetChild(0).GetComponent<Text>();
_costIcons[i] = _infos[i].transform.GetChild(2).GetChild(1).GetComponent<Image>();
_costValues[i] = _infos[i].transform.GetChild(2).GetChild(2).GetComponent<Text>();
_sliders[i] = _infos[i].transform.GetChild(3).GetChild(1).GetComponent<Image>();
Text mainText = _infos[i].transform.GetChild(1).GetChild(0).GetComponent<Text>();
Text subText = _infos[i].transform.GetChild(1).GetChild(1).GetComponent<Text>();
mainText.text = LeanLocalization.GetTranslationText("atitle_" + i.ToString("D4"));
subText.text = LeanLocalization.GetTranslationText("asub_" + i.ToString("D4"));
Button button = _infos[i].transform.GetChild(2).GetComponent<Button>();
int a = i;
button.onClick.AddListener(() => OnClickButton(a));
DataUpdate(i);
if (i == 0)
_infos[i].SetActive(true);
else if (_UserData._UserALevel[i - 1] > 0)
_infos[i].SetActive(true);
else
_infos[i].SetActive(false);
}
AllDataUpdate();
RateText();
}
public void DataUpdate(int num)
{
_levels[num].text = "Lv. " + "<Color=FFFFFF>" + _UserData._UserALevel[num] + "</Color>";
Units unit = Utilities.ConvertUnit(_GameManager._Money[num]);
if (num == 0)
_moneyTexts[num].text = Utilities.TextCombine(unit.Value, unit.Unit) + "/Click";
else
_moneyTexts[num].text = Utilities.TextCombine(unit.Value, unit.Unit) + "/s";
if(_UserData._UserALevel[num] > 4)
_sliders[num].fillAmount = (_UserData._UserALevel[num] - GameDef.GradeRate[_Calculate.GroupGrade(num) - 1]) / (float)(GameDef.GradeRate[_Calculate.GroupGrade(num)] - GameDef.GradeRate[_Calculate.GroupGrade(num) - 1]);
else if(num == 0)
_sliders[num].fillAmount = (_UserData._UserALevel[num] - 1) / (float)(GameDef.GradeRate[_Calculate.GroupGrade(num)] - 1);
else
_sliders[num].fillAmount = _UserData._UserALevel[num] / (float)GameDef.GradeRate[_Calculate.GroupGrade(num)];
}
public void AllDataUpdate()
{
for(int i = 0; i < GameDef.ArrayGroup[0]; i++)
{
Units unit = Utilities.ConvertUnit(_GameManager._Cost[i]);
_costTexts[i].text = LeanLocalization.GetTranslationText("lobby_0012") + " x" + _GameManager._RateALevel[i].ToString();
_costValues[i].text = Utilities.TextCombine(Utilities.FloorNumber(unit.Value), unit.Unit);
if (_UserData._UserMoney >= _GameManager._Cost[i])
{
_buttonSprites[i].sprite = Resources.Load<Sprite>("Sprites/UIs/Lobby_UI_0005");
_costTexts[i].color = new Color32(245, 245, 245, 255);
_costIcons[i].color = new Color32(255, 255, 255, 255);
_costValues[i].color = new Color32(245, 245, 245, 255);
}
else
{
_buttonSprites[i].sprite = Resources.Load<Sprite>("Sprites/UIs/Lobby_UI_0006");
_costTexts[i].color = new Color32(180, 180, 180, 255);
_costIcons[i].color = new Color32(180, 180, 180, 255);
_costValues[i].color = new Color32(180, 180, 180, 255);
}
}
}
public void OnClickButton(int num)
{
if (_UserData._UserMoney >= _GameManager._Cost[num])
{
_UserData.GroupALevelUp(num);
_GameManager.GroupLevelUpCheck(num);
DataUpdate(num);
InfoActive(num);
_HotButton.ChangeButton();
}
}
public void InfoActive(int num)
{
if (num < GameDef.ArrayGroup[0] - 1)
{
if (_UserData._UserALevel[num] > 0 && _infos[num + 1].activeSelf == false)
_infos[num + 1].SetActive(true);
}
}
public void RateButton()
{
_UserData.ChangeRate();
RateText();
for(int i = 0; i < GameDef.ArrayGroup[0]; i++)
{
_Calculate.CostCalculate(i);
Units unit = Utilities.ConvertUnit(_GameManager._Cost[i]);
_costValues[i].text = Utilities.TextCombine(Utilities.FloorNumber(unit.Value), unit.Unit);
}
AllDataUpdate();
}
public void RateText()
{
switch (_UserData._CostRate)
{
case 0:
_rateText.text = "x1";
break;
case 1:
_rateText.text = "x10";
break;
case 2:
_rateText.text = "x100";
break;
case 3:
_rateText.text = "xNext";
break;
case 4:
_rateText.text = "xMax";
break;
default:
Debug.Log("type값 오류");
break;
}
}
코드로 올라가질 않으니까 영 그렇네.
혹시 짐작가는거 있으면 얘기 해주면 고맙게 배우겠음.
니 코드가 이상한거임
ㅅㅂ 또 뭘 잘못한거지
매 프레임마다 Getcomponent를 한다거나 그런거 아님?
최초에 다 파싱해서 쓰긴 하는데 _icon.transform.localposition 이딴거 0.05초마다 호출해서 그런가 이것도 파싱해서 쓰는게 맞음?
_icon은 image로 파싱해둔놈
파싱이 아니라 캐싱 아닌가? 아무튼 transform을 캐싱하면 이론상 성능은 더 좋아지지만 오브젝트 갯수와 호출빈도를 들으니 그런 문제는 아닌것 같은데
아 캐싱 데이터테이블 조지고 있다보니 헷갈리네 일단 픽셀퍼펙트 이슈 있대서 꺼봤고 text도 textmeshpro로 교체 중 근데 스크롤뷰에서 오브젝트 하나씩 켜질때마다 batches 몇 개씩 늘어나는거 보니까 뭔가 잘못한게 있는 모양인거 같음 오브젝트는 프리팹 넣어다 쓰는거고 UI 스프라이트도 다 스프라이트 아틀라스에 박혀있는데 뭐가 문제지...
코드 올려봐
올렸어. 저거 아니고 딴 문제일수도 있으니까 일단 이것저것 해보는 중
제에발 프로파일러를 씁시다
프로파일러는 가이드 봐도 어떻게 보는지를 모르겠더라... 블로그에서 배워볼라고 해도 설명보다는 얼마나 멋지게 고쳤는지 적어둔게 대부분이라 이해도 안되고
https://gall.dcinside.com/mgallery/board/view/?id=game_dev&no=92656&page=1
보기
너무 힘들다
글자수 제한 걸림... 잠만 걍 스샷으로 찍어와봄.
스샷 안해도 됨 스샷도 알아보기 힘든건 마찬가지일거같음 밑에 대답이나 해줘
미안... 링크해준걸로 올릴라니까 글자수 제한 걸린다... 디씨에서는 코드얘기하기가 어렵네
글고 저 코드에서 어떤 함수가 언제 불려지는지 저것만으로는 알수가 없는데 public 함수중에 매 프레임 불리우는 함수가 있음?
AllDataUpdate 함수가 1초마다 호출됨. 이거 외에는 버튼 누르면 호출되거나 하는 정도임.
update함수는 거의 안 쓰기 때문에 게임매니저에서 1초마다 호출하는 코루틴 있고 로비에서 0.05초에 호출하는 코루틴 이렇게 두개 있음 그 중에 1초마다 호출하는데서 AllDataUpdate 호출해서 씀
_buttonSprites[i].sprite = Resources.Load("Sprites/UIs/Lobby_UI_0006"); 이거 아님?
리소스를 매초마다 몇십개를 로딩하는건데 프로파일러 봐야 알겠지만 여기서 부하걸리고 있을걸.
아.. 드래그 하는 순간이라고 써있네. 드래그 할때 불리는 함수는 뭐임
아 저것도 최초에 파싱해서 쓰면 될라나 쟤 때문인지는 모르겠지만 성능 개선은 되겠다. 고마워 일단 저거 처리해볼게
드래그 할 때 문제 발생한다고 했으니까, Debug.Log 같은걸로 드래그 할 때 가장 많이 불리는 함수 특정해라., 그리고 그게 문제인지 하나하나 보면 됨.
드래그? 드래그가 어느거 말하는거야?
아 리스트 드래그
리스트 드래그할때는 아무것도 안 불러 그냥 ugui에서 기본 제공하는 스크롤뷰 사용하고 있거든 리스트 드래그 하는 순간에는 정말 코루틴 두개만 돌고 있다고 보면 돼
이게 스크롤뷰 닫고 있을때는 프레임 드랍이 전혀 안 생기는데 스크롤뷰를 열때 프레임 드랍 크게 나고 그 다음에 스크롤할 때 또 프레임 드랍이 생기더라고 프로파일러로 확인하는게 확실히 답이긴 한데 제대로 배울만한데를 모르겠어
프로파일러를 배우던가 아니면 니가 퍼포먼스 체크를 수동으로 하던가. 여튼 니가 올린 스크립트가 문제의 원인인지 확인하려면 내가 말한대로 각각의 함수가 처리에 얼마나 시간이 걸리나 확인을 하는게 수동으로 하는 방법중에 그나마 쉬움
각각의 함수의 처음과 끝에 시간 재봐라. 뭐였지 잘 기억이 안나는데 Time.time 이었나? 그걸 함수의 시작과 끝에 넣어서 각각의 함수가 얼마나 시간 잡아먹는지 확인하라는겨
근데 유니티 타임은 프레임에 의존하니까 C# DateTime으로 해야 하나? 프로파일러로만 하다보니 다 까묵음
오... 아마 deltatime으로 될듯 그것도 한 번 해볼게 최후에는 결국 프로파일러 써야할거 같아서 그쪽도 좀 알아봐야겠다 고마워 친구