SDL_CreateRGBSurfaceFrom / SDL_BlitSurface-我在模拟器上看到旧帧

时间:2018-12-14 18:29:55

标签: c++ emulation sdl-2 intel-8080

我正在研究Space Invaders模拟器,为了显示输出,我正在使用SDL2。

问题是自仿真开始以来,在输出窗口中我看到了所有帧!

基本上重要的代码是这样的:

Intel8080 mainObject; // My Intel 8080 CPU emulator
mainObject.loadROM();

//Main loop flag
bool quit = false;

//Event handler
SDL_Event e;

//While application is running
while (!quit)
{
    //Handle events on queue
    while (SDL_PollEvent(&e) != 0)
    {
        //User requests quit
        if (e.type == SDL_QUIT)
        {
            quit = true;
        }
    }

    if (mainObject.frameReady)
    {
        mainObject.frameReady = false;

        gHelloWorld = SDL_CreateRGBSurfaceFrom(&mainObject.frameBuffer32, 256, 224, 32, 4 * 256, 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff);

        //Apply the image
        SDL_BlitSurface(gHelloWorld, NULL, gScreenSurface, NULL);

        //Update the surface
        SDL_UpdateWindowSurface(gWindow);
    }

    mainObject.executeROM();
}

其中Intel8080是我的CPU仿真器代码,mainObject.frameBuffer32是“太空侵略者”的视频RAM,为了使用SDL_CreateRGBSurfaceFrom函数,我将其从1bpp转换为32bpp。

仿真工作正常,但是我看到了自模拟器启动以来生成的所有帧!

我试图在每个RGBA像素的4个字节中更改Alpha值,但没有任何变化

1 个答案:

答案 0 :(得分:0)

之所以发生这种情况,是因为看起来您在渲染游戏时没有先清除窗口。基本上,您应该用一种颜色填充整个窗口,然后不断在其上进行渲染。这个想法是,在渲染窗口之前用特定的颜色填充窗口等同于擦除前一帧(大多数现代计算机都具有足够的能力来处理此问题)。

您可能想阅读SDL的SDL_FillRect函数,它可以让您用特定的颜色填充整个屏幕。

渲染伪代码:

while(someCondition)
{
    [...]

    // Note, I'm not sure if "gScreenSurface" is the proper variable to use here.
    // I got it from reading your code.
    SDL_FillRect(gScreenSurface, NULL, SDL_MapRGB(gScreenSurface->format, 0, 0, 0));

    SDL_BlitSurface(gHelloWorld, NULL, gScreenSurface, NULL);

    SDL_UpdateWindowSurface(gWindow);

    [...]
}