"Unity"Incremental GC를 시도했습니다.

5581 단어 Unity

역사


2018.3.0 이전


GC는 쓰레기 수집의 줄임말로 더 이상 필요하지 않은 메모리 영역을 확보하는 기능이다.
예전의 유니티가 GC에 있을 때 상당히 큰 스매시가 발생했는데 이것이 문제가 되었다.
예를 들어 프레임 단위의 조작 정밀도를 요구하는 액션 게임 등에서는 스매시가 절대 허용되지 않는다.
따라서 메모리를 최대한 사용하지 않기 위해서는 조심스럽게 프로그래밍할 필요가 있다.
예를 들면
  • 람다 공식을 사용하지 않음
  • LINQ를 사용하지 않음
  • new(수영장 사용)를 철저히 피한다
  • 메모리를 확보하는 표준 API를 호출하지 않음(Input.GetTouches 대신 Input.touches 사용)
  • 문자열 병합 안 함
  • foreach를 사용하지 않음(Unity5.5 이전 오류로 메모리 더미 확보)
  • 잠깐만...

    2018.3.0


    GarbageCollector API가 2018.3.0에 나타납니다.GarbageCollector.GCMode = GarbageCollector.Mode.Disabled;문서 레지스트리에 항목을 추가합니다.
    그럼에도 불구하고 GC를 정지하는 동안 메모리 사용량은 당연히 감소하지 않을 것이다
    시스템 메모리가 부족하면 응용 프로그램을 강제로 종료할 수 있습니다.
    그래서 사용할 수 있는 장면은 한계가 있다.

    Incremental GC


    개요


    2019.1.0에서는 Incremental GC를 시험적으로 도입했습니다.
    기존 GC는 프레임 내에서 처리됨
    Incremental GC에서 처리는 여러 프레임 내에서 조금씩 진행됩니다.
    그래서 큰 스매시가 일어나지 않는다.
    이 옵션을 사용하려면 Player 설정에서 Incremental GC 사용을 선택합니다.

    실험


    당장 행동 확인해 볼게요.또한 편집기에서 움직이지 않기 때문에 구축해 보세요.
    UnityEngine.Scripting.GarbageCollector에 API가 추가되었습니다.
    API
    컨텐트
    isIncremental
    Incremental GC 활성화 여부
    incrementalTimeSliceNanoseconds
    프레임당 GC로 나눈 시간(나초)
    CollectIncremental
    Incremental GC 수동 실행
    이번에 이런 느낌의 대본을 준비했어요.
    using System.Linq;
    using UnityEngine;
    using UnityEngine.Scripting;
    using UnityEngine.UI;
    
    public class Test : MonoBehaviour
    {
        [SerializeField] private Text _text;
        [SerializeField] private Slider _slider;
    
        void Start()
        {
            void UpdateText() => _text.text = string.Format(
                "Enabled = {0}\nTime = {1}[ms]",
                GarbageCollector.isIncremental,
                GarbageCollector.incrementalTimeSliceNanoseconds / 1000 / 1000
            );
    
            // スライダーでミリ秒を設定する
            _slider.onValueChanged.AddListener(value =>
            {
                GarbageCollector.incrementalTimeSliceNanoseconds = (ulong)value * 1000 * 1000;
                UpdateText();
            });
            UpdateText();
        }
    
        void Update()
        {
            // 適当にヒープメモリを確保する
            new int[100000].Select(i => i.ToString()).ToArray();
        }
    }
    
    
    우선 Incremental GC=OFF 상태에서 시도합니다.

    닫았어요.하면, 만약, 만약...

    매 프레임 GC 달리기!
    왜!?
    끝내다
    저작
    ━━━━━
    ⓊⓃⒾⓉⓎ

    좋은 웹페이지 즐겨찾기