diff --git a/packages/flutter/example/game/test_performance.dart b/packages/flutter/example/game/test_performance.dart index bdc25b6be06..4d379d6ca7d 100644 --- a/packages/flutter/example/game/test_performance.dart +++ b/packages/flutter/example/game/test_performance.dart @@ -56,7 +56,7 @@ class TestApp extends App { class TestPerformance extends NodeWithSize { final int numFramesPerTest = 100; - final int numTests = 3; + final int numTests = 5; TestPerformance() : super(new Size(1024.0, 1024.0)) { } @@ -73,7 +73,7 @@ class TestPerformance extends NodeWithSize { int totalTestTime = currentTime - testStartTime; double millisPerFrame = totalTestTime.toDouble() / numFramesPerTest.toDouble(); - print("TEST ${test - 1} fps: ${1.0 / (millisPerFrame / 1000)}"); + print(" - RESULT fps: ${(1.0 / (millisPerFrame / 1000)).toStringAsFixed(1)} millis/frame: ${millisPerFrame.round()}"); // Clear test removeAllChildren(); @@ -81,8 +81,11 @@ class TestPerformance extends NodeWithSize { if (test < numTests) { // Start new test - print("TEST $test STARTING"); - setupTest(test); + PerformanceTest perfTest = createTest(test); + addChild(perfTest); + + print("TEST ${test + 1}/$numTests STARTING: ${perfTest.name}"); + testStartTime = new DateTime.now().millisecondsSinceEpoch; } test++; @@ -90,21 +93,34 @@ class TestPerformance extends NodeWithSize { frame++; } - void setupTest(int n) { + PerformanceTest createTest(int n) { if (test == 0) { // Test atlas performance - addChild(new TestPerformanceAtlas()); + return new TestPerformanceAtlas(); } else if (test == 1) { - // Test sprite performance - addChild(new TestPerformanceSprites()); + // Test atlas performance + return new TestPerformanceAtlas2(); } else if (test == 2) { + // Test sprite performance + return new TestPerformanceSprites(); + } else if (test == 3) { + // Test sprite performance + return new TestPerformanceSprites2(); + } else if (test == 4) { // Test particle performance - addChild(new TestPerformanceParticles()); + return new TestPerformanceParticles(); } + return null; } } -class TestPerformanceParticles extends Node { +abstract class PerformanceTest extends Node { + String get name; +} + +class TestPerformanceParticles extends PerformanceTest { + String get name => "64 particle systems"; + final grid = 8; TestPerformanceParticles() { for (int x = 0; x < grid; x++) { @@ -130,7 +146,9 @@ class TestPerformanceParticles extends Node { } } -class TestPerformanceSprites extends Node { +class TestPerformanceSprites extends PerformanceTest { + String get name => "1001 sprites (24% offscreen)"; + final int grid = 100; TestPerformanceSprites() { @@ -157,7 +175,38 @@ class TestPerformanceSprites extends Node { } } -class TestPerformanceAtlas extends Node { +class TestPerformanceSprites2 extends PerformanceTest { + String get name => "1001 sprites (24% offscreen never added)"; + + final int grid = 100; + + TestPerformanceSprites2() { + for (int x = 12; x < grid - 12; x++) { + for (int y = 0; y < grid; y++) { + Sprite sprt = new Sprite(_spriteSheet["asteroid_big_1.png"]); + sprt.scale = 1.0; + sprt.position = new Point(x * 1024.0 / (grid - 1), y * 1024.0 / (grid - 1)); + addChild(sprt); + + //sprt.actions.run(new ActionRepeatForever(new ActionTween((a) => sprt.rotation = a, 0.0, 360.0, 1.0))); + } + } + + Sprite sprt = new Sprite(_spriteSheet["asteroid_big_1.png"]); + sprt.position = new Point(512.0, 512.0); + addChild(sprt); + } + + void update(double dt) { + for (Sprite sprt in children) { + sprt.rotation += 1; + } + } +} + +class TestPerformanceAtlas extends PerformanceTest { + String get name => "1001 rects drawAtlas (24% offscreen)"; + final int grid = 100; double rotation = 0.0; @@ -207,3 +256,56 @@ class TestPerformanceAtlas extends Node { return new sky.RSTransform(scos, ssin, tx, ty); } } + +class TestPerformanceAtlas2 extends PerformanceTest { + String get name => "1001 rects drawAtlas (24% offscreen never added)"; + + final int grid = 100; + + double rotation = 0.0; + List rects = []; + Paint cachedPaint = new Paint() + ..setFilterQuality(sky.FilterQuality.low) + ..isAntiAlias = false; + + TestPerformanceAtlas2() { + for (int x = 12; x < grid - 12; x++) { + for (int y = 0; y < grid; y++) { + rects.add(_spriteSheet["asteroid_big_1.png"].frame); + } + } + rects.add(_spriteSheet["asteroid_big_1.png"].frame); + } + + void paint(PaintingCanvas canvas) { + // Setup transforms + List transforms = []; + + for (int x = 12; x < grid - 12; x++) { + for (int y = 0; y < grid; y++) { + double xPos = x * 1024.0 / (grid - 1); + double yPos = y * 1024.0 / (grid - 1); + + transforms.add(createTransform(xPos, yPos, rects[0].size.width / 2.0, rects[0].size.height / 2.0, rotation, 1.0)); + } + } + + transforms.add(createTransform(512.0, 512.0, rects[0].size.width / 2.0, rects[0].size.height / 2.0, rotation, 1.0)); + + // Draw atlas + Rect cullRect = spriteBox.visibleArea; + canvas.drawAtlas(_spriteSheet.image, transforms, rects, null, null, cullRect, cachedPaint); + } + + void update(double dt) { + rotation += 1.0; + } + + sky.RSTransform createTransform(double x, double y, double ax, double ay, double rot, double scale) { + double scos = math.cos(convertDegrees2Radians(rot)) * scale; + double ssin = math.sin(convertDegrees2Radians(rot)) * scale; + double tx = x + -scos * ax + ssin * ay; + double ty = y + -ssin * ax - scos * ay; + return new sky.RSTransform(scos, ssin, tx, ty); + } +}