Just curious.SSD1306_puts uses I2C to communicate with the display. The I2C is bit bang and so uses __delay_us for the timing.
Do you update a offscreen frame buffer used for rendering then push that buffer via I2C later or is a all done sequentially in one function with SSD1306_puts?