feat(图像显示示例): 延迟纹理加载以避免RHIModule未初始化问题

将纹理加载逻辑移至渲染开始事件监听器中,确保在RHIModule和设备完全初始化后再加载纹理。这解决了在场景进入时立即加载纹理可能因渲染后端未就绪而失败的问题。

同时添加了事件监听器的生命周期管理,在场景退出时正确清理监听器。
This commit is contained in:
ChestnutYueyue 2026-03-16 21:34:23 +08:00
parent 31e856f397
commit 0e85edb518
1 changed files with 21 additions and 8 deletions

View File

@ -1,4 +1,5 @@
#include <cstdio>
#include <event/events.h>
#include <extra2d.h>
#include <renderer/rhi_module.h>
@ -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<Texture>("assets/test.png");
if (texture.isValid()) {
spriteRenderer_->setTexture(texture);
onRenderBeginListener_.reset();
}
}
void createCamera() {
auto cameraNode = makePtr<Node>();
cameraNode->setName("MainCamera");
@ -29,9 +47,6 @@ private:
}
void createImageSprite() {
auto assets = getAssets();
auto texture = assets->load<Texture>("assets/test.png");
auto spriteNode = makePtr<Node>();
spriteNode->setName("ImageSprite");
spriteNode->setPosition(640.0f, 360.0f);
@ -39,11 +54,9 @@ private:
spriteRenderer_ = makePtr<SpriteRenderer>();
spriteNode->addComponent(spriteRenderer_);
addChild(spriteNode);
if (texture.isValid()) {
spriteRenderer_->setTexture(texture);
}
}
Ptr<SpriteRenderer> spriteRenderer_;
events::OnRenderBegin::Listener onRenderBeginListener_;
};
int main(int argc, char **argv) {