@@ -56,25 +56,30 @@ public KeyboardWidget(Screen screen, int x, int y, int width, int height, KeyPre
56
56
57
57
@ Override
58
58
protected void renderWidget (GuiGraphics guiGraphics , int mouseX , int mouseY , float partialTick ) {
59
- Blit .drawSpecial (guiGraphics , bufferSource -> {
59
+ for (T key : keys ) {
60
+ // vanilla widget render does other stuff like mouse hover update etc
61
+ // render method of keys are empty - this doesn't actually do any rendering
62
+ key .render (guiGraphics , mouseX , mouseY , partialTick );
63
+ }
64
+
65
+ // draw in a managed context so we can batch render calls
66
+ // everything within here is rendered in a single draw call
67
+ Blit .drawManaged (guiGraphics , bufferSource -> {
60
68
guiGraphics .fill (getX (), getY (), getX () + getWidth (), getY () + getHeight (), 0x80000000 );
61
69
guiGraphics .renderOutline (getX (), getY (), getWidth (), getHeight (), 0xFFAAAAAA );
62
70
63
- for (T key : keys ) {
64
- // doesn't do any actual rendering
65
- key .render (guiGraphics , mouseX , mouseY , partialTick );
66
- }
67
-
68
71
ControlifyVertexConsumer vertexConsumer = ControlifyVertexConsumer .of (
69
72
bufferSource .getBuffer (ExtraRenderTypes .guiTextured (Key .SPRITE .atlas ()))
70
73
);
71
-
72
74
for (T key : keys ) {
75
+ // every key background is rendered into the same vertex buffer to upload at once
73
76
Matrix4f pose = guiGraphics .pose ().last ().pose ();
74
77
key .renderKeyBackground (vertexConsumer , pose , mouseX , mouseY , partialTick );
75
78
}
76
79
80
+ // renders all foreground after background to prevent context switching
77
81
for (T key : keys ) {
82
+ // text rendering is batched by default in managed mode
78
83
key .renderKeyForeground (guiGraphics , mouseX , mouseY , partialTick );
79
84
}
80
85
});
0 commit comments