书接上回:显示学习1(基于树莓派Pico) -- 基础-优快云博客
如果是基于树莓派Pico,那么看这个文档最权威的。
framebuf — 帧缓冲操作 — mPython掌控 2.2.0 documentation

我的理解显示屏其实还是一堆LED点的组合,在内存中有映射到显示屏的显示数据,记录了每个点的详细信息,比如色彩,亮度等等的信息,这部分信息先在内存中进行预处理,处理完成后,再将这段内存送到显示器逐个点进行显示。如果是30帧的视频,那么基本上要在0.03秒内处理完毕。
在Micropython中,常规是将驱动继承Framebuffer,这样方便操作。如下:
i2c = I2C(1, scl=Pin(7), sda=Pin(6), freq=200000)#Grove - OLED Display 0.96" (SSD1315)
oled = SSD1306_I2C(128, 64, i2c)
while True:
oled.fill(0)#clear
oled.text("Hello,World!",0,0)
oled.show()
其中SSD1306_I2C就是继承的Framebuffer。可以提供最基础的显示功能。
从python的接口来看,FB还提供了一些简易接口,line画线,fill_rect画矩形,text写文字。
图形的格式看起来也不少,MONO_VLSB,MONO_HLSB,MONO_HMSB,RGB565,GS2_HMSB,GS4_HMSB,GS8,每一种都要能基本了解吧。
| MONO_VLSB | 1位。单色(单通道)垂直扫描低位优先。这是一种单色图像格式,每个像素仅使用一个位来表示颜色,按垂直方向从上到下扫描,低位优先存储。 |
| MONO_HLSB | 1位。单色(单通道)水平扫描低位优先。类似于 MONO_VLSB,但是按水平方向从左到右扫描。 |
| MONO_HMSB | 1位。单色(单通道)水平扫描高位优先。类似于 MONO_VLSB 和 MONO_HLSB,但是高位优先存储。 |
| RGB565 | 16位,2个字节。彩色(三通道)格式,每个像素使用 16 位表示,其中 5 位用于红色通道,6 位用于绿色通道,5 位用于蓝色通道。 |
| GS2_HMSB | 2位。灰度级(单通道)2 位 高位优先。每个像素使用 2 位表示灰度级别,高位优先存储。 |
| GS4_HMSB | 4位。灰度级(单通道)4 位 高位优先。每个像素使用 4 位表示灰度级别,高位优先存储。 |
| GS8 | 8位,1个字节。灰度级(单通道)8 位。每个像素使用 8 位表示灰度级别。 |
分析完功能,我个人觉得基础版本的FB不是太复杂,1000行代码以内也许可以搞定。
还有几点我觉得可以看看。
1 双缓冲区。
很早很早就看到这个概念了,我觉得本质上还是处理速度和IO速度的异步导致的,所以使用两个来加速。看起来使用也很简单,应该算是编程技巧的一种,下面是从GPT要的示例代码:
import framebuf
import utime
# 设置屏幕分辨率
WIDTH = 128
HEIGHT = 64
# 创建两个 Framebuffer 对象
buf1 = bytearray(WIDTH * HEIGHT // 8)
fb1 = framebuf.FrameBuffer(buf1, WIDTH, HEIGHT, framebuf.MONO_HLSB)
buf2 = bytearray(WIDTH * HEIGHT // 8)
fb2 = framebuf.FrameBuffer(buf2, WIDTH, HEIGHT, framebuf.MONO_HLSB)
# 渲染函数,渲染到 buf1
def render(fb):
fb.fill(0) # 清空 Framebuffer
fb.text('Hello', 0, 0, 1) # 在 Framebuffer 上绘制文本
fb.text('MicroPython', 0, 16, 1)
fb.text('Double Buffering', 0, 32, 1)
# 初始化屏幕
# display.init() # 初始化显示器,具体操作可能因硬件平台而异
while True:
# 渲染到 buf1
render(fb1)
# 将 buf1 写入显示器的内存中,显示到屏幕上
# display.update(buf1) # 更新显示,具体操作可能因硬件平台而异
utime.sleep_ms(100) # 等待一段时间,以便观察显示效果
# 渲染到 buf2
render(fb2)
# 将 buf2 写入显示器的内存中,显示到屏幕上
# display.update(buf2) # 更新显示,具体操作可能因硬件平台而异
utime.sleep_ms(100) # 等待一段时间,以便观察显示效果
核心就是display.update这个接口很依赖硬件,IO也有延时。
2 GPU如何操作Framebuffer
我理解是共享内存,然后通过信号量或者其它来进行同步,后面有时间再看看吧。
3 OpenCV和Framebuffer的关系
两个的功能好像有点重叠。。。后面再看看这部分。
4 Framebuffer和显存的关系
Framebuffer是在内存之中,对投射到屏幕的点阵进行处理。那么和显存是什么关系呢?
-
在很多系统中,Framebuffer 和显存可以是同一个内存区域的不同部分,也就是说,Framebuffer 的数据可能直接位于显存中。(From GPT)
1432

被折叠的 条评论
为什么被折叠?



