From 0e85edb518d9814053fc2407e818292b4a20c044 Mon Sep 17 00:00:00 2001 From: ChestnutYueyue <952134128@qq.com> Date: Mon, 16 Mar 2026 21:34:23 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E5=9B=BE=E5=83=8F=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E7=A4=BA=E4=BE=8B):=20=E5=BB=B6=E8=BF=9F=E7=BA=B9=E7=90=86?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD=E4=BB=A5=E9=81=BF=E5=85=8DRHIModule=E6=9C=AA?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将纹理加载逻辑移至渲染开始事件监听器中,确保在RHIModule和设备完全初始化后再加载纹理。这解决了在场景进入时立即加载纹理可能因渲染后端未就绪而失败的问题。 同时添加了事件监听器的生命周期管理,在场景退出时正确清理监听器。 --- examples/image_display_demo/main.cpp | 29 ++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/examples/image_display_demo/main.cpp b/examples/image_display_demo/main.cpp index f01fed2..9438d54 100644 --- a/examples/image_display_demo/main.cpp +++ b/examples/image_display_demo/main.cpp @@ -1,4 +1,5 @@ #include +#include #include #include @@ -10,13 +11,30 @@ public: Scene::onEnter(); createCamera(); createImageSprite(); + onRenderBeginListener_.bind([this]() { trySetupTexture(); }); } - void update(float dt) override { - Scene::update(dt); + void onExit() override { + onRenderBeginListener_.reset(); + Scene::onExit(); } private: + void trySetupTexture() { + auto *rhiModule = RHIModule::get(); + if (!rhiModule || !rhiModule->getDevice()) { + return; + } + auto assets = getAssets(); + if (!assets || !spriteRenderer_) { + return; + } + auto texture = assets->load("assets/test.png"); + if (texture.isValid()) { + spriteRenderer_->setTexture(texture); + onRenderBeginListener_.reset(); + } + } void createCamera() { auto cameraNode = makePtr(); cameraNode->setName("MainCamera"); @@ -29,9 +47,6 @@ private: } void createImageSprite() { - auto assets = getAssets(); - auto texture = assets->load("assets/test.png"); - auto spriteNode = makePtr(); spriteNode->setName("ImageSprite"); spriteNode->setPosition(640.0f, 360.0f); @@ -39,11 +54,9 @@ private: spriteRenderer_ = makePtr(); spriteNode->addComponent(spriteRenderer_); addChild(spriteNode); - if (texture.isValid()) { - spriteRenderer_->setTexture(texture); - } } Ptr spriteRenderer_; + events::OnRenderBegin::Listener onRenderBeginListener_; }; int main(int argc, char **argv) {