如果我只翻转单个表面(我从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
回来,然后我看到红线,一切正常。
答案 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);
...那么您的代码可能会按预期工作。