[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [linux] test DirectFB
Salut,
On Mon, 10 Sep 2001 21:45:54 +0200, Olivier Vanhoucke <o.vanhoucke@wanadoo.fr> wrote:
>
> DIRECTFB, c'est un remplacant de XFree (si j'ai bien compris)...
c'es une bibliothèque graphique permettant d'exploiter le framebuffer sans trop se casser la tête, qui offre des fenêtres avec transparences et un système d'evenements clavier/souris/joystick, affichage d'images png ou jpg ou gif, de video avi mpg, de films flash en utilisant libswf, etc... les defauts de la programmation du framebuffer evoqués par pablo trouvent leur solutions avec cette lib. pour certaines architectures, le framebuffer est la seule possibilité d'affichage à l'ecran.
DirectFB n'est donc pas un remplaçant de X, mais un port de gtk étant prevu cela devrait être suffisant pour faire tourner un grand nombre d'applis, c'est interressant pour des bornes, des systèmes embarqués, des jeux, tout les progs qui utilisent svgalib ... il me semble.
cela peut être interressant pour des applis necessitant des temps de latence du système minimaux
> Un article de LOGIN dit que ca tourne tres bien...mais est ce que qlqu'un d'entre vous l'a essaye ?
> Vos conclusions (avantage - inconveniant)
j'ai testé la version 0.9.5:
This is a developers release of DirectFB.
DirectFB is a graphics library which was designed with embedded systems
in mind. It offers maximum hardware accelerated performance at a minimum
of resource usage and overhead.
Check http://www.directfb.org/ for more and uptodate infos.
ce n'est pas assez vieux je dirais. c'est encore en beta, le principal defaut est que seule les matrox G200 et G400 sont accelerées, les aty128 un peu aussi (mais buggé) et sinon il faut utiliser le driver vesafb -> c'est lent.
il faut avoir les libs freetype 2.0.1, libpng2, libjpeg62, zlib
et un kernel 2.4 avec le framebufffer activé (mais je l'utilise avec un 2.2.19 et ça marche)
et une matrox ou une aty128... mais j'arrive à l'utiliser avec une aty64 (Xpert play98 8mb)
je n'ai pas pu essayer les video (pas eu le temps et à priori sur ma config ça marchera pas) ni les films flash (j'ai pas libswf) ni le joystick (j'en ai pas) mais pour le reste ça marche nickel, c'est facile à compiler et facile à utiliser. le c
j'utilise déjà X avec le framebuffer aty128 (ma carte est une mach64-je sais c'est pas logique mais ça marche) et quand je lance un prog DirectFB lorsque X tourne, DFB utilise aussi le driver aty128, et j'ai l'acceleration... mais les couleurs sont trashées :( l'attente du sync pour le doublebuffer ne fonctionne plus non plus alors.
par contre si X n'est pas lancé, ça utilise le driver vesafb, et c'est (relativement) lent mais ça fonctionne bien, les couleurs, la fluidité sont nickel. je ne sais pas encore forcer le chargement de tel ou tel driver, mais je crois que ce n'est pas possible d'en charger plusieurs differents en //
étant donné les bidouilles de cartes etc dans mon cas, j'imagine qu'avec une matrox ça marche mieux...
si tu as déjà utilisé par exemple gd avec perl ou php je dirais que l'api est du même niveau de complexité.
je joint une modif d'un des codes sources du tutorial que j'ai faite comme exemple, ça affiche un tux et on peut le deplacer avec les touches du clavier, comme dans un jeu de plateformes.
a+
--
rno
[ Soyez précis dans vos sujets svp afin de déterminer directement ]
[ le type de demande... ]
[ Pour vous (dés)inscrire, aller sur http://unixtech.be/ml.php ]
[ Archives de la mailing list: http://archives.unixtech.be/linux/ ]
[ http://unixtech.be Contact: listmaster@unixtech.be ]
/*
* modif du tutorial DirectFB - rno@etoiles.net
*/
// Moving a sprite with the cursor keys (without input buffer)
#include <stdio.h>
#include <unistd.h>
#include <directfb.h>
// (Globals)
static IDirectFB *dfb = NULL;
static IDirectFBSurface *primary = NULL;
static IDirectFBSurface *tux = NULL;
static int screen_width = 0;
static int screen_height = 0;
#define S_LEFT 0
#define S_RIGHT 1
#define DFBCHECK(x...) \
{ \
DFBResult err = x; \
\
if (err != DFB_OK) { \
fprintf( stderr, "%s <%d>:\n\t", __FILE__, __LINE__ ); \
DirectFBErrorFatal( #x, err ); \
} \
}
// Our interface to the keyboard.
static IDirectFBInputDevice *keyboard = NULL;
int main (int argc, char **argv)
{
/*
* (Locals)
*/
DFBSurfaceDescription dsc;
IDirectFBImageProvider *provider;
// To quit the application when escape is pressed we store the key state here.
DFBInputDeviceKeyState escape = DIKS_UP;
int s_pos_x, s_pos_y, max_x, max_y;
int s_accel = 10;
int s_jumping =0;
int s_vel_x=8;
int s_vel_y=0;
int dir;
// (Initialize)
DFBCHECK (DirectFBInit (&argc, &argv));
DFBCHECK (DirectFBCreate (&dfb));
DFBCHECK (dfb->SetCooperativeLevel (dfb, DFSCL_FULLSCREEN));
dsc.flags = DSDESC_CAPS;
dsc.caps = DSCAPS_PRIMARY | DSCAPS_FLIPPING;
DFBCHECK (dfb->CreateSurface( dfb, &dsc, &primary ));
DFBCHECK (primary->GetSize (primary, &screen_width, &screen_height));
// Retrieve an interface to the keyboard so we can query key states.
// DIDID_KEYBOARD is the device id of the primary keyboard.
DFBCHECK (dfb->GetInputDevice (dfb, DIDID_KEYBOARD, &keyboard));
// (Load the sprite)
DFBCHECK (dfb->CreateImageProvider (dfb, "tux.png", &provider));
DFBCHECK (provider->GetSurfaceDescription (provider, &dsc));
DFBCHECK (dfb->CreateSurface( dfb, &dsc, &tux ));
DFBCHECK (provider->RenderTo (provider, tux));
provider->Release (provider);
max_x = screen_width - dsc.width;
max_y = screen_height - dsc.height;
s_pos_x = (screen_width - dsc.width) >> 2;
s_pos_y = (screen_height - dsc.height) >> 2;
// Loop through until the escape key is pressed.
while (escape == DIKS_UP) {
// Local variable for key state queries.
DFBInputDeviceKeyState state;
// Clear the screen.
DFBCHECK (primary->FillRectangle (primary, 0, 0, screen_width, screen_height));
// Blit the sprite at its current position.
DFBCHECK (primary->Blit (primary, tux, NULL, s_pos_x, s_pos_y));
// Flip the front and back buffer, but wait for the vertical retrace to avoid tearing.
DFBCHECK (primary->Flip (primary, NULL, DSFLIP_WAITFORSYNC));
// Query state of cursor keys and eventually move the sprite.
DFBCHECK (keyboard->GetKeyState (keyboard, DIKC_LEFT, &state));
if (state == DIKS_DOWN) {
s_vel_x=32;
dir=S_LEFT;
}
DFBCHECK (keyboard->GetKeyState (keyboard, DIKC_RIGHT, &state));
if (state == DIKS_DOWN) {
s_vel_x=32;
dir=S_RIGHT;
}
DFBCHECK (keyboard->GetKeyState (keyboard, DIKC_UP, &state));
if (state == DIKS_DOWN && s_jumping == 0) {
s_vel_y=100;
s_jumping=1;
}
if (s_jumping==1) {
if (s_vel_y>-100) {
s_vel_y=s_vel_y-s_accel;
s_pos_y=s_pos_y-s_vel_y;
}
}
if (s_vel_x>0) {
s_vel_x=s_vel_x-s_accel;
if (dir==S_LEFT)
s_pos_x=s_pos_x-s_vel_x;
if (dir==S_RIGHT)
s_pos_x=s_pos_x+s_vel_x;
}
// Now make sure we didn't move the sprite out of the screen.
if (s_pos_x < 0)
s_pos_x = 0;
else if (s_pos_x > max_x)
s_pos_x = max_x;
if (s_pos_y < 0)
s_pos_y = 0;
else if (s_pos_y > max_y) {
s_pos_y = max_y;
s_vel_y=0;
s_jumping=0;
}
// Query state of escape key.
DFBCHECK (keyboard->GetKeyState (keyboard, DIKC_ESCAPE, &escape));
}
// Release the keyboard.
keyboard->Release (keyboard);
// (Release)
tux->Release (tux);
primary->Release (primary);
dfb->Release (dfb);
return 23;
}