diff options
author | Loïc Blot <nerzhul@users.noreply.github.com> | 2020-04-16 08:25:48 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-16 08:25:48 +0200 |
commit | e8ac5a31cf12afcfddf8e3ed31e8038930edb06f (patch) | |
tree | 5bdc776c5bbe190e32e42899b455e6d16179e3b5 /src/unittest | |
parent | 62ae7adab2bebde04864c12543caefbffab24963 (diff) | |
download | minetest-e8ac5a31cf12afcfddf8e3ed31e8038930edb06f.tar.gz minetest-e8ac5a31cf12afcfddf8e3ed31e8038930edb06f.tar.bz2 minetest-e8ac5a31cf12afcfddf8e3ed31e8038930edb06f.zip |
Optimize get_objects_inside_radius calls (#9671)
* Optimize getObjectsInsideRadius calls
our previous implementation calls the ActiveObjectMgr to return ids and then lookup those ids in the same map and test each object
Instead now we call the global map to return the pointers directly and we ask filtering when building the list using lamba.
This drop double looping over ranges of active objects (and then filtered one) and drop x lookups on the map regarding the first call results
Diffstat (limited to 'src/unittest')
-rw-r--r-- | src/unittest/test_serveractiveobjectmgr.cpp | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/src/unittest/test_serveractiveobjectmgr.cpp b/src/unittest/test_serveractiveobjectmgr.cpp index 0806972ab..aa0047400 100644 --- a/src/unittest/test_serveractiveobjectmgr.cpp +++ b/src/unittest/test_serveractiveobjectmgr.cpp @@ -148,14 +148,26 @@ void TestServerActiveObjectMgr::testGetObjectsInsideRadius() saomgr.registerObject(new TestServerActiveObject(p)); } - std::vector<u16> result; - saomgr.getObjectsInsideRadius(v3f(), 50, result); + std::vector<ServerActiveObject *> result; + saomgr.getObjectsInsideRadius(v3f(), 50, result, nullptr); UASSERTCMP(int, ==, result.size(), 1); result.clear(); - saomgr.getObjectsInsideRadius(v3f(), 750, result); + saomgr.getObjectsInsideRadius(v3f(), 750, result, nullptr); UASSERTCMP(int, ==, result.size(), 2); + result.clear(); + saomgr.getObjectsInsideRadius(v3f(), 750000, result, nullptr); + UASSERTCMP(int, ==, result.size(), 5); + + result.clear(); + auto include_obj_cb = [](ServerActiveObject *obj) { + return (obj->getBasePosition().X != 10); + }; + + saomgr.getObjectsInsideRadius(v3f(), 750000, result, include_obj_cb); + UASSERTCMP(int, ==, result.size(), 4); + clearSAOMgr(&saomgr); } |