제목처럼 특정 조건의 아이템 목록를 뽑아와야 해
예를 들어, 전체 아이템 중 특정 맵에서 드랍되고, 레어도가 희귀면서, 내가 보유하지 않은 아이템의 목록. 요런 느낌
찾아봤는데 저렇게 조건으로 추출하는건 list로 저장해서 findAll(조건) 이런 식으로 하거나, linq를 사용하는 방법이 있는 것 같음. 근데 나는 조건으로 추출하기도 하지만 아이템의 id로 접근하는 연산도 필요해서 list보단 딕셔너리를 쿼리해서 써야겠다 싶더라고.
그런데 linq도 전체 순회하는 거니까 아이템 수가 많아질수록 문제가 될 것 같아서 방법을 찾아보고 있는데, 아래와 같은 내용을 찾았어.
(출처 : https://programmingdev.com/unityc-list%ec%99%80-dictionary%eb%a5%bc-%ec%a0%9c%eb%8c%80%eb%a1%9c-%ec%95%8c%ea%b3%a0-%ec%93%b0%ec%9e%90/
저기서 캐싱해놓을수 있다는 이야기가 있어서 관련 키워드로 찾아봤는데 뭐 나오는게 없네.. 코드 맨 윗줄처럼 데이터를 저렇게 한 번 선언 하는걸로 캐싱이 되는게 맞음..?
그리고 혹시 내 상황에 적합한 다른 방법이 있다면 알려주면 감사합니다
아 지금보니 캐싱이란게 그냥 쿼리 결과를 변수에 저장해둔다는거구나.. 저렇게 종류별로 미리 추출해두는게 최선의 방법인가..? 보통 이런 경우 어떻게 해?
캐싱은 그냥 참조를 저장해놓는다는거임 매번 게임오브젝트를 동적으로 Find하지말고 캐싱한 리스트에서 찾는다는 의미임
님 문제랑은 별 연관이없음
애초에 딕셔너리 쓰면 상관없음 캐싱된거나 마찬가지니
근데 딕셔너리 내에서 조건부로 필터링해서 추출하는 연산을 해야하는 상황이라서..
linq가 성능이 살짝 떨어지는 대신 가독성은 더 좋은데 성능차이는 거의 미미하다고 알고있음. 반복자 반환이라 where select연계도 좋고 정렬도 되고 foreach연계도 되고 난 linq만 씀. 굳이 제일 성능좋은걸 찾는다면 아무메소드도 안쓰고 for/if/else로 필터링하는거긴 함. 실제 돌려보면 성능지연은 반복행위가 아니라 반복문 내에서 하는 행위가 더 문제가 됨. foreach로 한땀한땀 필터링하고 반복문 안에 GetComponent 한번 넣는게 컴포넌트 캐시해두고 linq돌리는것보다 부하가 훨씬 심하다는 뜻. 근데 그마저도 Instantiate, Destroy 같은거 무더기로 호출하는거 아닌이상 거의 똑같다고 봐도 됨.
오우 고수의 아우라가 느껴지네.. 답변 고마워! 공부가 많이 되었어