Hallo,
ich nutze die ug8lib zur Ausgabe auf ein 128x64 Oled mit software-spi. 
Momentan muss ich auch bei der soft-spi bleiben. Die Displayausgabe im 
vorgeschlagenen picture loop dauert bei mir ca. 250 - 300 ms.
in der Doku vorgeschlagener Picture Loop:
| 1 | u8g_FirstPage(&u8g);
 | 
| 2 |       do
 | 
| 3 |       {
 | 
| 4 |         draw();
 | 
| 5 |       } while ( u8g_NextPage(&u8g);
 | 
Um den picture loop zeitlich etwas zu entzerren, würde ich den 
Framebuffer gerne verteilt schreiben und zwischenzeitlich in meine 
Hauptschleife zurückkehren.
In etwa so:
| 1 | for(;;)
 | 
| 2 | {
 | 
| 3 | 
 | 
| 4 | //...mache etwas anderes
 | 
| 5 | 
 | 
| 6 | if (lcd_update == 1){           //aufruf jede Sekunde
 | 
| 7 |     lcd_update = 2;
 | 
| 8 |     u8g_FirstPage(&u8g);
 | 
| 9 |     draw_static();              //schreiben des statischen Anteils  
 | 
| 10 |    }
 | 
| 11 |    else if (lcd_update == 2){
 | 
| 12 |    lcd_update = 0;
 | 
| 13 |    draw_dynamic();              //schreiben des dynamischen Anteils
 | 
| 14 |    }
 | 
| 15 | 
 | 
| 16 | 
 | 
| 17 | 
 | 
| 18 | }
 | 
Kurz vorweg:
So wie ich die Doku der lib verstehe, wird beim ersten Aufruf der obere 
Teil des Displays geschrieben und im zweiten Aufruf der untere. Ich 
zähle in meiner do Schleife allerdings 3 Aufrufe bis u8g_NextPage(&u8g) 
"false" wird.
Nun die Frage, wie ich meine draw() Funktionen am günstigsten aufteile? 
oben-unten oder dynamisch-statisch?
Am angenehmsten wäre mir dynamisch-statisch, da sich der dynamische Teil 
in meiner Hauptschleife permanent ändert und mir ohne vorherigen 
framebuffer-reset (u8g_FirstPage(&u8g);) Pixelgewirr entsteht.