核心优化策略
1. 分页缓冲机制 (Page Buffering)
传统方法:全帧缓冲 (1024字节 for 128x64)
优化方法:按页处理 (8页 × 128字节 = 1024字节 → 单页 128字节)
// 分页绘图函数
void draw_horizontal_line_page(uint8_t page, uint8_t start_x, uint8_t end_x) {
uint8_t buf[128];
read_page(page, buf); // 读取当前页
for(uint8_t x = start_x; x <= end_x; x++) {
buf[x] |= 0x01; // 设置最低位 (y0)
}
write_page(page, buf); // 写回修改
}
节省:RAM 从 1024字节 → 128字节 (减少 87.5%)
2. 直接显存操作 (Zero-Buffer)
适用场景:简单图形(直线、矩形)
原理:不读回显存,直接写入修改
void draw_vertical_line(uint8_t x, uint8_t start_page, uint8_t end_page) {
for(uint8_t page = start_page; page <= end_page; page++) {
set_cursor(x, page);
write_data(0xFF); // 整列点亮
}
}
优势:零缓冲区需求,Flash 占用减少 30%
3. 位运算图形绘制
高效绘制基础图形:
// 绘制矩形框 (无填充)
void draw_rect(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2) {
draw_h_line(y1/8, x1, x2, 1 << (y1%8)); // 上边
draw_h_line(y2/8, x1, x2, 1 << (y2%8)); // 下边
draw_v_line(x1, y1/8, y2/8, 1 << (y1%8)); // 左边
draw_v_line(x2, y1/8, y2/8, 1 << (y1%8)); // 右边
}
4. 精简算法实现
Bresenham 直线算法优化:
void draw_line(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1) {
int dx = abs(x1-x0), sx = x0<x1 ? 1 : -1;
int dy = -abs(y1-y0), sy = y0<y1 ? 1 : -1;
int err = dx+dy, e2; /* error value e_xy */
while(1) {
draw_pixel(x0, y0);
if (x0==x1 && y0==y1) break;
e2 = 2*err;
if (e2 >= dy) { err += dy; x0 += sx; } /* e_xy+e_x > 0 */
if (e2 <= dx) { err += dx; y0 += sy; } /* e_xy+e_y < 0 */
}
}
特点:纯整数运算,无浮点,代码精简 (约 200 字节)
|