"Unity"Incremental GC를 시도했습니다.
5581 단어 Unity
역사
2018.3.0 이전
GC는 쓰레기 수집의 줄임말로 더 이상 필요하지 않은 메모리 영역을 확보하는 기능이다.
예전의 유니티가 GC에 있을 때 상당히 큰 스매시가 발생했는데 이것이 문제가 되었다.
예를 들어 프레임 단위의 조작 정밀도를 요구하는 액션 게임 등에서는 스매시가 절대 허용되지 않는다.
따라서 메모리를 최대한 사용하지 않기 위해서는 조심스럽게 프로그래밍할 필요가 있다.
예를 들면
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 달리기!
왜!?
끝내다
저작
━━━━━
ⓊⓃⒾⓉⓎ
Reference
이 문제에 관하여("Unity"Incremental GC를 시도했습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/p_a_sta/items/0a52b230d402a5ac2434텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)