Skip to content

SDL_Renderer改变引起的SDL_Texture失效问题 #3

Open
@Kiritow

Description

@Kiritow

测试代码如下

#include <iostream>
using namespace std;

#include "MiniEngine.h"
#include "MiniEngine_Widget.h"
using namespace MiniEngine;

int AppMain()
{
    Window wnd("Title",1280,768);
    Renderer rnd=wnd.getRenderer();
    Texture t=rnd.loadTexture("1.png");
    Texture b=rnd.loadTexture("2.png");
    rnd.clear();
    rnd.copyFullFill(t);
    rnd.update();
    while(1)
    {
        SDL_Event e;
        SDL_WaitEvent(&e);
        if(e.type==SDL_MOUSEBUTTONDOWN) break;
    }
    cout<<"Changed"<<endl;
    wnd.setRenderer(RendererType::Accelerated);
    Renderer nrnd=wnd.getRenderer();
    cout<<rnd.isReady()<<" "<<nrnd.isReady()<<endl;

    nrnd.clear();
    nrnd.update();
    ErrorViewer ss;
    ss.fetch();
    cout<<ss.what()<<endl;
    while(1)
    {
        SDL_Event e;
        SDL_WaitEvent(&e);
        if(e.type==SDL_MOUSEBUTTONDOWN) break;
    }
    nrnd.clear();
    nrnd.copyFullFill(b);
    nrnd.update();
    ss.fetch();
    cout<<ss.what()<<endl;
    cout<<"Printed"<<endl;
    while(1)
    {
        SDL_Event e;
        SDL_WaitEvent(&e);
        if(e.type==SDL_MOUSEBUTTONDOWN) break;
    }

    return 0;
}

根据当前情况,nrnd的建立会导致rnd的失效,此时rnd渲染的t和b都处于无效状态(Invalid Texture).
解决这个问题可以将Texture中的指针改为weak_ptr,并将真正的Texture放入Window类中. 但是这样的话又不能在Texture超出作用域的时候自动释放(因为都保存在Window里了),这样很有可能引起内存暴涨...

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions