Итак, я пытаюсь сделать стыковочную библиотеку очень похожей на те, которые используются в 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 по-прежнему довольно приличная. Есть ли способ улучшить эту работу? Спасибо.
EDIT: есть ли способ сделать плавную анимацию для Winforms?
EDIT 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 имеет аппаратное ускорение на совместимых машинах, но я не вижу использования графического процессора на моей dev-машине) Что касается ответа на этот вопрос, как мне сделать это быстрее?