텍스처 변경으로 인해 깨지는 배치의 수를 줄이고 성능을 향상시키려면, 아틀라스를 사용하여 동시에 사용되는 텍스처를 그룹화하십시오. 다음 방법을 통해 이를 수행할 수 있습니다.
동적 아틀라스를 사용하여 텍스처를 그룹화할 때, 드로우 콜 수를 제한하려면 텍스처가 동적 아틀라스에 들어가야 합니다. 확인하려면 프레임 디버거를 사용합니다. 프레임 디버거를 사용하면 텍스처 변경을 관찰하고 배치 파괴를 추론할 수 있습니다.
다음 예시에서는 동적 아틀라스가 런타임 UI의 모든 텍스처를 포함하는지 확인합니다.
동적 아틀라스 텍스처는 지정된 최소 크기에서 시작하여 필요에 따라 지정된 최대 크기까지 세로 또는 가로를 두 배 늘립니다. Panel Settings 에셋에서 최소 및 최대 아틀라스 크기를 정의할 수 있습니다. 동적 아틀라스의 필터를 사용하여 하위 텍스처를 아틀라스에 추가할지 결정할 수도 있습니다.
필터를 활성화하거나 비활성화하려면 Panel Settings 에셋의 인스펙터 창에서 Dynamic Atlas Settings > Active Filters 드롭다운 목록의 옵션을 선택합니다.
커스텀 필터를 PanelSettings.dynamicAtlasSettings.customFilter에 할당하여 전역 또는 텍스처별로 제약을 추가하거나 완화할 수 있습니다.
다음 커스텀 필터 예시는 다른 텍스처에 대해서는 Size 필터를 활성 상태로 유지하면서 Size 필터에서 큰 텍스처를 바이패스합니다.
using UnityEngine;
using UnityEngine.UIElements;
class MyCustomFilter : MonoBehaviour
{
public PanelSettings panelSettings;
public Texture2D largeTexture;
void OnEnable() { panelSettings.dynamicAtlasSettings.customFilter = Filter; }
void OnDisable() { panelSettings.dynamicAtlasSettings.customFilter = null; }
bool Filter(Texture2D texture, ref DynamicAtlasFilters filtersToApply)
{
if (texture == largeTexture)
{
// Disable the Size check for this one.
filtersToApply &= ~DynamicAtlasFilters.Size;
}
return true;
}
}
새 요소가 UI에 나타나면 해당 텍스처는 아틀라스가 Dynamic Atlas Settings에 지정된 Max Atlas Size에 도달하거나 이를 초과할 때까지 동적 아틀라스에 추가됩니다.
메모리가 제한된 기기에서는 기본값보다 낮은 Max Atlas Size(예: 4096픽셀 대신 2048픽셀)를 설정해야 할 수 있습니다.
텍스처가 아틀라스에 추가되거나 아틀라스에서 제거되면 단편화가 발생할 수 있습니다. 이 경우 이전 텍스처가 있던 작은 공간이 생성되며, 이 공간은 다른 텍스처에 다시 할당하기에 너무 작습니다.
아틀라스 사용량을 극대화하고 단편화를 방지하려면 VisualElement의 panel 프로퍼티에 액세스해야 하는 RuntimePanelUtils.ResetDynamicAtlas() 확장 메서드를 호출하여 콘텐츠를 수동으로 재설정해야 합니다.
애플리케이션의 동작에 따라 동적 아틀라스를 재설정하는 것이 좋습니다(예: 시각적 요소를 많이 제거하거나 추가하는 경우).
다음 예시에서는 RuntimePanelUtils.ResetDynamicAtlas() 확장 메서드를 사용하는 방법을 보여 줍니다.
using UnityEngine;
using UnityEngine.UIElements;
[RequireComponent(typeof(UIDocument))]
class DynamicAtlasResetExample : MonoBehaviour
{
VisualElement rootVisualElement => GetComponent<UIDocument>().rootVisualElement;
public void OnEnable()
{
rootVisualElement.Add(new Button(ResetAtlas) { text = "Reset Dynamic Atlas"});
}
private void ResetAtlas()
{
rootVisualElement.panel.ResetDynamicAtlas();
}
}