核心优化策略
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 字节)
|