안녕하세요. 라즈베리파이5에서 구동될 프로그램을 아발로니아를 이용하여 만들었습니다. 프로그램은 Test시 큰 문제 없이 구동이 되었지만 애니메이션이 일어날때마다 Gpu가 80%까지 치솟는데 이것저것 찾아보니 그래픽 가속이 기본옵션이라 그렇다해서 수정을 했습니다.
인터넷에서 나온 방법들과 gpt의 도움을 받아 수정을 해 70%까지는 떨쳤지만 Gpu 사용률을 30% 이내로 줄일 수 있는 방법이 더 방법이 있을까요??
public static void Main(string[] args)
{
Environment.SetEnvironmentVariable("SKIA_DISABLE_GPU", "1");
BuildAvaloniaApp()
.StartWithClassicDesktopLifetime(args);
}
// Avalonia configuration, don't remove; also used by visual designer.
public static AppBuilder BuildAvaloniaApp()
=> AppBuilder.Configure<App>()
.UsePlatformDetect()
// .WithInterFont()
.With(new SkiaOptions
{
// GPU 사용하지 않도록 최대한 유도
MaxGpuResourceSizeBytes = 0
})
/*
.With(new AvaloniaNativePlatformOptions
{
RenderingMode = new List<AvaloniaNativeRenderingMode>
{
AvaloniaNativeRenderingMode.Software
}
})
*/
.LogToTrace()
.UseSkia()
.UseReactiveUI();
Gpu를 최대한 낮게 가져가려는 이유가 팀장님께서 라즈베리에 AI의 일부기능을 올릴지도 모르니 Gpu를 최대한 줄여보라고 하시고 단순 제품이동 대쉬보드 프로그램인데 Gpu를 높게 쓰는게 이상하다 합니다.
가만 생각해보니 요구사항을 떠나서 단순한 객체 이동 애니메이션인데 Gpu를 사용하것도 개인적으로 궁금하기도 합니다. (팀장님께서는 이동에 따른 화면을 다시 그리는 것 아니냐고 의심합니다.)
객체에 애니메이션을 걸어 캔버스에 자식으로 넣어 Left 값을 늘려서 이동을 구현 하고 애니메이션 각 포인트마다 총 3개로 구성되있습니다.
(캔버스에 생성된 객체를 자식으로 추가는 mainWindow 비하인드코드에 기술되어 있습니다.)
객체가 늘어나면 애니메이션이 실행 수가 늘어나니 Gpu가 올라갈거라 예상했지만 객체가 1개만 있어도 80%를 찍네요 ㅎㅎ;;
아래는 주황색 제품 객체의 애니메이션 관련 코드입니다.
....중 략....
animation1 = new Animation
{
Duration = TimeSpan.FromSeconds(3),
IterationCount = new IterationCount(1),
FillMode = FillMode.Forward,
Children =
{
new KeyFrame
{
Cue = new Cue(0.0),
Setters =
{
new Setter(Canvas.LeftProperty, Convert.ToDouble(0))
}
},
new KeyFrame
{
Cue = new Cue(1),
Setters =
{
new Setter(Canvas.LeftProperty , Convert.ToDouble(240))
}
},
}
};
animation2 = new Animation
{
Duration = TimeSpan.FromSeconds(5),
IterationCount = new IterationCount(1),
//PlaybackDirection = PlaybackDirection.Normal,
FillMode = FillMode.Forward,
Children =
{
new KeyFrame
{
Cue = new Cue(0.0),
Setters =
{
new Setter(Canvas.LeftProperty, Convert.ToDouble(240))
}
},
new KeyFrame
{
Cue = new Cue(1.0),
Setters =
{
new Setter(Canvas.LeftProperty , Convert.ToDouble(665))
}
}
}
};
animation3 = new Animation
{
Duration = TimeSpan.FromSeconds(1.8),
IterationCount = new IterationCount(1),
//PlaybackDirection = PlaybackDirection.Normal,
FillMode = FillMode.Forward,
Children =
{
new KeyFrame
{
Cue = new Cue(0.0),
Setters =
{
new Setter(Canvas.LeftProperty, Convert.ToDouble(665))
}
},
new KeyFrame
{
Cue = new Cue(1.0),
Setters =
{
new Setter(Canvas.LeftProperty , Convert.ToDouble(826))
}
},
}
};
eClipse.Stroke = new SolidColorBrush(Colors.Black);
eClipse.StrokeThickness = 1;
grid.Children.Add(eClipse);
eClipse.HorizontalAlignment = Avalonia.Layout.HorizontalAlignment.Center;
Style style = new Style(x => x.OfType<Grid>().Name("go2"));
style.Animations.Add(animation1);
style.Animations.Add(animation2);
style.Animations.Add(animation3);
....중략.....
public async Task decision1()
{
await animation1.RunAsync(grid , cancellationTokenSource.Token);
await decision2();
}
public async Task decision2()
{
await Task.Delay(500);
await animation2.RunAsync(grid, cancellationTokenSource.Token);
await decisionFinal();
}
public async Task decisionFinal()
{
await Task.Delay(500);
await animation3.RunAsync(grid);
await Task.Delay(500);
this.Dispose();
}
public void Dispose()
{
((Canvas)grid.Parent).Children.Remove(grid);
}