【发布时间】:2020-10-29 17:25:38
【问题描述】:
所以我正在尝试制作一个与 VSCode 和 Atom 中使用的非常相似的对接库,但是我遇到了一些问题。基本上,首先,我需要制作一个从宽度 0 开始的框,以增加到屏幕的末尾。我能够做到这一点:
Rectangle rectangle = new Rectangle();
myCanvas.Children.Add(rectangle);
rectangle.Width = 0;
rectangle.Height = ActualHeight;
rectangle.Fill = new SolidColorBrush(Color.FromArgb(80, 120, 120, 120));
Storyboard sb = new Storyboard();
DoubleAnimation da = new DoubleAnimation(rectangle.Width, ActualWidth, new Duration(TimeSpan.FromMilliseconds(1000)));
Storyboard.SetTargetProperty(da, new PropertyPath("(Rectangle.Width)"));
sb.Children.Add(da);
rectangle.BeginStoryboard(sb);
动画在我的开发机器上非常流畅,但是当远程桌面进入虚拟机时,动画非常不稳定。但是,VSCodes 和 Atoms 动画仍然相当不错。有什么办法可以使这项工作更好吗? 谢谢。
编辑: 有没有办法为 Winforms 制作流畅的动画?
编辑 2: 所以我在这里有这个 Winforms GDI 代码示例:
private void FastTimer_Tick(object sender, EventArgs e)
{
var x = 1;
if (solidBrush == IntPtr.Zero)
{
solidBrush = CreateSolidBrush(ColorTranslator.ToWin32(Color.FromArgb(120, 120, 120)));
hDC = CreateGraphics().GetHdc();
}
index += x;
int w = x;
int h = Height;
//create memory device context
var memdc = CreateCompatibleDC(hDC);
//create bitmap
var hbitmap = CreateCompatibleBitmap(hDC, index, h);
////select bitmap in to memory device context
var holdbmp = SelectObject(memdc, hbitmap);
RECT rect = new RECT(new Rectangle(0, 0, w, h));
FillRect(memdc, ref rect, solidBrush);
AlphaBlend(hDC, index - x, 0, w, h, memdc, 0, 0, w, h, new BLENDFUNCTION(0, 0, 128, 0));
SelectObject(memdc, holdbmp);
DeleteObject(hbitmap);
DeleteDC(memdc);
}
快速定时器核心是这样的(测试中间隔为1000):
double frequency = Stopwatch.Frequency;
long prevTicks = 0;
while (true)
{
if (!_enabled)
{
return;
}
double interval = frequency / Interval;
long ticks = Stopwatch.GetTimestamp();
if (ticks >= prevTicks + interval)
{
prevTicks = ticks;
Tick?.Invoke(this, EventArgs.Empty);
}
}
但是,远程桌面上的动画仍然不稳定。 (我知道 RD 不能使用硬件加速,但我认为 GDI 在兼容机器上是硬件加速的,但我在我的开发机器上没有看到任何 GPU 使用情况) 关于 thatguys 的回答,我怎样才能让它更快?
【问题讨论】:
-
您的问题是您正在创建的重新绘制的数量以及从远程机器通过电线发送到查看器的事实。使用基于 css 的动画,它们在浏览器中本地运行。使用 wpf 它会为您的矩形设置一个像素的动画,这会使矩形无效,因此它会被重新绘制,它会被发送到您的查看机。它为另一个像素设置动画,同样的情况也会发生。然后一次又一次。多次。从本质上讲,您几乎构建了一个动画,该动画可能旨在通过远程连接影响观看体验。
标签: c# .net wpf winforms animation