.[ ČeskéHry.cz ].
xlib - překreslování okna

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Obecné
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
frca



Založen: 28. 07. 2007
Příspěvky: 1552

PříspěvekZaslal: 8. duben 2011, 15:58:53    Předmět: xlib - překreslování okna Odpovědět s citátem

Je někde nějaký příklad něčeho, co například vykresluje náhodný šum do okna (ve 24-bitové hloubce) nebo něco takového? Jde mi o tu nejrychlejší metodu, kterou xlib poskytuje (nebo aspoň nějakou z těch rychlejších). Double-buffering není nutný.
Díky,
frca
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
frca



Založen: 28. 07. 2007
Příspěvky: 1552

PříspěvekZaslal: 8. duben 2011, 19:50:53    Předmět: Odpovědět s citátem

Už jsem na to přišel, tak se s váma podělím:
kód:
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xatom.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
unsigned long   flags;
unsigned long   functions;
unsigned long   decorations;
long            inputMode;
unsigned long   status;
} Hints;

int main(void) {
    Display *d;
    Window w;
    XEvent e;
    int s,i;
    XSizeHints* hints;
    XImage* image;
    GC gc;
    int width = 400;
    int height = 300;
    /* open connection with the server */
    d = XOpenDisplay(NULL);
    if (d == NULL) {
        fprintf(stderr, "Cannot open display\n");
        exit(1);
    }
    s = DefaultScreen(d);
    /* create window */
    w = XCreateSimpleWindow(d, RootWindow(d, s), 10, 10, 200, 200, 1,
    BlackPixel(d, s), WhitePixel(d, s));

    hints = XAllocSizeHints();
    hints->flags = PMinSize|PMaxSize;
    hints->min_width = width;
    hints->min_height = height;
    hints->max_width = width;
    hints->max_height = height;
    XSetWMSizeHints(d, w, hints, XA_WM_NORMAL_HINTS);

    /* select kind of events we are interested in */
    XSelectInput(d, w, ExposureMask | KeyPressMask);
   
    Atom wmDeleteMessage = XInternAtom(d, "WM_DELETE_WINDOW", False);
    XSetWMProtocols(d, w, &wmDeleteMessage, 1);
   
    gc = DefaultGC(d, DefaultScreen(d));
   
    image = XCreateImage(d, NULL, 24, ZPixmap, 0, NULL, width, height, 32, 0);
    image->data = (char *) malloc (image->bytes_per_line * height);
    XInitImage(image);
    /* map (show) the window */
    XMapWindow(d, w);
    /* event loop */
    while (1) {
        while(XPending(d)) {
            XNextEvent(d, &e);
            if (e.type == Expose) {
            }
            if (e.type == KeyPress) {
            }
            if (e.type == ClientMessage && e.xclient.data.l[0] == wmDeleteMessage) {
                goto close;
            }
        }
        for (i = 0; i != image->bytes_per_line * height; ++i) {
            image->data[i] = rand() % 255;
        }
        XPutImage(d,w, gc,image, 0,0, 0, 0, width, height);
    }
    close:
    XCloseDisplay(d);
    free(image->data);
    return 0;
}


Samozřejmě pokud tam někdo uvidí chybu nebo má nápad, jak to zrychlit, napište to sem.

Edit: Ten náhodný generátor je divný, teď to vidím, dosaďte si tam libovolný jiný Wink
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Vilem Otte



Založen: 18. 09. 2007
Příspěvky: 462
Bydliště: Znojmo - Sedlesovice, Kravi Hora

PříspěvekZaslal: 9. duben 2011, 20:38:42    Předmět: Odpovědět s citátem

Jenom mě tak napadá, proč nepoužít na výstup OpenGL?
_________________
Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky
frca



Založen: 28. 07. 2007
Příspěvky: 1552

PříspěvekZaslal: 9. duben 2011, 21:25:14    Předmět: Odpovědět s citátem

Když někdy nechci 3D grafiku, tak mi OpenGL připadá zbytečné.
Kdyby někdo měl ekvivalentní kód pro widle, sem s ním. Obávám se ale, že tam to bude o trochu složitější.
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 9. duben 2011, 22:03:48    Předmět: Odpovědět s citátem

