Table Of Contents
Graphics compiler¶
Before rendering an InstructionGroup, we are compiling the group, in order to reduce the number of instructions executed at rendering time.
Reducing the context instructions¶
Imagine that you have a scheme like this:
Color(1, 1, 1)
Rectangle(source='button.png', pos=(0, 0), size=(20, 20))
Color(1, 1, 1)
Rectangle(source='button.png', pos=(10, 10), size=(20, 20))
Color(1, 1, 1)
Rectangle(source='button.png', pos=(10, 20), size=(20, 20))
The real instruction seen by the graphics canvas would be:
Color: change 'color' context to 1, 1, 1
BindTexture: change 'texture0' to `button.png texture`
Rectangle: push vertices (x1, y1...) to vbo & draw
Color: change 'color' context to 1, 1, 1
BindTexture: change 'texture0' to `button.png texture`
Rectangle: push vertices (x1, y1...) to vbo & draw
Color: change 'color' context to 1, 1, 1
BindTexture: change 'texture0' to `button.png texture`
Rectangle: push vertices (x1, y1...) to vbo & draw
Only the first Color and BindTexture are useful, and really change the context. We can reduce them to:
Color: change 'color' context to 1, 1, 1
BindTexture: change 'texture0' to `button.png texture`
Rectangle: push vertices (x1, y1...) to vbo & draw
Rectangle: push vertices (x1, y1...) to vbo & draw
Rectangle: push vertices (x1, y1...) to vbo & draw
This is what the compiler does in the first place, by flagging all the unused instruction with GI_IGNORE flag. As soon as a Color content change, the whole InstructionGroup will be recompiled, and maybe a previous unused Color will be used at the next compilation.
Note to any Kivy contributor / internal developer:
- All context instructions are checked if they are changing anything on the cache
- We must ensure that a context instruction are needed into our current Canvas.
- We must ensure that we don’t depend of any other canvas
- We must reset our cache if one of our children is another instruction group, because we don’t know if they are doing weird things or not.