Browse Source

Report renderer transport pool memory usage in fps line

pull/8105/head
Nikita Tsukanov 4 years ago
parent
commit
579dbaa25c
  1. 1
      src/Avalonia.Base/Avalonia.Base.csproj
  2. 4
      src/Avalonia.Base/Rendering/Composition/Server/FpsCounter.cs
  3. 15
      src/Avalonia.Base/Rendering/Composition/Server/ServerCompositionTarget.cs
  4. 10
      src/Avalonia.Base/Rendering/Composition/Server/ServerCompositor.cs
  5. 11
      src/Avalonia.Base/Rendering/Composition/Transport/BatchStreamArrayPool.cs
  6. 9
      src/Avalonia.Base/Utilities/ByteSizeHelper.cs
  7. 2
      src/Avalonia.Dialogs/FileSizeStringConverter.cs
  8. 3
      src/Avalonia.Dialogs/ManagedFileChooserSources.cs

1
src/Avalonia.Base/Avalonia.Base.csproj

@ -35,6 +35,7 @@
<InternalsVisibleTo Include="Avalonia.Skia.UnitTests, PublicKey=$(AvaloniaPublicKey)" />
<InternalsVisibleTo Include="Avalonia.UnitTests, PublicKey=$(AvaloniaPublicKey)" />
<InternalsVisibleTo Include="Avalonia.Web.Blazor, PublicKey=$(AvaloniaPublicKey)" />
<InternalsVisibleTo Include="Avalonia.Dialogs, PublicKey=$(AvaloniaPublicKey)" />
<InternalsVisibleTo Include="DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7" />
</ItemGroup>

4
src/Avalonia.Base/Rendering/Composition/Server/FpsCounter.cs

@ -35,7 +35,7 @@ internal class FpsCounter
public void FpsTick() => _framesThisSecond++;
public void RenderFps(IDrawingContextImpl context)
public void RenderFps(IDrawingContextImpl context, string aux)
{
var now = _stopwatch.Elapsed;
var elapsed = now - _lastFpsUpdate;
@ -50,7 +50,7 @@ internal class FpsCounter
_lastFpsUpdate = now;
}
var fpsLine = $"Frame #{_totalFrames:00000000} FPS: {_fps:000}";
var fpsLine = $"Frame #{_totalFrames:00000000} FPS: {_fps:000} " + aux;
double width = 0;
double height = 0;
foreach (var ch in fpsLine)

15
src/Avalonia.Base/Rendering/Composition/Server/ServerCompositionTarget.cs

@ -134,10 +134,19 @@ namespace Avalonia.Rendering.Composition.Server
, null, _dirtyRect);
}
if(DrawFps)
_fpsCounter.RenderFps(targetContext);
if (DrawFps)
{
var nativeMem = ByteSizeHelper.ToString((ulong)(
(Compositor.BatchMemoryPool.CurrentUsage + Compositor.BatchMemoryPool.CurrentPool) *
Compositor.BatchMemoryPool.BufferSize), false);
var managedMem = ByteSizeHelper.ToString((ulong)(
(Compositor.BatchObjectPool.CurrentUsage + Compositor.BatchObjectPool.CurrentPool) *
Compositor.BatchObjectPool.ArraySize *
IntPtr.Size), false);
_fpsCounter.RenderFps(targetContext, $"M:{managedMem} / N:{nativeMem}");
}
_dirtyRect = Rect.Empty;
}
}

10
src/Avalonia.Base/Rendering/Composition/Server/ServerCompositor.cs

