For one thing, make sure you create your fonts only once. Do not create them each time you draw a frame, which by the way I'm unclear about. A frame could mean several things. Be a little specific, show some code and it will help to determine where your problem is. Creating a font each time you draw something is the biggest performance hit. Using GetOneLineWidth can also be a performance hit on the low-end devices. If done properly, a keyboard is a simple structure that should have no performance problems on any device. Predefine as much of your static data as possible and keep it in an array or AA. X,Y coordinates etc. For example, the letter A will always be at a static x, y coordinate offset from the cell that it occupies since you probably will be centering it. You should not have to l_x = int( cellWidth/2 - font.GetOneLineWidth( "A", cellWidth ) / 2 ), l_y = int( cellHeight/2 - font.GetOneLineHeight() / 2 ) each time you draw A into the cell. Iterate your letters and numbers in a loop and pre-calculate and store their offsets. When your selector comes to that cell then you just have to pull the predefined offsets out of the array.
Certainly putting any number of things in what you call a frame can slow it down.
My Channels: 2D API Framework Presentation: https://owner.roku.com/add/2M9LCVC
Updated: 11-11-2015 - Completed Keyboard interface
The Joel Channel ( Final Beta )