Použití xlib bych se vyhnul... co když někdo bude používat Wayland. Doporučuju použít nějaký toolkit.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frca



Založen: 28. 07. 2007
Příspěvky: 1552

PříspěvekZaslal: 9. duben 2011, 22:09:39    Předmět: Odpovědět s citátem

kód:
// g++ main.cpp -lX11 -o x11example -O3 -Wall
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>

#include <sys/time.h> // gettimeofday

#include <X11/Xlib.h>
#include <X11/Xutil.h> // XSizeHints // http://www.sfr-fresh.com/unix/misc/Tk-804.029.tar.gz/dox/structXSizeHints.html
#include <X11/Xatom.h> // XA_WM_SIZE_HINTS

typedef struct {
    unsigned long   flags;
    unsigned long   functions;
    unsigned long   decorations;
    long            inputMode;
    unsigned long   status;
} Hints;

void undecorate(Display* d, Window w) {
    Hints   hints;
    Atom    property;
    hints.flags = 2;        // Specify that we're changing the window decorations.
    hints.decorations = 0;  // 0 (false) means that window decorations should go bye-bye.
    property = XInternAtom(d,"_MOTIF_WM_HINTS",True);
    XChangeProperty(d, w, property, property, 32, PropModeReplace, (unsigned char *)&hints, 5);
}

unsigned long getMsec() {
    timeval t;
    gettimeofday(&t, NULL);
    unsigned long M = 1000;
    unsigned long msec=((unsigned long)t.tv_sec)*M+((unsigned long)t.tv_usec)/M;
    return msec;
}

void printFps() {
    static unsigned long msec0 = getMsec();
    unsigned long msec1 = getMsec();
    static unsigned long frames = 0;
    ++frames;
    if (msec1 - msec0 >= 1000) {
        printf("%f fps\n", float(frames)/float(msec1-msec0)*1000.0f);
        frames = 0;
        msec0 = msec1;
    }
}

#define GAMELOOP 1

int main(void) {
    XEvent e;
    int width = 1024, height = 768;
    /* open connection with the server */
    Display* d = XOpenDisplay(NULL);
    if (d == NULL) {
        fprintf(stderr, "Cannot open display\n");
        exit(1);
    }
    int s = DefaultScreen(d);
    /* create window */
    Window w = XCreateSimpleWindow(d, RootWindow(d, s), 10, 10, width, height, 1,
    BlackPixel(d, s), WhitePixel(d, s));
   
    XSizeHints* hints;
    hints = XAllocSizeHints();
    hints->flags = PMinSize|PMaxSize;
    hints->min_width = width;
    hints->min_height = height;
    hints->max_width = width;
    hints->max_height = height;
    XSetWMSizeHints(d, w, hints, XA_WM_NORMAL_HINTS);
   
    undecorate(d, w);

    /* select kind of events we are interested in */
    XSelectInput(d, w, ExposureMask | KeyPressMask | KeyReleaseMask);
   
    // register interest in the delete window message // http://linuxsoftware.co.nz/blog/2008/08/12/handling-window-close-in-an-x11-app
    Atom wmDeleteMessage = XInternAtom(d, "WM_DELETE_WINDOW", False);
    XSetWMProtocols(d, w, &wmDeleteMessage, 1);
   
    GC gc = DefaultGC(d, DefaultScreen(d));

    XImage* image = XCreateImage(d, NULL, 24, ZPixmap, 0, NULL, width, height, 32, 0);
    image->data = (char *) malloc (image->bytes_per_line * height);
    XInitImage(image);

    /* map (show) the window */
    XMapWindow(d, w);
   
    int frame = 0;
    /* event loop */
    while (1) {
        #if GAMELOOP
        while(XPending(d))
        #endif
        {
            XNextEvent(d, &e);
            /* draw or redraw the window */
            if (e.type == Expose) {
            }
            if (e.type == KeyPress) {
                if (e.xkey.keycode == 9) // exit on Esc
                    goto close;
            }
            if (e.type == KeyRelease) {
            }
            if (e.type == ClientMessage && e.xclient.data.l[0] == wmDeleteMessage) {
                goto close;
            }
        }
        #if GAMELOOP
        for (int y = 0; y != height; ++y) {
            unsigned char* component = (unsigned char*)(image->data+y*image->bytes_per_line);
            for (int x = 0; x != width; ++x) {               
                int xf = x+frame;
                *(component++) = xf^y; // B
                *(component++) = xf+y; // G
                *(component++) = xf&y; // R
                component++;
            }
        }
        XPutImage(d,w, gc,image, 0, 0, 0, 0, width, height);
        printFps();
        #endif
        ++frame;
    }
    close:
    /* close connection to server */
    XCloseDisplay(d);
    free(image->data);
    return 0;
}


