안녕하세요. 라즈베리파이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);
}
혹시 raspberry pi 에서 Avalonia 프로젝트를 어떻게 빌드하셨는지 알 수 있을까요?
저도 현재 raspberry pi에서 canvas 에 그려지는 것을 기능으로 하는 프로그램을 작성하고 있는데,
저는 빌드해도 SkiaSharp.so 가 gpu enable옵션이 활성화 되지 않는지 GPU의 사용률에 변화가 없고 CPU만 점유율이 늘어나네요.
GPU가속이 기본으로 설정 되어 있다고 하셨는데
혹시 설정이나 빌드를 어떻게 하셨는지 여쭙고 싶습니다.
안녕하세요. 저도 여기저기 알아보고 옵션을 적용해봤지만 뚜렷한 해결책을 찾은건 아닙니다. 이미 검색을 통해서 아실지 모르겠지만 라즈베리파이 자체의 디스플레이 옵션이 원인이지 싶습니다. 이 때문에 아발로니아 빌드옵션을 제아무리 수정을 해도 Gpu 사용률이 떨어지지 않는것 같습니다. 결국 아발로니아 구동시 라즈베리파이 자체의 Xwayland를 이용하지 않도록 해야하는데 gpt에 나온 방식대로 해도 안되어 디스플레이 서버 구동 방식을 x11로 바꿨습니다.
x11로 바꿔서 실행시 작업관리자에서 보면 gpu가 오히려 증가하는데 버그인지 어쩐지 Gpu usage나온 사용량과 세부항목의 사용량 합계가 달라서 더 이상 알아보지 않고 그대로 두었습니다 ㅎ