diff options
Diffstat (limited to 'tests/box2d/Benchmark.cpp')
-rw-r--r-- | tests/box2d/Benchmark.cpp | 79 |
1 files changed, 62 insertions, 17 deletions
diff --git a/tests/box2d/Benchmark.cpp b/tests/box2d/Benchmark.cpp index 0db1d4be..6c9b3c5b 100644 --- a/tests/box2d/Benchmark.cpp +++ b/tests/box2d/Benchmark.cpp @@ -25,6 +25,10 @@ typedef struct { #include <time.h> #include <math.h> +#ifdef __EMSCRIPTEN__ +#include <emscripten.h> +#endif + #include "Box2D/Box2D.h" using namespace std; @@ -52,6 +56,14 @@ result_t measure(clock_t *times) { return r; } +b2World *world; +clock_t *times, minn = CLOCKS_PER_SEC * 1000 * 100, maxx = -1; +b2Body* topBody; +int32 frameCounter = 0; +int responsive_main_loop; + +void iter(); + int main(int argc, char **argv) { int arg = argc > 1 ? argv[1][0] - '0' : 3; switch(arg) { @@ -64,24 +76,28 @@ int main(int argc, char **argv) { default: printf("error: %d\\n", arg); return -1; } + // do not split out warmup, do not ignore initial stalls + FRAMES += WARMUP; + WARMUP = 0; + + times = new clock_t[FRAMES]; + // Define the gravity vector. b2Vec2 gravity(0.0f, -10.0f); // Construct a world object, which will hold and simulate the rigid bodies. - b2World world(gravity); - world.SetAllowSleeping(false); + world = new b2World(gravity); + world->SetAllowSleeping(false); { b2BodyDef bd; - b2Body* ground = world.CreateBody(&bd); + b2Body* ground = world->CreateBody(&bd); b2EdgeShape shape; shape.Set(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f)); ground->CreateFixture(&shape, 0.0f); } - b2Body* topBody; - { float32 a = 0.5f; b2PolygonShape shape; @@ -99,7 +115,7 @@ int main(int argc, char **argv) { b2BodyDef bd; bd.type = b2_dynamicBody; bd.position = y; - b2Body* body = world.CreateBody(&bd); + b2Body* body = world->CreateBody(&bd); body->CreateFixture(&shape, 5.0f); topBody = body; @@ -112,25 +128,54 @@ int main(int argc, char **argv) { } for (int32 i = 0; i < WARMUP; ++i) { - world.Step(1.0f/60.0f, 3, 3); + world->Step(1.0f/60.0f, 3, 3); + } + +#ifdef __EMSCRIPTEN__ + responsive_main_loop = argc > 2 ? argv[2][0] - '0' : 0; + if (responsive_main_loop) { + printf("responsive main loop\n"); + emscripten_set_main_loop(iter, 60, 1); + } else { +#endif + do { + iter(); + } while (frameCounter <= FRAMES); +#ifdef __EMSCRIPTEN__ } +#endif - clock_t times[FRAMES]; - for (int32 i = 0; i < FRAMES; ++i) { - clock_t start = clock(); - world.Step(1.0f/60.0f, 3, 3); - clock_t end = clock(); - times[i] = end - start; + return 0; +} + +void iter() { + if (frameCounter < FRAMES) { + clock_t start = clock(); + world->Step(1.0f/60.0f, 3, 3); + clock_t end = clock(); + clock_t curr = end - start; + times[frameCounter] = curr; + if (curr < minn) minn = curr; + if (curr > maxx) maxx = curr; #if DEBUG printf("%f :: ", topBody->GetPosition().y); - printf("%f\n", (float32)(end - start) / CLOCKS_PER_SEC * 1000); + printf("%f\n", (float32)(end - start) / CLOCKS_PER_SEC * 1000); #endif - } + frameCounter++; + return; + } + + // that's it! + + frameCounter++; result_t result = measure(times); - printf("frame averages: %.3f +- %.3f\n", result.mean, result.stddev); + printf("frame averages: %.3f +- %.3f, range: %.3f to %.3f \n", result.mean, result.stddev, float(minn)/CLOCKS_PER_SEC * 1000, float(maxx)/CLOCKS_PER_SEC * 1000); - return 0; +#ifdef __EMSCRIPTEN__ + emscripten_run_script("if (Module.reportCompletion) Module.reportCompletion()"); + if (responsive_main_loop) emscripten_cancel_main_loop(); +#endif } |