More premature optimizations.

This commit is contained in:
Pieter-Jan Briers
2019-02-21 18:13:03 +01:00
parent 99cd2adfc7
commit b3e3066c53
5 changed files with 84 additions and 19 deletions

View File

@@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using OpenTK.Graphics.OpenGL4;
using SS14.Client.GameObjects;
using SS14.Client.Graphics.ClientEye;
@@ -59,6 +58,8 @@ namespace SS14.Client.Graphics.Clyde
// Yes this can be optimized later.
private Color? BatchingModulate;
private RenderHandle _renderHandle;
public void Render(FrameEventArgs args)
{
if (GameController.Mode != GameController.DisplayMode.OpenGL)
@@ -74,7 +75,7 @@ namespace SS14.Client.Graphics.Clyde
_currentModelMatrix = Matrix3.Identity;
// We hand out this handle so external code can generate command lists for us.
var renderHandle = new RenderHandle(this);
_renderHandle._drawingHandles.Clear();
_currentSpace = CurrentSpace.ScreenSpace;
// Screen view matrix is identity. Easy huh.
@@ -101,8 +102,8 @@ namespace SS14.Client.Graphics.Clyde
if (_drawingSplash)
{
_displaySplash(renderHandle);
_flushRenderHandle(renderHandle);
_displaySplash(_renderHandle);
_flushRenderHandle(_renderHandle);
_window.SwapBuffers();
return;
}
@@ -130,10 +131,10 @@ namespace SS14.Client.Graphics.Clyde
.Where(o => o.Space == OverlaySpace.ScreenSpaceBelowWorld)
.OrderBy(o => o.ZIndex))
{
overlay.OpenGLRender(renderHandle);
overlay.OpenGLRender(_renderHandle);
}
_flushRenderHandle(renderHandle);
_flushRenderHandle(_renderHandle);
_popDebugGroupMaybe();
@@ -224,7 +225,7 @@ namespace SS14.Client.Graphics.Clyde
_pushDebugGroupMaybe(DbgGroupEntities);
// Use a SINGLE drawing handle for all entities.
var drawingHandle = renderHandle.CreateHandleWorld();
var drawingHandle = _renderHandle.CreateHandleWorld();
var entityList = new List<SpriteComponent>(100);
@@ -247,7 +248,7 @@ namespace SS14.Client.Graphics.Clyde
entity.OpenGLRender(drawingHandle);
}
_flushRenderHandle(renderHandle);
_flushRenderHandle(_renderHandle);
_popDebugGroupMaybe();
@@ -265,9 +266,9 @@ namespace SS14.Client.Graphics.Clyde
// Render UI.
_currentSpace = CurrentSpace.ScreenSpace;
_userInterfaceManager.Render(renderHandle);
_userInterfaceManager.Render(_renderHandle);
_flushRenderHandle(renderHandle);
_flushRenderHandle(_renderHandle);
_popDebugGroupMaybe();

View File

@@ -287,6 +287,9 @@ namespace SS14.Client.Graphics.Clyde
GL.BindBufferBase(BufferRangeTarget.UniformBuffer, ProjViewBindingIndex, ProjViewUBO.Handle);
_drawingSplash = true;
_renderHandle = new RenderHandle(this);
Render(null);
}

View File

@@ -2,6 +2,7 @@
using SS14.Client.Interfaces.UserInterface;
using SS14.Shared.IoC;
using System;
using System.Collections;
using System.Collections.Generic;
using SS14.Shared.Log;
using SS14.Shared.Interfaces.Reflection;
@@ -90,7 +91,7 @@ namespace SS14.Client.UserInterface
/// <summary>
/// Gets an enumerable over all the children of this control.
/// </summary>
public IEnumerable<Control> Children => _orderedChildren;
public OrderedChildEnumerable Children => new OrderedChildEnumerable(this);
public int ChildCount => _orderedChildren.Count;
@@ -2243,6 +2244,31 @@ namespace SS14.Client.UserInterface
return (Godot.Control) scene2.Instance();
}
public readonly struct OrderedChildEnumerable : IEnumerable<Control>
{
private readonly Control Owner;
public OrderedChildEnumerable(Control owner)
{
Owner = owner;
}
public List<Control>.Enumerator GetEnumerator()
{
return Owner._orderedChildren.GetEnumerator();
}
IEnumerator<Control> IEnumerable<Control>.GetEnumerator()
{
return GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
[AttributeUsage(AttributeTargets.Class, Inherited = false)]
[BaseTypeRequired(typeof(Control))]
internal class ControlWrapAttribute : Attribute

View File

@@ -111,6 +111,11 @@ namespace SS14.Client.UserInterface.Controls
var entryOffset = 0;
// A stack for format tags.
// This stack contains the format tag to RETURN TO when popped off.
// So when a new color tag gets hit this stack gets the previous color pushed on.
var formatStack = new Stack<FormattedMessage.Tag>(2);
foreach (var entry in _entries)
{
if (entryOffset - _mouseWheelOffset < 0)
@@ -119,12 +124,10 @@ namespace SS14.Client.UserInterface.Controls
continue;
}
if (entryOffset + entry.Height - _mouseWheelOffset > contentBox.Height) break;
// A stack for format tags.
// This stack contains the format tag to RETURN TO when popped off.
// So when a new color tag gets hit this stack gets the previous color pushed on.
var formatStack = new Stack<FormattedMessage.Tag>(2);
if (entryOffset + entry.Height - _mouseWheelOffset > contentBox.Height)
{
break;
}
// The tag currently doing color.
var currentColorTag = TagWhite;
@@ -132,7 +135,9 @@ namespace SS14.Client.UserInterface.Controls
var globalBreakCounter = 0;
var lineBreakIndex = 0;
var baseLine = contentBox.TopLeft + new Vector2(0, font.Ascent + entryOffset - _mouseWheelOffset);
formatStack.Clear();
foreach (var tag in entry.Message.Tags)
{
switch (tag)
{
case FormattedMessage.TagColor tagColor:
@@ -171,6 +176,7 @@ namespace SS14.Client.UserInterface.Controls
break;
}
}
}
entryOffset += entry.Height + font.LineSeparation;
}

View File

@@ -1,4 +1,4 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using JetBrains.Annotations;
@@ -14,7 +14,7 @@ namespace SS14.Client.Utility
[PublicAPI]
public sealed class FormattedMessage
{
public IReadOnlyList<Tag> Tags => _tags;
public TagList Tags => new TagList(_tags);
private readonly List<Tag> _tags;
public FormattedMessage()
@@ -94,5 +94,34 @@ namespace SS14.Client.Utility
public class TagPop : Tag
{
}
public readonly struct TagList : IReadOnlyList<Tag>
{
private readonly List<Tag> _tags;
public TagList(List<Tag> tags)
{
_tags = tags;
}
public List<Tag>.Enumerator GetEnumerator()
{
return _tags.GetEnumerator();
}
IEnumerator<Tag> IEnumerable<Tag>.GetEnumerator()
{
return _tags.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return _tags.GetEnumerator();
}
public int Count => _tags.Count;
public Tag this[int index] => _tags[index];
}
}
}