@ -24,8 +24,8 @@ namespace Avalonia.Rendering.Composition.Server
private List<ServerCompositionTarget> _activeTargets = new();
private HashSet<IAnimationInstance> _activeAnimations = new();
private List<IAnimationInstance> _animationsToUpdate = new();
private BatchStreamObjectPool<object?> _batchObjectPool;
private BatchStreamMemoryPool _batchMemoryPool;
internal BatchStreamObjectPool<object?> BatchObjectPool;
internal BatchStreamMemoryPool BatchMemoryPool;
private object _lock = new object();
public IPlatformGpuContext? GpuContext { get; }
@ -34,8 +34,8 @@ namespace Avalonia.Rendering.Composition.Server
{
GpuContext = platformGpu?.PrimaryContext;
_renderLoop = renderLoop;
_batchObjectPool = batchObjectPool;
_batchMemoryPool = batchMemoryPool;
BatchObjectPool = batchObjectPool;
BatchMemoryPool = batchMemoryPool;
_renderLoop.Add(this);
}
@ -60,7 +60,7 @@ namespace Avalonia.Rendering.Composition.Server
batch = _batches.Dequeue();
}
using (var stream = new BatchStreamReader(batch.Changes, _batchMemoryPool, _batchObjectPool))
using (var stream = new BatchStreamReader(batch.Changes, BatchMemoryPool, BatchObjectPool))
{
while (!stream.IsObjectEof)
{

11
src/Avalonia.Base/Rendering/Composition/Transport/BatchStreamArrayPool.cs

@ -18,6 +18,9 @@ internal abstract class BatchStreamPoolBase<T> : IDisposable
readonly int[] _usageStatistics = new int[10];
int _usageStatisticsSlot;
public int CurrentUsage => _usage;
public int CurrentPool => _pool.Count;
public BatchStreamPoolBase(bool needsFinalize, Action<Func<bool>>? startTimer = null)
{
if(!needsFinalize)
@ -116,16 +119,16 @@ internal abstract class BatchStreamPoolBase<T> : IDisposable
internal sealed class BatchStreamObjectPool<T> : BatchStreamPoolBase<T[]> where T : class?
{
private readonly int _arraySize;
public int ArraySize { get; }
public BatchStreamObjectPool(int arraySize = 1024, Action<Func<bool>>? startTimer = null) : base(false, startTimer)
public BatchStreamObjectPool(int arraySize = 128, Action<Func<bool>>? startTimer = null) : base(false, startTimer)
{
_arraySize = arraySize;
ArraySize = arraySize;
}
protected override T[] CreateItem()
{
return new T[_arraySize];
return new T[ArraySize];
}
protected override void DestroyItem(T[] item)

9
src/Avalonia.Dialogs/ByteSizeHelper.cs → src/Avalonia.Base/Utilities/ByteSizeHelper.cs

@ -1,10 +1,11 @@
using System;
namespace Avalonia.Dialogs
namespace Avalonia.Utilities
{
internal static class ByteSizeHelper
{
private const string formatTemplate = "{0}{1:0.#} {2}";
private const string formatTemplateSeparated = "{0}{1:0.#} {2}";
private const string formatTemplate = "{0}{1:0.#}{2}";
private static readonly string[] Prefixes =
{
@ -19,11 +20,11 @@ namespace Avalonia.Dialogs
"YB"
};
public static string ToString(ulong bytes)
public static string ToString(ulong bytes, bool separate)
{
if (bytes == 0)
{
return string.Format(formatTemplate, null, 0, Prefixes[0]);
return string.Format(separate ? formatTemplateSeparated : formatTemplate, null, 0, Prefixes[0]);
}
var absSize = Math.Abs((double)bytes);

2
src/Avalonia.Dialogs/FileSizeStringConverter.cs

@ -12,7 +12,7 @@ namespace Avalonia.Dialogs
{
if (value is long size && size > 0)
{
return ByteSizeHelper.ToString((ulong)size);
return Avalonia.Utilities.ByteSizeHelper.ToString((ulong)size, true);
}
return "";

3
src/Avalonia.Dialogs/ManagedFileChooserSources.cs

@ -6,6 +6,7 @@ using System.Reactive.Linq;
using System.Runtime.InteropServices;
using Avalonia.Controls.Platform;
using Avalonia.Threading;
using Avalonia.Utilities;
namespace Avalonia.Dialogs
{
@ -60,7 +61,7 @@ namespace Avalonia.Dialogs
if (displayName == null & x.VolumeSizeBytes > 0)
{
displayName = $"{ByteSizeHelper.ToString(x.VolumeSizeBytes)} Volume";
displayName = $"{ByteSizeHelper.ToString(x.VolumeSizeBytes, true)} Volume";
};
try

Loading…
Cancel
Save