Browse Source

feat: perf monitor

master
anjingyu 1 year ago
parent
commit
f7beac41b0
5 changed files with 23 additions and 15 deletions
  1. +1
    -1
      sww/include/sww/color.h
  2. +9
    -8
      sww/source/perf_monitor.c
  3. +2
    -2
      sww/source/perf_monitor.h
  4. +3
    -2
      sww/source/renderer/software_renderer.c
  5. +8
    -2
      sww/test/shapes.c

+ 1
- 1
sww/include/sww/color.h View File

@@ -53,7 +53,7 @@ enum {
kViolet = Color_RGB(140, 0, 255), // Violet

kBlack = Color_RGB(0, 0, 0), // Black
kWhite = Color_RGB(255, 255, 255), // Black
kWhite = Color_RGB(255, 255, 255), // White
};

/* r = c1 * (1 - c2.alpha) + c2 * c2.alpha */


+ 9
- 8
sww/source/perf_monitor.c View File

@@ -9,9 +9,9 @@ swwPerfMonitor *swwPerfMonitor_CreateWithCount(uint32_t value_count) {
swwPerfMonitor *o = (swwPerfMonitor *)malloc(sizeof(swwPerfMonitor) +
sizeof(float) * value_count);
o->cursor = 0;
o->count = 0;
o->count = 1;
o->capacity = value_count;
o->average_value = 0.f;
o->sum = 0.000001f;
memset(o->values, 0, sizeof(float) * value_count);

return o;
@@ -21,16 +21,18 @@ void swwPerfMonitor_Destroy(swwPerfMonitor *o) { free(o); }

void swwPerfMonitor_Update(swwPerfMonitor *o, float frame_time) {
float prev = 0.f;
if (o->count <= o->capacity) {
o->count++;
} else {
prev = o->values[o->cursor];
if (o->count == o->capacity) {
prev = o->values[(o->cursor + 1) % o->capacity];
}

o->cursor = (o->cursor + 1) % o->capacity;
o->values[o->cursor] = frame_time;

o->average_value += (frame_time - prev) / o->count;
o->sum += frame_time - prev;

if (o->count < o->capacity) {
o->count++;
}
}

void swwPerfMonitor_Render(swwPerfMonitor *o, swwRenderer *renderer, Point2i c,
@@ -62,5 +64,4 @@ void swwPerfMonitor_Render(swwPerfMonitor *o, swwRenderer *renderer, Point2i c,
(Point2i){minx + w, MAX(maxy - pv, miny)}, kFgColor);
}
}
// printf("idx: %d, w: %d\n", idx, minx + w);
}

+ 2
- 2
sww/source/perf_monitor.h View File

@@ -12,7 +12,7 @@ typedef struct {
uint32_t cursor;
uint32_t capacity;
uint32_t count;
float average_value;
float sum;
float values[0];
} swwPerfMonitor;

@@ -21,7 +21,7 @@ void swwPerfMonitor_Destroy(swwPerfMonitor *o);
void swwPerfMonitor_Update(swwPerfMonitor *o, float frame_time);

#define swwPerfMonitor_Create() swwPerfMonitor_CreateWithCount(30)
#define swwPerfMonitor_GetAverage(o) (o)->average_value
#define swwPerfMonitor_GetAverage(o) ((o)->sum / (o)->count)

/* Draw the PerfMonitor as a layer on the canvas */
void swwPerfMonitor_Render(swwPerfMonitor *o, swwRenderer *renderer,


+ 3
- 2
sww/source/renderer/software_renderer.c View File

@@ -151,6 +151,7 @@ void DrawVLineClip(swwRenderer *o_, int32_t x, int32_t by, int32_t ey,
uint8_t *p;

uint32_t idx = 4 * (width * y + x);
uint32_t offset = 4 * width;
if (Color_HasAlpha(color)) { // do alpha-blend
uint32_t c;
for (; y <= ey; y++) {
@@ -160,7 +161,7 @@ void DrawVLineClip(swwRenderer *o_, int32_t x, int32_t by, int32_t ey,
p[1] = (uint8_t)(c >> 8) & 0xff;
p[2] = (uint8_t)(c >> 16) & 0xff;
p[3] = (uint8_t)(c >> 24) & 0xff;
idx += width;
idx += offset;
}
} else {
for (; y <= ey; y++) {
@@ -169,7 +170,7 @@ void DrawVLineClip(swwRenderer *o_, int32_t x, int32_t by, int32_t ey,
p[1] = (uint8_t)(color >> 8) & 0xff;
p[2] = (uint8_t)(color >> 16) & 0xff;
p[3] = (uint8_t)(color >> 24) & 0xff;
idx += width;
idx += offset;
}
}
}


+ 8
- 2
sww/test/shapes.c View File

@@ -98,7 +98,7 @@ int main() {
while (!swwApp_ShouldExit()) {
if (ud.need_render) {
swwRenderer_ClearBlack(ud.renderer);
i = (i + 1) % 7;
i = (i + 1) % 8;
switch (i) {
case 0: {
swwRenderer_DrawEllipse(ud.renderer, (Point2i){cw, ch}, 100, 200,
@@ -124,7 +124,13 @@ int main() {
(Sizei){200, 36}, kOrange + Color_Alpha(0x80),
1);
} break;
case 6:
case 6: {
swwRenderer_DrawLine(ud.renderer, (Point2i){120, 20},
(Point2i){120, 200}, kViolet);
swwRenderer_DrawLine(ud.renderer, (Point2i){20, 120},
(Point2i){200, 120}, kOrange);
} break;
case 7:
default: {
swwRenderer_DrawArc(ud.renderer, (Point2i){cw, ch}, 150, 30.f, 90.f,
Color_RGB(0x00, 0x00, 0xff), 0);


Loading…
Cancel
Save