feat(图像显示示例): 延迟纹理加载以避免RHIModule未初始化问题
将纹理加载逻辑移至渲染开始事件监听器中,确保在RHIModule和设备完全初始化后再加载纹理。这解决了在场景进入时立即加载纹理可能因渲染后端未就绪而失败的问题。 同时添加了事件监听器的生命周期管理,在场景退出时正确清理监听器。
This commit is contained in:
parent
31e856f397
commit
0e85edb518
|
|
@ -1,4 +1,5 @@
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
|
#include <event/events.h>
|
||||||
#include <extra2d.h>
|
#include <extra2d.h>
|
||||||
#include <renderer/rhi_module.h>
|
#include <renderer/rhi_module.h>
|
||||||
|
|
||||||
|
|
@ -10,13 +11,30 @@ public:
|
||||||
Scene::onEnter();
|
Scene::onEnter();
|
||||||
createCamera();
|
createCamera();
|
||||||
createImageSprite();
|
createImageSprite();
|
||||||
|
onRenderBeginListener_.bind([this]() { trySetupTexture(); });
|
||||||
}
|
}
|
||||||
|
|
||||||
void update(float dt) override {
|
void onExit() override {
|
||||||
Scene::update(dt);
|
onRenderBeginListener_.reset();
|
||||||
|
Scene::onExit();
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
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() {
|
void createCamera() {
|
||||||
auto cameraNode = makePtr<Node>();
|
auto cameraNode = makePtr<Node>();
|
||||||
cameraNode->setName("MainCamera");
|
cameraNode->setName("MainCamera");
|
||||||
|
|
@ -29,9 +47,6 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
void createImageSprite() {
|
void createImageSprite() {
|
||||||
auto assets = getAssets();
|
|
||||||
auto texture = assets->load<Texture>("assets/test.png");
|
|
||||||
|
|
||||||
auto spriteNode = makePtr<Node>();
|
auto spriteNode = makePtr<Node>();
|
||||||
spriteNode->setName("ImageSprite");
|
spriteNode->setName("ImageSprite");
|
||||||
spriteNode->setPosition(640.0f, 360.0f);
|
spriteNode->setPosition(640.0f, 360.0f);
|
||||||
|
|
@ -39,11 +54,9 @@ private:
|
||||||
spriteRenderer_ = makePtr<SpriteRenderer>();
|
spriteRenderer_ = makePtr<SpriteRenderer>();
|
||||||
spriteNode->addComponent(spriteRenderer_);
|
spriteNode->addComponent(spriteRenderer_);
|
||||||
addChild(spriteNode);
|
addChild(spriteNode);
|
||||||
if (texture.isValid()) {
|
|
||||||
spriteRenderer_->setTexture(texture);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Ptr<SpriteRenderer> spriteRenderer_;
|
Ptr<SpriteRenderer> spriteRenderer_;
|
||||||
|
events::OnRenderBegin::Listener onRenderBeginListener_;
|
||||||
};
|
};
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue