/apps/examples/circle-raster: benchmarking and int32_t variant

This commit is contained in:
veclavtalica 2025-01-25 00:53:28 +03:00
parent 37cd8cf2cf
commit 597168c282

View File

@ -13,6 +13,53 @@
for (float x = p_center_x - ceilf(sqrtf(p_radius * p_radius - (y - p_center_y + (y <= p_center_y)) * (y - p_center_y + (y <= p_center_y)))); x < p_center_x + ceilf(sqrtf(p_radius * p_radius - (y - p_center_y + (y <= p_center_y)) * (y - p_center_y + (y <= p_center_y)))); ++x) for (float x = p_center_x - ceilf(sqrtf(p_radius * p_radius - (y - p_center_y + (y <= p_center_y)) * (y - p_center_y + (y <= p_center_y)))); x < p_center_x + ceilf(sqrtf(p_radius * p_radius - (y - p_center_y + (y <= p_center_y)) * (y - p_center_y + (y <= p_center_y)))); ++x)
static int32_t ceil_sqrt(int32_t const n) {
int32_t res = 1;
#pragma clang loop unroll_count(8)
while(res * res < n)
res++;
return res;
}
static void benchmark(struct state *state) {
volatile float x, y;
profile_start("float");
for (int i = 0; i < 1000; ++i) {
float const rs = state->r * state->r;
float const cr = ceilf(state->r);
for (float iy = -cr; iy <= cr - 1; ++iy) {
float const dx = ceilf(sqrtf(rs - (iy + (iy <= 0)) * (iy + (iy <= 0))));
for (float ix = -dx; ix < dx; ++ix) {
x = ix;
y = iy;
}
}
}
profile_end("float");
profile_start("int32_t");
for (int i = 0; i < 1000; ++i) {
int32_t const rsi = (int32_t)state->r * (int32_t)state->r;
for (int32_t iy = -(int32_t)state->r; iy <= (int32_t)state->r - 1; ++iy) {
int32_t const dx = ceil_sqrt(rsi - (iy + (iy <= 0)) * (iy + (iy <= 0)));
for (int32_t ix = -dx; ix < dx; ++ix) {
x = (float)ix;
y = (float)iy;
}
}
}
profile_end("int32_t");
(void)x; (void)y;
}
void game_tick(void) { void game_tick(void) {
if (ctx.initialization_needed) { if (ctx.initialization_needed) {
if (!ctx.udata) { if (!ctx.udata) {
@ -34,16 +81,17 @@ void game_tick(void) {
if (input_action_just_pressed("down")) if (input_action_just_pressed("down"))
state->r -= 1; state->r -= 1;
float const rs = state->r * state->r; int32_t const rsi = (int32_t)state->r * (int32_t)state->r;
float const cr = ceilf(state->r); for (int32_t iy = -(int32_t)state->r; iy <= (int32_t)state->r - 1; ++iy) {
for (float iy = cr - 1; iy > -cr - 1; --iy) { int32_t const dx = ceil_sqrt(rsi - (iy + (iy <= 0)) * (iy + (iy <= 0)));
float const dx = ceilf(sqrtf(rs - (iy + (iy <= 0)) * (iy + (iy <= 0)))); for (int32_t ix = -dx; ix < dx; ++ix) {
for (float ix = -dx; ix < dx; ++ix) { draw_box((Rect){mouse_snap.x + (float)ix * 8, mouse_snap.y + (float)iy * 8, 8, 8}, 1, (Color){125, 125, 0, 255});
draw_box((Rect){mouse_snap.x + ix * 8, mouse_snap.y + iy * 8, 8, 8}, 1, (Color){255, 0, 0, 125});
} }
} }
draw_circle(mouse_snap, state->r * 8, (Color){125, 125, 125, 125}); draw_circle(mouse_snap, state->r * 8, (Color){125, 125, 125, 125});
benchmark(state);
} }