async메서드를 위한 AsyncEventManager
·
코드 및 공부/최적화
유니티 버전 - 2022.3.59f1 목차기존 코드AsyncEventManager 기존 코드기존 EvnetManager에 등록된 OnExtendUI는 ShowPopup을 .Forget()하고 최하단에서 비활성화되어있는 슬롯 백그라운드만 활성화 시켜주었기에, 처음 팝업 로드시에 팝업을 불러오는 지연시간이 발생하고, 백그라운드 활성화 후 팝업이 살짝 늦게 로드되어 빈 화면이 보이는 경우가 발생, 팝업 로드를 await한 후 백그라운드를 활성화 하도록 할 예정입니다private void OnExtendUI(object args){ if (!IsUIOpened) { ShowPopup().Forget(); OnExtendUI(IsUIOpened)..
Int값을 .ToString() 후 캐싱하여 사용하기
·
코드 및 공부/최적화
유니티 버전 - 2022.3.59f1     목차.ToString()의 메모리 사용량.ToString()을 캐싱하여 사용하기     .ToString()의 메모리 사용량int형의 .ToString()은 내부에서 정수 값을 문자열로 변환하면서 새 문자열 인스턴스를 생성합니다, 이때 문자수에 따라 20~40 바이트 정도의 메모리 할당이 일어납니다, 단일 호출에서는 미미하지만 빈번하게 사용되어야한다면 캐싱하여 사용하는 것도 좋은 방법입니다     .ToString()을 캐싱하여 사용하기아래 코드를 통해 int 값에 대하여 확장 메서드로 이용할 수 있습니다, 해당 int 값을 문자열로 변환한 결과를 캐싱된 값으로 얻을 수 있습니다, 하지만 캐싱된 값은 프로그램이 실행되는동안 회수되지 않으므로, 적절하게 관리해주..
딕셔너리의 GetValueOrDefault()
·
코드 및 공부/최적화
유니티 버전 - 2022.3.59f1     GetValueOrDefault()기존의 메서드에서는 키 값을 이용하여 데이터를 찾고, 존재 여부에 따라 반환하는 값을 다르게 해주었습니다public T GetByID(int id){ if (lookupDictionary.TryGetValue(id, out var entry)) { return entry; } return null;}   개선된 코드에서는 GetValueOrDefault() 메서드를 사용하여, 주어진 키(itemCode)가 등록되어 있으면 그에 매핑된 값을 반환하고, 등록되어 있지 않으면 기본값을 반환합니다 여기서 _itemSoDictionary가 형태이므로, 키가 없을 경우 기본값인 null이 반환됩니다.public Item..
ReferenceEquals()를 이용한 null 비교 수행
·
코드 및 공부/최적화
유니티 버전 - 2022.3.59f1     목차기존 Object != nullReferenceEquals()를 이용한 null 비교어떤상황에서 사용해야할까     기존 Object != null오디오 클립을 딕셔너리에서 찾고 클립이 존재한다면 가져와서 실행시키는 로직입니다null 비교는 단순이 참조가 null인지 여부를 확인하는 것뿐만 아니라, 해당 객체의 네이티브 상태까지 검사합니다, 네이티브 상태를 검사한다는 것은 오브젝트가 내부적으로 연결되어있는 c++기반의 실제 리소스가 아직 유효한지도 함께 검사한다는 것을 의미합니다, 그래서 더 많은 성능을 요구합니다     ReferenceEquals()를 이용한 null 비교object.ReferenceEquals(clip, null)은 .NET의 기본 메..
CommandSceheduler를 이용한 메서드 순차 실행
·
코드 및 공부/최적화
유니티 버전 - 2022.3.59f1     목차기존 코드의 문제점전체적인 구조IMethodCommand와 CommandCommandPriorityComparerCommandQueueCommandScheduler메서드 등록실행 결과와 주의점     기존 코드의 문제점기존 코드입니다, 게임에서 하루가 지나고나서 실행되어야할 메서드들이 MorningRoutine이라는 메서드 아래 묶여있습니다, 코드간 결합도가 높고 확장성이 부족할뿐만 아니라 테스트, 가독성등 여러가지 측면에서 문제가 있습니다, MorningRoutine에서 해주어야하는 동작들이기는하지만, 좋지 못한 구조라고 볼 수 있겠습니다      CommandSceheduler의 전체적인 구조1. CommandSceheduler 에서는 개별 Queue에..
그래픽 옵션(Quality) 변경하기
·
코드 및 공부/최적화
유니티 버전 - 6000.0.34f1     목차QualitySettings.SetQualityLevelQualitySettings.XXXApplication.targetFrameRate      QualitySettings.SetQualityLevel드롭다운을 이용하여 미리 설정된 Quality Levels를 변경하여 주는 방법입니다 드롭다운을 만들어줍니다   Options를 설정하여 줍니다 (Project Settings -> Quality -> Levels에 존재하는 옵션만큼)   코드를 작성하여 줍니다using UnityEngine;public class TitleOption : PopupUI{ public void SetGraphicsQuality(int qualityIndex) { ..
Profiler와 Stopwatch를 이용한 코드 비교 및 최적화
·
코드 및 공부/최적화
유니티 버전 - 2022.3.17f1     기존 코드와 개선된 코드기존 씬 전환시 CinemachineConfiner를 교체해주는 로직을 최적화하기 위해 Profiler와 Stopwatch를 이용하였습니다더보기2024.12.23 - [코드 및 공부/씬] - 씬 전환시 해당씬의 CinemachineConfiner로 교체하기 씬 전환시 해당씬의 CinemachineConfiner로 교체하기유니티 버전 - 2022.3.17f1     목차들어가며현 프로젝트 세팅코드     들어가며해당 코드를 이용하여 할 수 있는것은 씬이 전환 될때 전환된 씬의 Polygon Collider 2D를 가져와서 Cinemachine의 Cinemacekrxjvpvj0110.tistory.com   초기에는 해당 코드를 사용했습니다..
스프라이트 아틀라스(Sprite Atlas)
·
코드 및 공부/최적화
유니티 버전 - 2022.3.17f1     목차프로젝트 세팅개별 옵션스프라이트 참조     프로젝트 세팅Edit -> Project Settings -> Editor -> Sprite Packer -> Mode 에서 빨간 네모 박스가 쳐진 항목을 선택하여 줍니다  그런다음 Project에서 아틀라스를 만들어 줍니다     개별 옵션Allow Rotation : Sprite Atlas를 패킹할때 스프라이트가 회전할 수 있는지 여부 (공간을 효과적으로 사용하나 예기치 못한 이미지 출력 가능성 존재) Tight Packing : 스프라이트의 아웃라인에 따라 패킹하는 것 (공간을 효과적으로 사용하지만 경계가 흐린 이미지는 이미지간 침범 가능성 존재)      스프라이트 참조아틀라스로 묶은 스프라이트들을 드래그..
카메라 최적화
·
코드 및 공부/최적화
유니티 버전 - 2022.3.17f1     Multi Camera 지양각각의 카메라가 렌더링을 수행할 때 culling 작업과 Layer Filtering을 수행하기 때문에 성능 이슈 발생 가능성이 높음대신 시네머신 사용 권장     Occlusion Culling 과 LODOcclustino Culling을 이용 할 수 있는 상황에서는 사용하기, Occlustino Culling이란 카메라에서 가려지는 것들은 렌더링 하지 않는 것, 아웃도어 상황에서는 오히려 연산 비용 증가 LOD - 어느 정도 멀리 떨어진 오브젝트는 렌더링 하지 않아서 성능적 이득을 보는 것     Skybox  하늘을 안봐도되는 탑다운 게임은 Skybox가 필요하지 않기에 삭제     참고자료 (유니티 공식 유튜브)더보기https..
오디오 에셋 최적화
·
코드 및 공부/최적화
유니티 버전 - 2022.3.17f1     목차Load TypeCompresstion Format     Load Type 옵션Decompress on loadCompressed into memoryStreaming 파일 크기256kb > 1MB사용 시기재생속도(반응속도) 가 빨라야 하는 오디오(총 소리, 피드백에 사용되는 오디오 등)양 옆의 경우를 제외한 대부분의 경우배경 음악메모리압축을 풀어서 메모리에 올림압축 상태의 오디오를 메모리에 올림오디오를 디스크에서 직접 스트리밍하여 필요한 부분만 로드       Compresstion Format매우 짧은 클립은 ADPCM 사용대부분의 경우 Vorbis 사용