Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
frca

Založen: 28. 07. 2007 Příspěvky: 1561
|
Zaslal: 8. duben 2011, 15:58:53 Předmět: xlib - překreslování okna |
|
|
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 |
|
 |
frca

Založen: 28. 07. 2007 Příspěvky: 1561
|
Zaslal: 8. duben 2011, 19:50:53 Předmět: |
|
|
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ý  _________________ www.FRANTICWARE.com |
|
Návrat nahoru |
|
 |
Vilem Otte

Založen: 18. 09. 2007 Příspěvky: 462 Bydliště: Znojmo - Sedlesovice, Kravi Hora
|
Zaslal: 9. duben 2011, 20:38:42 Předmět: |
|
|
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 |
|
 |
frca

Založen: 28. 07. 2007 Příspěvky: 1561
|
Zaslal: 9. duben 2011, 21:25:14 Předmět: |
|
|
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 |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 9. duben 2011, 22:03:48 Předmět: |
|
|
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 |
|
 |
frca

Založen: 28. 07. 2007 Příspěvky: 1561
|
Zaslal: 9. duben 2011, 22:09:39 Předmět: |
|
|
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
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 |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 9. duben 2011, 23:08:23 Předmět: |
|
|
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 |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 9. duben 2011, 23:16:29 Předmět: |
|
|
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 |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 9. duben 2011, 23:37:52 Předmět: |
|
|
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 |
|
 |
Ladis

Založen: 18. 09. 2007 Příspěvky: 1537 Bydliště: u Prahy
|
Zaslal: 10. duben 2011, 03:46:30 Předmět: |
|
|
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 |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 10. duben 2011, 04:12:52 Předmět: |
|
|
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 |
|
 |
|