SDL:无法翻转多个表面

时间:2011-12-29 18:35:39

标签: c sdl graphics2d

如果我只翻转单个表面(我从SDL_SetVideoMode回来的同一个表面),我一直试图翻转表面并取得成功。如果我试图翻转表面,我会从SDL_DisplayFormat回来,没有任何反应。我附上演示代码来演示我的问题:

#include <stdio.h>
#include <stdlib.h>
#include "SDL/SDL.h"

void main()
{
    int i;
    SDL_Surface *mysurface1;
    SDL_Surface *mysurface2;
    char *pxl;

    SDL_Init( SDL_INIT_EVERYTHING );

    mysurface1 = SDL_SetVideoMode( 640, 480, 8, SDL_DOUBLEBUF|SDL_HWSURFACE );

    for (i = 0; i < 20; i++)
    {
            pxl = (char *)mysurface1->pixels + i*mysurface1->pitch + i;
            *pxl = 100; // Red Line
    }

    SDL_Flip(mysurface1); // Works, we see a red line

    sleep(5);
    printf("Sleeping for 5...\n");

    mysurface2 = SDL_DisplayFormat(mysurface1);

    for (i = 0; i < 20; i++)
    {
            pxl = (char *)mysurface2->pixels + i*mysurface2->pitch + i;
            *pxl = 255; // White line
    }

    SDL_Flip(mysurface2); // White line doesnt appear

    printf("Done... No white line\n");

    sleep(10);
}

有没有人见过这个?再一次,我想我将它跟踪到了表面,如果它是从SDL_DisplayFormat回来的表面,它将无法显示。如果我在表面上这样做,我会从SDL_SetVideoMode回来,然后我看到红线,一切正常。

3 个答案:

答案 0 :(得分:0)

您只能翻转主显示屏表面(使用SDL_SetVideoMode创建的表面)。为了使您的其他表面可见,您需要将其blit到主表面上。有关如何执行此操作的详细信息,请查找SDL_BlitSurface

答案 1 :(得分:0)

将屏幕传递给SDL_Flip功能。翻转函数修改screen->pixels的值,使其指向屏幕上不可见的曲面。

但是,这仅适用于SVGA和DGA等视频设备。在X11上,调用SDL_Flip(screen)相当于调用SDL_UpdateRect(screen, 0, 0, 0, 0)

#include <stdio.h>
#include <stdlib.h>
#include "SDL/SDL.h"

void main()
{
    int i;
    SDL_Surface *screen;
    char *pxl;

    SDL_Init( SDL_INIT_EVERYTHING );
    screen = SDL_SetVideoMode( 640, 480, 8, SDL_DOUBLEBUF|SDL_HWSURFACE );

    printf("Drawing the red line ...\n");
    printf("screen->pixels = %p\n", screen->pixels);
    for (i = 0; i < 100; i++)
    {
        pxl = (char *)screen->pixels + i*screen->pitch + i;
        *pxl = 100; // Red Line
    }

    printf("Flip screens\n");
    SDL_Flip(screen); // Display the red line

    printf("Drawing the white line ...\n");
    printf("screen->pixels = %p\n", screen->pixels);
    for (i = 0; i < 100; i++)
    {
        pxl = (char *)screen->pixels + i*screen->pitch + i;
        *pxl = 255; // White line
    }

    sleep(3);
    printf("Flip screens\n");
    SDL_Flip(screen); // Display the white line

    sleep(10);
}

在我的Linux笔记本上,打印出来:

Drawing the red line ...
screen->pixels = 0xb6c8c008
Flip screens
Drawing the white line ...
screen->pixels = 0xb6c8c008
Flip screens

screen->pixels的值是相同的,但这只是因为在X11上,翻转操作是无操作。在SVGA或DGA等视频设备上,这两个值会有所不同。

答案 2 :(得分:0)

首先,似乎SDL_Flip()仅适用于与屏幕或窗口对应的曲面,例如SDL_SetVideoMode()创建的曲面。你的另一面是离屏的;双缓冲它(或翻转它)没有多大意义,并且它很可能不是双缓冲的。作为屏幕外表面,只有在使用SDL_BlitSurface()或类似功能将其显示到显示屏表面后才会显示 - 然后,下次翻转显示屏时,更改将会显示。

基本上,mysurface2实际上并不在你的显示器上,直到你把它放在那里,通过将它显示在显示器上 的表面上。如果您替换以下内容:

SDL_Flip(mysurface2); // White line doesnt appear

有了这个:

SDL_BlitSurface(mysurface2,NULL,mysurface1,NULL);
SDL_Flip(mysurface1);

...那么您的代码可能会按预期工作。