diff options
-rw-r--r-- | platform/android/src/map_renderer.cpp | 27 | ||||
-rw-r--r-- | platform/android/src/map_renderer.hpp | 10 |
2 files changed, 28 insertions, 9 deletions
diff --git a/platform/android/src/map_renderer.cpp b/platform/android/src/map_renderer.cpp index f5336e3dd8..3ebbdb7e5e 100644 --- a/platform/android/src/map_renderer.cpp +++ b/platform/android/src/map_renderer.cpp @@ -17,10 +17,21 @@ MapRenderer::MapRenderer(jni::JNIEnv& _env, const jni::Object<MapRenderer>& obj, jni::jfloat pixelRatio_, const jni::String& localIdeographFontFamily_) - : javaPeer(_env, obj) - , pixelRatio(pixelRatio_) - , localIdeographFontFamily(localIdeographFontFamily_ ? jni::Make<std::string>(_env, localIdeographFontFamily_) : optional<std::string>{}) - , mailbox(std::make_shared<Mailbox>(*this)) { + : javaPeer(_env, obj), + pixelRatio(pixelRatio_), + localIdeographFontFamily(localIdeographFontFamily_ ? jni::Make<std::string>(_env, localIdeographFontFamily_) + : optional<std::string>{}), + mailboxData(this) {} + +MapRenderer::MailboxData::MailboxData(Scheduler* scheduler_) : scheduler(scheduler_) { + assert(scheduler); +} + +std::shared_ptr<Mailbox> MapRenderer::MailboxData::getMailbox() const noexcept { + if (!mailbox) { + mailbox = std::make_shared<Mailbox>(*scheduler); + } + return mailbox; } MapRenderer::~MapRenderer() = default; @@ -30,7 +41,7 @@ void MapRenderer::reset() { if (renderer) { // Make sure to destroy the renderer on the GL Thread - auto self = ActorRef<MapRenderer>(*this, mailbox); + auto self = ActorRef<MapRenderer>(*this, mailboxData.getMailbox()); self.ask(&MapRenderer::resetRenderer).wait(); } @@ -93,7 +104,7 @@ void MapRenderer::setObserver(std::shared_ptr<RendererObserver> _rendererObserve } void MapRenderer::requestSnapshot(SnapshotCallback callback) { - auto self = ActorRef<MapRenderer>(*this, mailbox); + auto self = ActorRef<MapRenderer>(*this, mailboxData.getMailbox()); self.invoke( &MapRenderer::scheduleSnapshot, std::make_unique<SnapshotCallback>([&, callback=std::move(callback), runloop=util::RunLoop::Get()](PremultipliedImage image) { @@ -172,7 +183,7 @@ void MapRenderer::onSurfaceCreated(JNIEnv&) { // Create the new backend and renderer backend = std::make_unique<AndroidRendererBackend>(); renderer = std::make_unique<Renderer>(*backend, pixelRatio, localIdeographFontFamily); - rendererRef = std::make_unique<ActorRef<Renderer>>(*renderer, mailbox); + rendererRef = std::make_unique<ActorRef<Renderer>>(*renderer, mailboxData.getMailbox()); // Set the observer on the new Renderer implementation if (rendererObserver) { @@ -193,7 +204,7 @@ void MapRenderer::onSurfaceChanged(JNIEnv& env, jint width, jint height) { void MapRenderer::onRendererReset(JNIEnv&) { // Make sure to destroy the renderer on the GL Thread - auto self = ActorRef<MapRenderer>(*this, mailbox); + auto self = ActorRef<MapRenderer>(*this, mailboxData.getMailbox()); self.ask(&MapRenderer::resetRenderer).wait(); } diff --git a/platform/android/src/map_renderer.hpp b/platform/android/src/map_renderer.hpp index 047f1870c7..e37d37cfc8 100644 --- a/platform/android/src/map_renderer.hpp +++ b/platform/android/src/map_renderer.hpp @@ -82,6 +82,14 @@ protected: void scheduleSnapshot(std::unique_ptr<SnapshotCallback>); private: + struct MailboxData { + explicit MailboxData(Scheduler*); + std::shared_ptr<Mailbox> getMailbox() const noexcept; + + private: + Scheduler* scheduler; + mutable std::shared_ptr<Mailbox> mailbox; + }; // Called from the GL Thread // // Resets the renderer @@ -107,7 +115,7 @@ private: optional<std::string> localIdeographFontFamily; std::shared_ptr<ThreadPool> threadPool; - std::shared_ptr<Mailbox> mailbox; + const MailboxData mailboxData; std::mutex initialisationMutex; std::shared_ptr<RendererObserver> rendererObserver; |