2017-04-16 4 views
1

私は本当に遅いこのプログラムを持っています。プロファイリングはボトルネックがXGetImageにあることを明らかにします(ループ内でXGetImageを呼び出すことはできません)。推奨される解決策を読むことは、XShmGetImageを代わりに呼び出すことですが、ドキュメントは本当に嫌です。XShmGetImageとXShmPutImageの使い方

私は、XShmCreateImage、XShmGetImage、XShmSetImageを呼び出す方法の簡単なサンプルコードを探しています。

深いプロファイリングでは、XPutImage(正確にはプロファイリングを正確にするためにXFlushを呼び出すことができます)ではなく、XGetImageを根本的なボトルネックにしているため、メモリアロケータへの暗黙の呼び出しは実際には遅いですが、私はXShmGetImageを除いて事前に割り当てられたXImageを渡すことができるXGetImageの変種です。 Shm関数の使用は、とにかくさらに改善する可能性があります。

答えて

3

MIT-SHMのドキュメントは吸いません。それは単に存在しません。ここで

は作業呪文だ:

Display *d; 
    int s; 
    XImage *image; 
    XShmSegmentInfo shminfo; 
    d = XOpenDisplay(NULL); 
    s = DefaultScreen(d); 

    image = XShmCreateImage(d, 
     DefaultVisual(d,0), // Use a correct visual. Omitted for brevity  
     24, // Determine correct depth from the visual. Omitted for brevity 
     ZPixmap, NULL, &shminfo, 100, 100); 

    shminfo.shmid = shmget(IPC_PRIVATE, 
     image->bytes_per_line * image->height, 
     IPC_CREAT|0777); 

    shminfo.shmaddr = image->data = shmat(shminfo.shmid, 0, 0); 
    shminfo.readOnly = False; 

    XShmAttach(d, &shminfo); 

    XShmGetImage(d, 
     RootWindow(d,0), 
     image, 
     50, 
     50, 
     AllPlanes);