|
发表于 2007-11-14 15:33:25
|
显示全部楼层
lock surface
Post by jetking;1782108
线程里不lock screen,只lock overlay。
最主要是要装显卡驱动,不装的话,用xorg的默认的,cpu会在80~90%,而且查看进程,占cpu最多的,不是你的程序,而是xorg。
按照上面的做法,线程里lock overlay。创建2个线程,在线程里分别创建overlay,lock,copy,unlock。
2个线程单独显示没问题。2个线程一起显示时,当第二个线程显示时,会把第一个线程显示的区域刷黑。就是说每次显示一个小区域,却会把整个screen都刷黑。这样的话假如16个线程同时显示就会在整个screen上看起来不停的闪。
代码:
#include <SDL/SDL.h>
#include <SDL/SDL_getenv.h>
#include <SDL/SDL_thread.h>
#include <stdio.h>
#include <memory.h>
typedef unsigned char BYTE;
#define WIDTH 800
#define HEIGHT 600
#define BUFLEN WIDTH*HEIGHT*2
SDL_Surface *screen;
BYTE buf[BUFLEN];
////////////////////////////////////////////////////////////
// thread1
//////////////////////////////////////////////////////////////
int thread1( void* data )
{
int arg = *(int*)data;
printf( "arg: %d\n", arg );
SDL_Overlay *yuv_overlay = SDL_CreateYUVOverlay(WIDTH/2,
HEIGHT/2,
SDL_YUY2_OVERLAY,
screen);
if (yuv_overlay == NULL ) {
fprintf(stderr,
"SDL: Couldn't create SDL_yuv_overlay: %s\n",
SDL_GetError());
return 0;
}
#if 0
/* Unlock SDL_yuv_overlay */
if (SDL_MUSTLOCK(screen2)) {
SDL_UnlockSurface(screen2);
}
#endif
if (SDL_LockYUVOverlay(yuv_overlay) < 0)
return;
//copy data to overlay
//memcpy( yuv_overlay->pixels[0], buf, BUFLEN/4 );
if ( 1 == arg ){
memset( yuv_overlay->pixels[0], 255, BUFLEN/4 );
}else if( 2 == arg ){
memset( yuv_overlay->pixels[0], 0, BUFLEN/4 );
}
#if 0
/* Unlock SDL_yuv_overlay */
if (SDL_MUSTLOCK(screen)) {
SDL_UnlockSurface(screen);
}
#endif
SDL_UnlockYUVOverlay(yuv_overlay);
SDL_Rect rect;
if ( 1 == arg ){
rect.x = 0;
rect.y = 0;
rect.w = WIDTH/2;
rect.h = HEIGHT/2;
}else if ( 2 == arg ){
rect.x = WIDTH/2;
rect.y = 0;
rect.w = WIDTH/2;
rect.h = HEIGHT/2;
}
SDL_DisplayYUVOverlay(yuv_overlay, &rect);
SDL_Delay( 3000 );
return 1;
}
////////////////////////////////////////////////////////////
// main
//////////////////////////////////////////////////////////////
int main()
{
memset( buf, 255, BUFLEN );
//SDL_Thread t1,t2;
Uint32 t1,t2;
printf( "sdl begin\n" );
SDL_Init(SDL_INIT_VIDEO);
atexit(SDL_Quit);
putenv( "SDL_VIDEO_WINDOW_POS = 0,0" );
screen = SDL_SetVideoMode(WIDTH, HEIGHT, 0,
SDL_HWSURFACE);
int arg;
arg = 1;
t1 = SDL_CreateThread( thread1, (void*)&arg );
SDL_Delay(1000);
int arg2 = 2;
t2 = SDL_CreateThread( thread1, (void*)&arg2 );
int status;
SDL_WaitThread( t1, &status );
SDL_WaitThread( t2, &status );
return 0;
} |
|