Skip to content

Commit

Permalink
Fix issue #162 : do not use ksp-cached renderers, they won't be up-to…
Browse files Browse the repository at this point in the history
…-date
  • Loading branch information
gotmachine committed Sep 13, 2023
1 parent bacedf3 commit d98a25b
Showing 1 changed file with 5 additions and 39 deletions.
44 changes: 5 additions & 39 deletions KSPCommunityFixes/Performance/DragCubeGeneration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -502,7 +502,7 @@ public static DragCube RenderDragCubeImmediate(Part part, string dragCubeName)

DragCube dragCube = new DragCube(dragCubeName);

List<Renderer> renderers = GetPartCachedRendererList(part);
List<Renderer> rendererList = rendererListPool.Get();
List<DragRendererInfo> dragRenderers = dragRendererInfoListPool.Get();
CommandBuffer commandBuffer = commandBufferPool.Get();

Expand All @@ -513,7 +513,9 @@ public static DragCube RenderDragCubeImmediate(Part part, string dragCubeName)

try
{
AnalyzeDragRenderers(part, renderers, true, dragRenderers, out Bounds partBounds);
Transform modelTransform = GetModelTransform(part);
modelTransform.GetComponentsInChildren(false, rendererList);
AnalyzeDragRenderers(part, rendererList, false, dragRenderers, out Bounds partBounds);

dragCube.center = partBounds.center;
dragCube.size = partBounds.size;
Expand All @@ -540,6 +542,7 @@ public static DragCube RenderDragCubeImmediate(Part part, string dragCubeName)
foreach (DragRendererInfo dragRendererInfo in dragRenderers)
dragRendererInfo.RestoreRendererState();

rendererListPool.Release(rendererList);
dragRendererInfoListPool.Release(dragRenderers);
commandBufferPool.Release(commandBuffer);
}
Expand Down Expand Up @@ -857,43 +860,6 @@ private static void Encapsulate(ref Vector3 min, ref Vector3 max, Vector3 partCe
max.z = maxZ;
}


/// <summary>
/// Reimplementation of the stock Part.FindModelRenderersCached() method returning the cached list instead of
/// instantiating a new list, and with improved performance when a cache update is required.
/// </summary>
public static List<Renderer> GetPartCachedRendererList(Part part)
{
if (part.modelRenderersCache == null)
{
part.modelRenderersCache = new List<Renderer>();
UpdatePartRendererCache(part);
}
else
{
for (int i = part.modelRenderersCache.Count; i-- > 0;)
{
if (part.modelRenderersCache[i].IsDestroyed())
{
part.modelRenderersCache.Clear();
UpdatePartRendererCache(part);
break;
}
}
}

return part.modelRenderersCache;
}

private static void UpdatePartRendererCache(Part part)
{
Transform modelTransform = GetModelTransform(part);
if (modelTransform.IsNullRef())
return;

modelTransform.GetComponentsInChildren(true, part.modelRenderersCache);
}

private static Transform GetModelTransform(Part part)
{
if (part.partTransform.IsNullOrDestroyed())
Expand Down

0 comments on commit d98a25b

Please sign in to comment.