feat(gui): optimized refresh rate

This commit is contained in:
capyb2222 committed 2026-10-17 20:42:15 -07:00
1 parent 679b041b09
commit 9f6988e2ff
4 files changed
+95 -25

No files matched your search

+3
View File
@@ -150,6 +150,9 @@
<Border.Effect>
<BlurEffect Radius="18"/>
</Border.Effect>
<Border.CacheMode>
<BitmapCache/>
</Border.CacheMode>
</Border>
<Border x:Name="B" Background="{TemplateBinding Background}" CornerRadius="12" Padding="{TemplateBinding Padding}">
<Grid>
+30
View File
@@ -1,8 +1,38 @@
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Media.Animation;
namespace CapyLauncher
{
public partial class App : Application
{
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
struct DisplayMode
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] public string DeviceName;
public short SpecVersion, DriverVersion, Size, DriverExtra;
public int Fields, PositionX, PositionY, Orientation, FixedOutput;
public short Color, Duplex, YResolution, TTOption, Collate;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] public string FormName;
public short LogPixels;
public int BitsPerPel, PelsWidth, PelsHeight, DisplayFlags, DisplayFrequency;
public int IcmMethod, IcmIntent, MediaType, DitherType, Reserved1, Reserved2, PanningWidth, PanningHeight;
}
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
static extern bool EnumDisplaySettings(string device, int mode, ref DisplayMode devMode);
static int RefreshRate()
{
var mode = new DisplayMode { Size = (short)Marshal.SizeOf(typeof(DisplayMode)) };
if (!EnumDisplaySettings(null, -1, ref mode) || mode.DisplayFrequency <= 1)
return 60;
return mode.DisplayFrequency;
}
public App()
{
Timeline.DesiredFrameRateProperty.OverrideMetadata(typeof(Timeline), new FrameworkPropertyMetadata { DefaultValue = RefreshRate() });
}
}
}
+34 -19
View File
@@ -14,23 +14,23 @@
<Window.Triggers>
<EventTrigger RoutedEvent="Window.Loaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="BlobPink" Storyboard.TargetProperty="(Canvas.Left)" From="-160" To="140" Duration="0:0:23" AutoReverse="True" RepeatBehavior="Forever">
<Storyboard Timeline.DesiredFrameRate="30">
<DoubleAnimation Storyboard.TargetName="BlobPink" Storyboard.TargetProperty="RenderTransform.X" From="0" To="300" Duration="0:0:23" AutoReverse="True" RepeatBehavior="Forever">
<DoubleAnimation.EasingFunction><SineEase EasingMode="EaseInOut"/></DoubleAnimation.EasingFunction>
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="BlobPink" Storyboard.TargetProperty="(Canvas.Top)" From="-180" To="60" Duration="0:0:17" AutoReverse="True" RepeatBehavior="Forever">
<DoubleAnimation Storyboard.TargetName="BlobPink" Storyboard.TargetProperty="RenderTransform.Y" From="0" To="240" Duration="0:0:17" AutoReverse="True" RepeatBehavior="Forever">
<DoubleAnimation.EasingFunction><SineEase EasingMode="EaseInOut"/></DoubleAnimation.EasingFunction>
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="BlobPurple" Storyboard.TargetProperty="(Canvas.Left)" From="520" To="860" Duration="0:0:29" AutoReverse="True" RepeatBehavior="Forever">
<DoubleAnimation Storyboard.TargetName="BlobPurple" Storyboard.TargetProperty="RenderTransform.X" From="0" To="340" Duration="0:0:29" AutoReverse="True" RepeatBehavior="Forever">
<DoubleAnimation.EasingFunction><SineEase EasingMode="EaseInOut"/></DoubleAnimation.EasingFunction>
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="BlobPurple" Storyboard.TargetProperty="(Canvas.Top)" From="380" To="140" Duration="0:0:21" AutoReverse="True" RepeatBehavior="Forever">
<DoubleAnimation Storyboard.TargetName="BlobPurple" Storyboard.TargetProperty="RenderTransform.Y" From="0" To="-240" Duration="0:0:21" AutoReverse="True" RepeatBehavior="Forever">
<DoubleAnimation.EasingFunction><SineEase EasingMode="EaseInOut"/></DoubleAnimation.EasingFunction>
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="BlobBlue" Storyboard.TargetProperty="(Canvas.Left)" From="980" To="620" Duration="0:0:26" AutoReverse="True" RepeatBehavior="Forever">
<DoubleAnimation Storyboard.TargetName="BlobBlue" Storyboard.TargetProperty="RenderTransform.X" From="0" To="-360" Duration="0:0:26" AutoReverse="True" RepeatBehavior="Forever">
<DoubleAnimation.EasingFunction><SineEase EasingMode="EaseInOut"/></DoubleAnimation.EasingFunction>
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="BlobBlue" Storyboard.TargetProperty="(Canvas.Top)" From="-220" To="20" Duration="0:0:19" AutoReverse="True" RepeatBehavior="Forever">
<DoubleAnimation Storyboard.TargetName="BlobBlue" Storyboard.TargetProperty="RenderTransform.Y" From="0" To="240" Duration="0:0:19" AutoReverse="True" RepeatBehavior="Forever">
<DoubleAnimation.EasingFunction><SineEase EasingMode="EaseInOut"/></DoubleAnimation.EasingFunction>
</DoubleAnimation>
</Storyboard>
@@ -40,24 +40,39 @@
<Grid>
<Canvas ClipToBounds="True" IsHitTestVisible="False">
<Canvas.CacheMode>
<BitmapCache RenderAtScale="0.5"/>
</Canvas.CacheMode>
<Ellipse x:Name="BlobPink" Width="560" Height="560" Fill="#FF9AA2" Opacity="0.13">
<Ellipse.Effect><BlurEffect Radius="160" KernelType="Gaussian"/></Ellipse.Effect>
<Ellipse x:Name="BlobPink" Width="900" Height="900" Canvas.Left="-330" Canvas.Top="-350">
<Ellipse.Fill>
<RadialGradientBrush>
<GradientStop Color="#2EFF9AA2" Offset="0"/>
<GradientStop Color="#14FF9AA2" Offset="0.45"/>
<GradientStop Color="#00FF9AA2" Offset="1"/>
</RadialGradientBrush>
</Ellipse.Fill>
<Ellipse.RenderTransform><TranslateTransform/></Ellipse.RenderTransform>
</Ellipse>
<Ellipse x:Name="BlobPurple" Width="620" Height="620" Fill="#D689FF" Opacity="0.11">
<Ellipse.Effect><BlurEffect Radius="170" KernelType="Gaussian"/></Ellipse.Effect>
<Ellipse x:Name="BlobPurple" Width="980" Height="980" Canvas.Left="350" Canvas.Top="210">
<Ellipse.Fill>
<RadialGradientBrush>
<GradientStop Color="#26D689FF" Offset="0"/>
<GradientStop Color="#11D689FF" Offset="0.45"/>
<GradientStop Color="#00D689FF" Offset="1"/>
</RadialGradientBrush>
</Ellipse.Fill>
<Ellipse.RenderTransform><TranslateTransform/></Ellipse.RenderTransform>
</Ellipse>
<Ellipse x:Name="BlobBlue" Width="520" Height="520" Fill="#7DC8FF" Opacity="0.09">
<Ellipse.Effect><BlurEffect Radius="160" KernelType="Gaussian"/></Ellipse.Effect>
<Ellipse x:Name="BlobBlue" Width="860" Height="860" Canvas.Left="810" Canvas.Top="-390">
<Ellipse.Fill>
<RadialGradientBrush>
<GradientStop Color="#227DC8FF" Offset="0"/>
<GradientStop Color="#0F7DC8FF" Offset="0.45"/>
<GradientStop Color="#007DC8FF" Offset="1"/>
</RadialGradientBrush>
</Ellipse.Fill>
<Ellipse.RenderTransform><TranslateTransform/></Ellipse.RenderTransform>
</Ellipse>
</Canvas>
<Grid x:Name="Shell">
<Grid.Effect>
<BlurEffect x:Name="ShellBlur" Radius="0"/>
</Grid.Effect>
<Grid.RowDefinitions>
<RowDefinition Height="52"/>
<RowDefinition Height="*"/>
+28 -6
View File
@@ -66,7 +66,6 @@ namespace CapyLauncher
string dispatch, gamePort, lastError;
bool closing;
int frame;
double bob;
public MainWindow()
{
@@ -403,6 +402,24 @@ namespace CapyLauncher
EmptyCapy.Source = swim[0];
}
void Bob(bool on)
{
var move = (TranslateTransform)Capy.RenderTransform;
if (!on)
{
move.BeginAnimation(TranslateTransform.YProperty, new DoubleAnimation(0, TimeSpan.FromMilliseconds(300)));
return;
}
if (move.HasAnimatedProperties && move.Y != 0)
return;
move.BeginAnimation(TranslateTransform.YProperty, new DoubleAnimation(-1.6, 1.6, TimeSpan.FromMilliseconds(900))
{
AutoReverse = true,
RepeatBehavior = RepeatBehavior.Forever,
EasingFunction = new SineEase { EasingMode = EasingMode.EaseInOut },
});
}
void Swim()
{
bool awake = state == State.Online || state == State.Starting;
@@ -411,8 +428,6 @@ namespace CapyLauncher
if (awake)
{
Capy.Source = swim[frame];
bob += 0.35;
((TranslateTransform)Capy.RenderTransform).Y = Math.Sin(bob) * 1.5;
}
if (EmptyState.Visibility == Visibility.Visible)
EmptyCapy.Source = swim[frame];
@@ -463,10 +478,10 @@ namespace CapyLauncher
Animate(Capy, OpacityProperty, awake, 400);
Animate(Water, OpacityProperty, up ? 0.55 : 0.2, 600);
}
Bob(up);
if (!up)
{
Capy.Source = swim[0];
((TranslateTransform)Capy.RenderTransform).Y = 0;
UptimeText.Text = "—";
PlayerText.Text = "—";
PlayerText.Foreground = (Brush)FindResource("Text");
@@ -910,7 +925,9 @@ namespace CapyLauncher
Animate(Overlay, OpacityProperty, 1, 200);
Animate(scale, ScaleTransform.ScaleXProperty, 1, 260, 0, 0.94);
Animate(scale, ScaleTransform.ScaleYProperty, 1, 260, 0, 0.94);
Animate(ShellBlur, BlurEffect.RadiusProperty, 10, 260);
var blur = new BlurEffect { Radius = 0 };
Shell.Effect = blur;
Animate(blur, BlurEffect.RadiusProperty, 10, 260);
}
void HideDialog(bool result)
@@ -918,7 +935,12 @@ namespace CapyLauncher
var fade = new DoubleAnimation(0, TimeSpan.FromMilliseconds(160));
fade.Completed += (s, e) => Overlay.Visibility = Visibility.Collapsed;
Overlay.BeginAnimation(OpacityProperty, fade);
Animate(ShellBlur, BlurEffect.RadiusProperty, 0, 200);
if (Shell.Effect is BlurEffect blur)
{
var clear = new DoubleAnimation(0, TimeSpan.FromMilliseconds(200));
clear.Completed += (s, e) => { if (Overlay.Visibility != Visibility.Visible) Shell.Effect = null; };
blur.BeginAnimation(BlurEffect.RadiusProperty, clear);
}
answer?.TrySetResult(result);
}