summaryrefslogtreecommitdiffhomepage
path: root/bench
diff options
context:
space:
mode:
Diffstat (limited to 'bench')
-rw-r--r--bench/raycast.cpp90
1 files changed, 54 insertions, 36 deletions
diff --git a/bench/raycast.cpp b/bench/raycast.cpp
index 79b4ff9d..7f66f920 100644
--- a/bench/raycast.cpp
+++ b/bench/raycast.cpp
@@ -27,66 +27,84 @@ world make_world()
w[global_coords{{0, 1, 0}, { 8, 11}}].t.wall_west() = wall2;
w[global_coords{{0, 1, 0}, { 8, 10}}].t.wall_west() = wall2;
w[global_coords{{0, 1, 0}, { 7, 10}}].t.wall_north() = wall2;
+ w[global_coords{{0, 1, 0}, { 6, 10}}].t.wall_north() = wall2;
- w[global_coords{{0, 1, 0}, { 8, 8}}].t.wall_north() = wall1;
+ w[global_coords{{0, 1, 0}, { 9, 8}}].t.wall_north() = wall1;
w[global_coords{{0, 1, 0}, {10, 8}}].t.wall_north() = wall1;
- w[global_coords{{0, 1, 0}, {12, 8}}].t.wall_west() = wall1;
+ w[global_coords{{0, 1, 0}, {11, 8}}].t.wall_west() = wall1;
w[global_coords{{0, 2, 0}, { 9, 0}}].t.wall_north() = wall1;
w[global_coords{{0, 2, 0}, {10, 0}}].t.wall_north() = wall1;
- for (int16_t i = -10; i <= 10; i++)
- for (int16_t j = -10; j <= 10; j++)
+ for (int16_t k = -5; k <= -1; k++)
+ {
+ auto& ch = w[chunk_coords_{-5, -5, 0}];
+ for (unsigned i = 0; i < TILE_MAX_DIM; i++)
+ {
+ ch[{(uint8_t)i, 0}].wall_west() = wall1;
+ ch[{(uint8_t)i, 1}].wall_north() = wall1;
+ ch[{(uint8_t)i, 2}].wall_north() = wall2;
+ ch[{(uint8_t)i, 2}].wall_west() = wall2;
+ }
+ }
+
+ for (int16_t i = -15; i <= 15; i++)
+ for (int16_t j = -15; j <= 15; j++)
w[{{i, j}, 0}].mark_modified();
return w;
}
-[[maybe_unused]] void Raycast(benchmark::State& state)
+auto run(point from, point to, world& w, bool b, float len)
{
- constexpr auto run1 = [](world& w, point to, bool b, float len = 0)
+ constexpr float fuzz = iTILE_SIZE2.x();
+ auto diag = rc::raycast_diag_s{};
+ auto res = raycast_with_diag(diag, w, from, to, 0);
+ if (res.success != b)
+ {
+ fm_error("success != %s", b ? "true" : "false");
+ return false;
+ }
+ if (len != 0.f)
{
- constexpr auto from = point{{0, 0, 0}, {11,12}, {1,-32}};
- constexpr float fuzz = iTILE_SIZE2.x();
- auto diag = rc::raycast_diag_s{};
- auto res = raycast_with_diag(diag, w, from, to, 0);
- if (res.success != b)
+ auto tmin = res.success ? diag.V.length() : diag.tmin;
+ auto diff = Math::abs(tmin - len);
+ if (diff > fuzz)
{
- fm_error("success != %s", b ? "true" : "false");
+ fm_error("|tmin=%f - len=%f| > %f",
+ (double)tmin, (double)len, (double)fuzz);
return false;
}
- if (len > 0)
- {
- auto tmin = res.success ? diag.V.length() : diag.tmin;
- fm_assert(len > 1e-6f);
- auto diff = Math::abs(tmin - len);
- if (diff > fuzz)
- {
- fm_error("|tmin=%f - len=%f| > %f",
- (double)tmin, (double)len, (double)fuzz);
- return false;
- }
- }
- return true;
- };
+ }
+ return true;
+}
+[[maybe_unused]] void Raycast(benchmark::State& state)
+{
auto w = make_world();
- const auto run = [&] {
- fm_assert(run1(w, point{{ 1, 3, 0}, { 0, 1}, {-21, 23}}, false, 2288));
- fm_assert(run1(w, point{{ 1, 3, 0}, { 8, 10}, {- 9, -13}}, true, 3075));
- fm_assert(run1(w, point{{ 0, 3, 0}, {14, 4}, { 3, 15}}, true, 2614));
- fm_assert(run1(w, point{{ 0, 1, 0}, { 8, 12}, {-27, -19}}, false, 752));
- //fm_assert(run1(w, point{{ 0, 1, 0}, { 7, 11}, {- 8, -21}}, false, 908));
- fm_assert(run1(w, point{{ 2, 33, 0}, {15, 11}, {- 4, 29}}, true, 33809));
+ const auto test = [&] {
+ { constexpr auto from = point{{0, 0, 0}, {11,12}, {1,-32}};
+ fm_assert(run(from, point{{ 1, 3, 0}, { 0, 1}, {-21, 23}}, w, false, 2288));
+ fm_assert(run(from, point{{ 1, 3, 0}, { 8, 10}, {- 9, -13}}, w, true, 3075));
+ fm_assert(run(from, point{{ 0, 3, 0}, {14, 4}, { 3, 15}}, w, true, 2614));
+ fm_assert(run(from, point{{ 0, 1, 0}, { 8, 12}, {-27, -19}}, w, false, 752));
+ fm_assert(run(from, point{{ 2, 33, 0}, {15, 11}, {- 4, 29}}, w, true, 33809));
+ fm_assert(run(from, point{{ 0, 1, 0}, { 6, 13}, {- 3, -11}}, w, false, 913));
+ }
+ { fm_assert(run( point{{ 0, 0, 0}, { 1, 0}, {-17, 17}},
+ point{{ 0, - 7, 0}, { 1, 15}, {-11, 5}}, w, true, 6220));
+ }
};
- run();
+ for (int i = 0; i < 50; i++)
+ test();
for (auto _ : state)
- run();
+ for (int i = 0; i < 1000; i++)
+ test();
}
-BENCHMARK(Raycast)->Unit(benchmark::kMicrosecond);
+BENCHMARK(Raycast)->Unit(benchmark::kMillisecond);
} // namespace