From e10bffde9b326d2dd007fb802d60b28e8e5c0a53 Mon Sep 17 00:00:00 2001 From: Regalis Date: Sat, 19 Dec 2015 16:02:05 +0200 Subject: [PATCH] Light rendering optimization --- Subsurface/Source/Camera.cs | 2 -- .../Source/Items/Components/Machines/Radar.cs | 11 +++++-- Subsurface/Source/Map/Levels/LevelRenderer.cs | 7 +++++ Subsurface/Source/Map/Lights/ConvexHull.cs | 29 ++++++++++++------ Subsurface/Source/Map/Lights/LightManager.cs | 16 ++++++++++ Subsurface_Solution.v12.suo | Bin 802816 -> 802816 bytes 6 files changed, 52 insertions(+), 13 deletions(-) diff --git a/Subsurface/Source/Camera.cs b/Subsurface/Source/Camera.cs index 2102d9cad..021093842 100644 --- a/Subsurface/Source/Camera.cs +++ b/Subsurface/Source/Camera.cs @@ -119,8 +119,6 @@ namespace Barotrauma get { return targetPos; } set { targetPos = value; - System.Diagnostics.Debug.WriteLine(value); - } } diff --git a/Subsurface/Source/Items/Components/Machines/Radar.cs b/Subsurface/Source/Items/Components/Machines/Radar.cs index d84544a22..78b0b2a7a 100644 --- a/Subsurface/Source/Items/Components/Machines/Radar.cs +++ b/Subsurface/Source/Items/Components/Machines/Radar.cs @@ -198,8 +198,15 @@ namespace Barotrauma.Items.Components if (pointDist > radius) continue; if (pointDist > prevPingRadius && pointDist < pingRadius) { - var blip = new RadarBlip(limb.WorldPosition, 1.0f); - radarBlips.Add(blip); + float limbSize = limb.Mass; + + for (int i = 0; i<=limb.Mass/100.0f; i++) + { + var blip = new RadarBlip(limb.WorldPosition+Rand.Vector(limb.Mass/10.0f), 1.0f); + radarBlips.Add(blip); + } + + } } } diff --git a/Subsurface/Source/Map/Levels/LevelRenderer.cs b/Subsurface/Source/Map/Levels/LevelRenderer.cs index 05ee49509..0e172816a 100644 --- a/Subsurface/Source/Map/Levels/LevelRenderer.cs +++ b/Subsurface/Source/Map/Levels/LevelRenderer.cs @@ -151,6 +151,9 @@ namespace Barotrauma { if (WallVertices == null || WallVertices.Length <= 0) return; + Stopwatch sw = new Stopwatch(); + sw.Start(); + basicEffect.World = cam.ShaderTransform * Matrix.CreateOrthographic(GameMain.GraphicsWidth, GameMain.GraphicsHeight, -1, 1) * 0.5f; @@ -194,6 +197,10 @@ namespace Barotrauma } } + + sw.Stop(); + + Debug.WriteLine("level render: "+sw.ElapsedTicks); } } diff --git a/Subsurface/Source/Map/Lights/ConvexHull.cs b/Subsurface/Source/Map/Lights/ConvexHull.cs index fe5db85c5..47777e927 100644 --- a/Subsurface/Source/Map/Lights/ConvexHull.cs +++ b/Subsurface/Source/Map/Lights/ConvexHull.cs @@ -1,6 +1,7 @@ using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; namespace Barotrauma.Lights @@ -38,6 +39,8 @@ namespace Barotrauma.Lights private VertexPositionColor[] shadowVertices; private VertexPositionTexture[] penumbraVertices; + int shadowVertexCount; + private Entity parentEntity; private Rectangle boundingBox; @@ -73,6 +76,10 @@ namespace Barotrauma.Lights cachedShadows = new Dictionary(); + shadowVertices = new VertexPositionColor[6 * 2]; + penumbraVertices = new VertexPositionTexture[6]; + + vertices = points; primitiveCount = vertices.Length; @@ -139,6 +146,8 @@ namespace Barotrauma.Lights private void CalculateShadowVertices(Vector2 lightSourcePos, bool los = true) { + shadowVertexCount = 0; + //compute facing of each edge, using N*L for (int i = 0; i < primitiveCount; i++) { @@ -172,15 +181,13 @@ namespace Barotrauma.Lights startingIndex = nextEdge; } - int shadowVertexCount; - //nr of vertices that are in the shadow if (endingIndex > startingIndex) shadowVertexCount = endingIndex - startingIndex + 1; else shadowVertexCount = primitiveCount + 1 - startingIndex + endingIndex; - shadowVertices = new VertexPositionColor[shadowVertexCount * 2]; + //shadowVertices = new VertexPositionColor[shadowVertexCount * 2]; //create a triangle strip that has the shape of the shadow int currentIndex = startingIndex; @@ -213,8 +220,6 @@ namespace Barotrauma.Lights private void CalculatePenumbraVertices(int startingIndex, int endingIndex, Vector2 lightSourcePos, bool los) { - penumbraVertices = new VertexPositionTexture[6]; - for (int n = 0; n < 4; n += 3) { Vector3 penumbraStart = new Vector3((n == 0) ? vertices[startingIndex] : vertices[endingIndex], 0.0f); @@ -309,18 +314,23 @@ namespace Barotrauma.Lights private void DrawShadows(GraphicsDevice graphicsDevice, Camera cam, Matrix transform, bool los = true) { + Vector3 offset = Vector3.Zero; if (parentEntity != null && parentEntity.Submarine != null) { offset = new Vector3(parentEntity.Submarine.DrawPosition.X, parentEntity.Submarine.DrawPosition.Y, 0.0f); } + if (shadowVertexCount>0) + { + shadowEffect.World = Matrix.CreateTranslation(offset) * transform; + shadowEffect.CurrentTechnique.Passes[0].Apply(); - shadowEffect.World = Matrix.CreateTranslation(offset) * transform; - shadowEffect.CurrentTechnique.Passes[0].Apply(); - - graphicsDevice.DrawUserPrimitives(PrimitiveType.TriangleStrip, shadowVertices, 0, shadowVertices.Length - 2); + graphicsDevice.DrawUserPrimitives(PrimitiveType.TriangleStrip, shadowVertices, 0, shadowVertexCount*2 - 2); + } + + if (los) { penumbraEffect.World = shadowEffect.World; @@ -330,6 +340,7 @@ namespace Barotrauma.Lights graphicsDevice.DrawUserPrimitives(PrimitiveType.TriangleList, penumbraVertices, 0, 2, VertexPositionTexture.VertexDeclaration); #endif } + } public void Remove() diff --git a/Subsurface/Source/Map/Lights/LightManager.cs b/Subsurface/Source/Map/Lights/LightManager.cs index f8e5d554d..5dd00f0ce 100644 --- a/Subsurface/Source/Map/Lights/LightManager.cs +++ b/Subsurface/Source/Map/Lights/LightManager.cs @@ -60,6 +60,10 @@ namespace Barotrauma.Lights public void DrawLOS(GraphicsDevice graphics, SpriteBatch spriteBatch, Camera cam, Vector2 pos) { + + Stopwatch sw = new Stopwatch(); + sw.Start(); + if (!LosEnabled) return; Rectangle camView = new Rectangle(cam.WorldView.X, cam.WorldView.Y - cam.WorldView.Height, cam.WorldView.Width, cam.WorldView.Height); @@ -75,6 +79,9 @@ namespace Barotrauma.Lights convexHull.DrawShadows(graphics, cam, pos, shadowTransform); } + sw.Stop(); + + Debug.WriteLine("drawlos: " + sw.ElapsedTicks + " (" + sw.ElapsedMilliseconds + ")"); if (!ObstructVision) return; spriteBatch.Begin(SpriteSortMode.Deferred, CustomBlendStates.Multiplicative); @@ -82,6 +89,7 @@ namespace Barotrauma.Lights spriteBatch.End(); ObstructVision = false; + } public void OnMapLoaded() @@ -94,6 +102,10 @@ namespace Barotrauma.Lights public void UpdateLightMap(GraphicsDevice graphics, SpriteBatch spriteBatch, Camera cam) { + + Stopwatch sw = new Stopwatch(); + sw.Start(); + if (!LightingEnabled) return; Matrix shadowTransform = cam.ShaderTransform @@ -152,6 +164,10 @@ namespace Barotrauma.Lights graphics.SetRenderTarget(null); + Debug.WriteLine("lights: " + sw.ElapsedTicks + " (" + sw.ElapsedMilliseconds + ")"); + if (!ObstructVision) return; + + } public void UpdateObstructVision(GraphicsDevice graphics, SpriteBatch spriteBatch, Camera cam, Vector2 lookAtPosition) diff --git a/Subsurface_Solution.v12.suo b/Subsurface_Solution.v12.suo index 3ef76c980a7e0e26ff6560004dfbee9a661a0803..2539b262f75bba33b63e6cd39f217ed100ed1a66 100644 GIT binary patch delta 4383 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 delta 5086 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