From 3612431e820f920aabd3c6cc79d1242818db5668 Mon Sep 17 00:00:00 2001 From: __hexmaster111 Date: Mon, 3 Mar 2025 16:04:07 -0600 Subject: [PATCH 1/5] [Raylib Render] Dont call malloc and Free every frame so much --- renderers/raylib/clay_renderer_raylib.c | 34 ++++++++++++++++++++----- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/renderers/raylib/clay_renderer_raylib.c b/renderers/raylib/clay_renderer_raylib.c index 19f667d..cc5af6d 100644 --- a/renderers/raylib/clay_renderer_raylib.c +++ b/renderers/raylib/clay_renderer_raylib.c @@ -122,6 +122,19 @@ void Clay_Raylib_Initialize(int width, int height, const char *title, unsigned i // EnableEventWaiting(); } +// A MALLOC'd buffer, that we keep modifying inorder to save from so many Malloc and Free Calls. +// Call Clay_Raylib_Close() to free +static char *temp_render_buffer = NULL; +static int temp_render_buffer_len = 0; + +// Call after closing the window to clean up the render buffer +void Clay_Raylib_Close() +{ + if(temp_render_buffer) free(temp_render_buffer); + temp_render_buffer_len = 0; +} + + void Clay_Raylib_Render(Clay_RenderCommandArray renderCommands, Font* fonts) { for (int j = 0; j < renderCommands.length; j++) @@ -131,14 +144,23 @@ void Clay_Raylib_Render(Clay_RenderCommandArray renderCommands, Font* fonts) switch (renderCommand->commandType) { case CLAY_RENDER_COMMAND_TYPE_TEXT: { - // Raylib uses standard C strings so isn't compatible with cheap slices, we need to clone the string to append null terminator Clay_TextRenderData *textData = &renderCommand->renderData.text; - char *cloned = (char *)malloc(textData->stringContents.length + 1); - memcpy(cloned, textData->stringContents.chars, textData->stringContents.length); - cloned[textData->stringContents.length] = '\0'; Font fontToUse = fonts[textData->fontId]; - DrawTextEx(fontToUse, cloned, (Vector2){boundingBox.x, boundingBox.y}, (float)textData->fontSize, (float)textData->letterSpacing, CLAY_COLOR_TO_RAYLIB_COLOR(textData->textColor)); - free(cloned); + + int strlen = textData->stringContents.length + 1; + + if(strlen > temp_render_buffer_len) { + // Grow the temp buffer if we need a larger string + if(temp_render_buffer) free(temp_render_buffer); + temp_render_buffer = malloc(strlen); + temp_render_buffer_len = strlen; + } + + // Raylib uses standard C strings so isn't compatible with cheap slices, we need to clone the string to append null terminator + memcpy(temp_render_buffer, textData->stringContents.chars, textData->stringContents.length); + temp_render_buffer[textData->stringContents.length] = '\0'; + DrawTextEx(fontToUse, temp_render_buffer, (Vector2){boundingBox.x, boundingBox.y}, (float)textData->fontSize, (float)textData->letterSpacing, CLAY_COLOR_TO_RAYLIB_COLOR(textData->textColor)); + break; } case CLAY_RENDER_COMMAND_TYPE_IMAGE: { From ad363f986c28d5ba58c650645f3e3e0bf12db1f2 Mon Sep 17 00:00:00 2001 From: __hexmaster111 Date: Mon, 3 Mar 2025 16:08:34 -0600 Subject: [PATCH 2/5] Added missing CloseWindow() call for raylib as well --- renderers/raylib/clay_renderer_raylib.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/renderers/raylib/clay_renderer_raylib.c b/renderers/raylib/clay_renderer_raylib.c index cc5af6d..35a4f15 100644 --- a/renderers/raylib/clay_renderer_raylib.c +++ b/renderers/raylib/clay_renderer_raylib.c @@ -132,6 +132,8 @@ void Clay_Raylib_Close() { if(temp_render_buffer) free(temp_render_buffer); temp_render_buffer_len = 0; + + CloseWindow(); } From c7703b7a50498b6db3067d3cf0dd066fd8b9f6ab Mon Sep 17 00:00:00 2001 From: __hexmaster111 Date: Tue, 4 Mar 2025 05:55:30 -0600 Subject: [PATCH 3/5] updated examples to call close --- examples/raylib-multi-context/main.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/raylib-multi-context/main.c b/examples/raylib-multi-context/main.c index b2163ba..dfbc1a3 100644 --- a/examples/raylib-multi-context/main.c +++ b/examples/raylib-multi-context/main.c @@ -72,4 +72,6 @@ int main(void) { Clay_Raylib_Render(renderCommandsBottom, fonts); EndDrawing(); } + + Clay_Raylib_Close(); } From c49593f1d3e87a67491a8ea088dc8b6e4797743f Mon Sep 17 00:00:00 2001 From: __hexmaster111 Date: Tue, 4 Mar 2025 05:56:20 -0600 Subject: [PATCH 4/5] Update main.c --- examples/raylib-sidebar-scrolling-container/main.c | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/raylib-sidebar-scrolling-container/main.c b/examples/raylib-sidebar-scrolling-container/main.c index 4ea1cb7..21f30c5 100644 --- a/examples/raylib-sidebar-scrolling-container/main.c +++ b/examples/raylib-sidebar-scrolling-container/main.c @@ -250,5 +250,6 @@ int main(void) { } UpdateDrawFrame(fonts); } + Clay_Raylib_Close(); return 0; } From cf9753961261bd44cc173ff1396cbe5697f95912 Mon Sep 17 00:00:00 2001 From: __hexmaster111 Date: Tue, 4 Mar 2025 05:57:30 -0600 Subject: [PATCH 5/5] Update main.c --- examples/introducing-clay-video-demo/main.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/introducing-clay-video-demo/main.c b/examples/introducing-clay-video-demo/main.c index 5456ebc..89dd50f 100644 --- a/examples/introducing-clay-video-demo/main.c +++ b/examples/introducing-clay-video-demo/main.c @@ -50,4 +50,6 @@ int main(void) { Clay_Raylib_Render(renderCommands, fonts); EndDrawing(); } + // This function is new since the video was published + Clay_Raylib_Close(); }