Browse Source

Benchmark for MeshBuilder::subdivide() and cleanMesh().

Amazingly slow code.
vectorfields
Vladimír Vondruš 15 years ago
parent
commit
3b588e1950
  1. 1
      src/Test/CMakeLists.txt
  2. 116
      src/Test/MeshBuilderBenchmark.cpp
  3. 39
      src/Test/MeshBuilderBenchmark.h

1
src/Test/CMakeLists.txt

@ -2,3 +2,4 @@ magnum_add_test(ObjectTest ObjectTest.h ObjectTest.cpp Magnum)
magnum_add_test(CameraTest CameraTest.h CameraTest.cpp Magnum) magnum_add_test(CameraTest CameraTest.h CameraTest.cpp Magnum)
magnum_add_test(SceneTest SceneTest.h SceneTest.cpp Magnum) magnum_add_test(SceneTest SceneTest.h SceneTest.cpp Magnum)
magnum_add_test(MeshBuilderTest MeshBuilderTest.h MeshBuilderTest.cpp Magnum) magnum_add_test(MeshBuilderTest MeshBuilderTest.h MeshBuilderTest.cpp Magnum)
magnum_add_test(MeshBuilderBenchmark MeshBuilderBenchmark.h MeshBuilderBenchmark.cpp Magnum)

116
src/Test/MeshBuilderBenchmark.cpp

@ -0,0 +1,116 @@
/*
Copyright © 2010, 2011 Vladimír Vondruš <mosra@centrum.cz>
This file is part of Magnum.
Magnum is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License version 3
only, as published by the Free Software Foundation.
Magnum is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License version 3 for more details.
*/
#include "MeshBuilderBenchmark.h"
#include <QtTest/QTest>
#include "MeshBuilder.h"
#include "Magnum.h"
QTEST_APPLESS_MAIN(Magnum::Test::MeshBuilderBenchmark)
namespace Magnum { namespace Test {
/* Vertices = normals */
static const Vector4 icoVertices[] = {
Vector4(0, -0.525731f, 0.850651f),
Vector4(0.850651f, 0, 0.525731f),
Vector4(0.850651f, 0, -0.525731f),
Vector4(-0.850651f, 0, -0.525731f),
Vector4(-0.850651f, 0, 0.525731f),
Vector4(-0.525731f, 0.850651f, 0),
Vector4(0.525731f, 0.850651f, 0),
Vector4(0.525731f, -0.850651f, 0),
Vector4(-0.525731f, -0.850651f, 0),
Vector4(0, -0.525731f, -0.850651f),
Vector4(0, 0.525731f, -0.850651f),
Vector4(0, 0.525731f, 0.850651f),
};
/* Vertex indices */
static const GLubyte icoIndices[] = {
1, 2, 6,
1, 7, 2,
3, 4, 5,
4, 3, 8,
6, 5, 11,
5, 6, 10,
9, 10, 2,
10, 9, 3,
7, 8, 9,
8, 7, 0,
11, 0, 1,
0, 11, 4,
6, 2, 10,
1, 6, 11,
3, 5, 10,
5, 4, 11,
2, 7, 9,
7, 1, 0,
3, 9, 8,
4, 8, 0
};
void MeshBuilderBenchmark::subdivide() {
QBENCHMARK {
MeshBuilder<Vector4> builder;
builder.setData(icoVertices, icoIndices, 12, 60);
/* Subdivide 5 times */
builder.subdivide(interpolator);
builder.subdivide(interpolator);
builder.subdivide(interpolator);
builder.subdivide(interpolator);
builder.subdivide(interpolator);
}
}
void MeshBuilderBenchmark::subdivideAndCleanMeshAfter() {
QBENCHMARK {
MeshBuilder<Vector4> builder;
builder.setData(icoVertices, icoIndices, 12, 60);
/* Subdivide 5 times */
builder.subdivide(interpolator);
builder.subdivide(interpolator);
builder.subdivide(interpolator);
builder.subdivide(interpolator);
builder.subdivide(interpolator);
builder.cleanMesh();
}
}
void MeshBuilderBenchmark::subdivideAndCleanMeshBetween() {
QBENCHMARK {
MeshBuilder<Vector4> builder;
builder.setData(icoVertices, icoIndices, 12, 60);
/* Subdivide 5 times */
builder.subdivide(interpolator);
builder.cleanMesh();
builder.subdivide(interpolator);
builder.cleanMesh();
builder.subdivide(interpolator);
builder.cleanMesh();
builder.subdivide(interpolator);
builder.cleanMesh();
builder.subdivide(interpolator);
builder.cleanMesh();
}
}
}}

39
src/Test/MeshBuilderBenchmark.h

@ -0,0 +1,39 @@
#ifndef Magnum_Test_MeshBuilderBenchmark_h
#define Magnum_Test_MeshBuilderBenchmark_h
/*
Copyright © 2010, 2011 Vladimír Vondruš <mosra@centrum.cz>
This file is part of Magnum.
Magnum is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License version 3
only, as published by the Free Software Foundation.
Magnum is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License version 3 for more details.
*/
#include <QtCore/QObject>
#include "Magnum.h"
namespace Magnum { namespace Test {
class MeshBuilderBenchmark: public QObject {
Q_OBJECT
private slots:
void subdivide();
void subdivideAndCleanMeshAfter();
void subdivideAndCleanMeshBetween();
private:
static inline Magnum::Vector4 interpolator(const Magnum::Vector4& a, const Magnum::Vector4& b) {
return (a+b).xyz().normalized();
}
};
}}
#endif
Loading…
Cancel
Save