gpt4 book ai didi

C#异步LCD写

转载 作者:太空宇宙 更新时间:2023-11-03 22:29:57 25 4
gpt4 key购买 nike

所以我正在进行一个项目,该项目涉及每秒可更新 60 次的 LCD 屏幕。它使用 BitmapFrame,我需要将这些像素复制到更新屏幕的库中。目前我得到大约 30-35 FPS,这太低了。所以我尝试使用多线程,但这会产生很多问题。

DisplayController 已经创建了一个 thead 来完成所有的工作:

public void Start()
{
_looper = new Thread(Loop);
_looper.IsBackground = true;
_looper.Start();
}

private void Loop()
{
while (_IsRunning)
{
renderScreen();
}
}

它调用绘制所有元素并将像素复制到 BitmapFramerenderScreen 方法。但是这个过程花费的时间太长,所以我的 FPS 下降了。我试图通过创建一个 Task 来解决这个问题,它可以绘制、复制和写入像素。但此解决方案会占用大量 CPU 并导致屏幕出现故障。

public void renderScreen()
{
Task.Run(() =>
{
Monitor.Enter(_object);

// Push screen to LCD
BitmapFrame bf = BitmapFrame.Create(screen);
RenderOptions.SetBitmapScalingMode(bf, BitmapScalingMode.LowQuality);
bf.CopyPixels(new Int32Rect(0, 0, width, height), pixels, width * 4, 0);

DisplayWrapper.USBD480_DrawFullScreenBGRA32(ref disp, pixels);

Monitor.Exit(_object);
});
}

我已经阅读了很多关于 C# 的并发队列的资料,但这不是我需要的。使用两个线程会导致编译器说该变量由另一个线程拥有。

如何同时渲染新位图并将该位图每秒写入 LCD 60 次?

最佳答案

我假设 USBD480_DrawFullScreenBGRA32 是实际写入 LCD 的内容,其余代码只是准备图像。我认为提高性能的关键是在编写上一张图像的同时准备下一张图像。

我认为最好的解决方案是使用两个线程并使用 ConcurrentQueue作为需要写入内容的缓冲区。一个线程准备图像和 puts them into the ConcurrentQueue , 和另一个线程 pulls them off the queue并将它们写入LCD。这样您就没有每次调用 Task.Run 的开销。

限制写入队列的帧数也可能是明智的,这样它就不会超前太远而占用不必要的内存。

关于C#异步LCD写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58402150/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com