Toto je trochu zajímavější příklad. Nezobrazuje se titulek okna, vypnout to lze přes Alt+F4 nebo Esc. Na mém Pentiu M to jede rychlostí 75 fps. Zobrazuje to tento horizontálně scrollující obrázek:


Bylo by super, kdybyste to zkusili zkompilovat a napsali, jak rychle (a jestli vůbec) vám to na čem jede. Díky!

Edit: Eosie: Vidím poprvé a nestačím se divit. Doufejme, že než se to rozšíří, dodělají zpětnou kompatibilitu pro xserver. A nebo jinak: Přepište někdo tento jednoduchý příklad pro Wayland Very Happy
A jako toolkit co? Tk by šlo? Jde mi o co nejmenší závislosti, prostě aby to jelo všude a všem, v rámci jedné architektury nejlépe bez rekompilace.
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
nou



Založen: 28. 07. 2007
Příspěvky: 1047

PříspěvekZaslal: 9. duben 2011, 23:08:23    Předmět: Odpovědět s citátem

na mojom Phenom II 955 dostavam 320FPS. bez compizu len 120.

myslim ze pekny benchmark ako rychlo dokaze Xserver blitovat data.

a este zaujimavost bez -O3 len tak bez optimalizacii mi to bezalo len 50FPS.
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 9. duben 2011, 23:16:29    Předmět: Odpovědět s citátem

Místo GLX je tam EGL, vykreslování všeho jede přes OpenGL ES. Je to v podstatě úplně stejný API jako pro mobily. Xlib tam nebude, ale Wayland umí hostovat X servery, takže možná půjde nahodit X session v rámci jedné aplikace. Toolkity používat takový, který jsou rozšířený, protože je tam aspoň šance, že je někdo naportuje.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 9. duben 2011, 23:37:52    Předmět: Odpovědět s citátem

Athlon II 2.8GHz
Radeon X1900XTX, open driver

Bez compizu: 151 fps
S compizem: 180 fps
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Ladis



Založen: 18. 09. 2007
Příspěvky: 1533
Bydliště: u Prahy

PříspěvekZaslal: 10. duben 2011, 03:46:30    Předmět: Odpovědět s citátem

Stejně nějaký čas potrvá, než někdo některý toolkit naportuje. Takže tam nad tím určitě bude k dispozici nějaký X server, už kvůli starým aplikacím, co nikdo přepisovat nebude. Vždyť X server je nad systémovým grafickým API i v Mac OS X (X11) a dokonce i ve Windows (Cygwin).
_________________
Award-winning game developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 10. duben 2011, 04:12:52    Předmět: Odpovědět s citátem

Ladis napsal:
Stejně nějaký čas potrvá, než někdo některý toolkit naportuje. Takže tam nad tím určitě bude k dispozici nějaký X server, už kvůli starým aplikacím, co nikdo přepisovat nebude. Vždyť X server je nad systémovým grafickým API i v Mac OS X (X11) a dokonce i ve Windows (Cygwin).

To by ses divil, GTK a Qt už podporu mají. Nic moc víc není potřeba, aspoň se pořádně pročístí celej ekosystém. Problém bych viděl akorát v podpoře oficiálních 3D driverů, ale nevidím to jako překážku, které bych přisuzoval dlouhodobý význam.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Obecné Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna