No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

CullingManager.cs 3.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. using System;
  2. using System.Collections.Generic;
  3. using Unity.Profiling;
  4. namespace UnityEngine.U2D.IK
  5. {
  6. /// <summary>
  7. /// Class used for checking visibility of SpriteSkins' bones.
  8. /// </summary>
  9. [ExecuteInEditMode]
  10. internal class CullingManager : MonoBehaviour
  11. {
  12. static CullingManager s_Instance;
  13. public static CullingManager instance
  14. {
  15. get
  16. {
  17. if (s_Instance == null)
  18. {
  19. var managers = FindObjectsByType<CullingManager>(FindObjectsSortMode.None);
  20. s_Instance = managers.Length > 0 ? managers[0] : CreateNewManager();
  21. s_Instance.Initialize();
  22. }
  23. return s_Instance;
  24. }
  25. }
  26. static CullingManager CreateNewManager()
  27. {
  28. var newGameObject = new GameObject("Culling Manager")
  29. {
  30. hideFlags = HideFlags.HideAndDontSave
  31. };
  32. #if !UNITY_EDITOR
  33. GameObject.DontDestroyOnLoad(newGameObject);
  34. #endif
  35. var cullingManager = newGameObject.AddComponent<CullingManager>();
  36. return cullingManager;
  37. }
  38. ProfilerMarker m_ProfilerMarker = new($"{nameof(CullingManager)}.{nameof(OnUpdate)}");
  39. Dictionary<Type, BaseCullingStrategy> m_CullingStrategies;
  40. void Initialize()
  41. {
  42. m_CullingStrategies = new Dictionary<Type, BaseCullingStrategy>();
  43. AddCullingStrategy(new AlwaysUpdateCullingStrategy());
  44. AddCullingStrategy(new SpriteSkinVisibilityCullingStrategy());
  45. }
  46. void Update()
  47. {
  48. OnUpdate();
  49. }
  50. void OnUpdate()
  51. {
  52. m_ProfilerMarker.Begin();
  53. if (m_CullingStrategies != null)
  54. {
  55. foreach (var cullingStrategy in m_CullingStrategies.Values)
  56. {
  57. if (cullingStrategy.enabled)
  58. cullingStrategy.Update();
  59. }
  60. }
  61. m_ProfilerMarker.End();
  62. }
  63. public void AddCullingStrategy(BaseCullingStrategy newCullingStrategy)
  64. {
  65. var strategyType = newCullingStrategy.GetType();
  66. if (m_CullingStrategies.ContainsKey(strategyType))
  67. return;
  68. m_CullingStrategies[newCullingStrategy.GetType()] = newCullingStrategy;
  69. }
  70. public void RemoveCullingStrategy(BaseCullingStrategy strategyToRemove)
  71. {
  72. var strategyType = strategyToRemove.GetType();
  73. if (!m_CullingStrategies.ContainsKey(strategyType))
  74. return;
  75. var cullingStrategy = m_CullingStrategies[strategyType];
  76. if (cullingStrategy == strategyToRemove)
  77. m_CullingStrategies.Remove(strategyType);
  78. }
  79. public T GetCullingStrategy<T>() where T : BaseCullingStrategy
  80. {
  81. var requestedType = typeof(T);
  82. if (!m_CullingStrategies.ContainsKey(requestedType))
  83. return null;
  84. return (T)m_CullingStrategies[requestedType];
  85. }
  86. }
  87. }