未顯示需要 JavaScript 的文檔選項(xiàng)





Sam Lantinga, 首席程序員, Loki Entertainment Software

1999 年 9 月 01 日

Sam Lantinga 是 Simple DirectMedia Layer (SDL) 庫(kù)的作者和 Loki Entertainment 的首席開發(fā)人員,他將向您介紹一種將游戲移植到 Linux上的優(yōu)秀工具。SDL 是一個(gè)跨平臺(tái)代碼移植的理想工具,它支持許多平臺(tái),如Linux、Solaris、IRIX、FreeBSD 和 MacOS,這對(duì)于那些認(rèn)為可以在 Linux上開發(fā)商業(yè)軟件的 Linux 開發(fā)者來(lái)說(shuō)是一大進(jìn)步。他向社區(qū)的前輩之一討教SDL 如何使 Linux 用戶享受任何平臺(tái)上最好的游戲,SDL如何幫助開發(fā)者跟上下一代計(jì)算機(jī)游戲迷的要求。
Sam Lantinga 是 Simple DirectMedia Layer (SDL) 庫(kù)的作者和 Loki Entertainment 的首席開發(fā)人員,他將向您介紹一種將游戲移植到 Linux 上的優(yōu)秀工具。SDL 是一個(gè)跨平臺(tái)代碼移植的理想工具,它支持許多平臺(tái),如 Linux、Solaris、IRIX、FreeBSD 和 MacOS,這對(duì)于那些認(rèn)為可以在 Linux 上開發(fā)商業(yè)軟件的 Linux 開發(fā)者來(lái)說(shuō)是一大進(jìn)步。他向社區(qū)的前輩之一討教 SDL 如何使 Linux 用戶享受任何平臺(tái)上最好的游戲,SDL 如何幫助開發(fā)者跟上下一代計(jì)算機(jī)游戲迷的要求。

自從 Linus 首先開發(fā)出 Linux 時(shí)開始,到現(xiàn)在 Linux 成為所有黑客的夢(mèng)想并且遍及全世界,Linux 開發(fā)最重要的元素之一就是 OS 上游戲的質(zhì)量和可用性。游戲是我們用來(lái)娛樂和休閑的。它們可以提高創(chuàng)造力并拓展思路。游戲還可以用來(lái)測(cè)量操作系統(tǒng)的性能。由于游戲越來(lái)越復(fù)雜,它們迫使每 個(gè)子系統(tǒng)逼近極限。每當(dāng)我裝配一個(gè)系統(tǒng)時(shí),首先要做的就是裝入一個(gè)游戲并試玩,以“測(cè)試”每一項(xiàng)的性能。

Linux 上的游戲已經(jīng)存在了很長(zhǎng)時(shí)間。從早期的 NetTrek,到受高度贊揚(yáng)的 DOOM!雷神 (Quake),人們已經(jīng)可以在 Linux 上玩游戲了。但問(wèn)題是沒有足夠的游戲。沒有哪家大公司為 Linux 創(chuàng)作能產(chǎn)生轟動(dòng)效應(yīng)的游戲。但是,由于該操作系統(tǒng)變得日益流行,這種情況正開始改善。

Linux 上最早期的游戲使用 X11 協(xié)議。但是對(duì)于游戲來(lái)說(shuō),X11 實(shí)在太慢了,因?yàn)樗轻槍?duì)在網(wǎng)絡(luò)上透明運(yùn)行的基于菜單的應(yīng)用而設(shè)計(jì)的協(xié)議。使用它的游戲通常沒有絢麗的畫面,而且運(yùn)行得相當(dāng)慢。 DOOM!是 一個(gè)值得注意的例外,雖然它使用 X11,但是它通過(guò)使用 MIT 共享內(nèi)存擴(kuò)展可以使動(dòng)畫更流暢,并提供了逼真的三維效果。還有一些游戲使用 SVGA 圖形庫(kù),SVGAlib。我最喜歡的一個(gè)老游戲是重力戰(zhàn)爭(zhēng) (Gravity Wars),它對(duì)其模擬的老 Amiga 游戲 Gravity Force 做了重大改動(dòng)。但使用 SVGAlib 的程序只能適用于少數(shù)受支持的顯卡。

早期 X11 游戲, 爭(zhēng)霸 (Craft)的圖片。 神話 2 (Myth 2)的圖片,Loki 出品
單擊以放大圖片 單擊以放大圖片

今天,游戲開發(fā)者有了更多的選擇。仍然可以使用 X 工具箱或全屏 API,如 SVGAlib 或 fbcon,來(lái)編寫游戲,但他們現(xiàn)在還有許多游戲庫(kù)可以使用。Simple DirectMedia Layer 庫(kù)是 Linux 上最好的低層游戲開發(fā) API 之一。

SDL 是什么?
Simple DirectMedia Layer 庫(kù),簡(jiǎn)稱 SDL,是為數(shù)不多的商業(yè)游戲開發(fā)公司使用的免費(fèi)軟件庫(kù)之一。它提供跨平臺(tái)的二維幀緩沖區(qū)圖形和音頻服務(wù),它支持 Linux、Win32 和 BeOS。也不同程度地支持其它平臺(tái),包括 Solaris、IRIX、FreeBSD 和 MacOS。除了大量的服務(wù),包括線程、獨(dú)立于字節(jié)存儲(chǔ)次序的宏和 CD 音頻,SDL 還提供了一個(gè)簡(jiǎn)單的 API,它允許您盡可能接近本機(jī)硬件。使用 SDL 有三重優(yōu)點(diǎn):穩(wěn)定、簡(jiǎn)單和靈活。

  • 穩(wěn)定。如果 SDL 不向 API 提供可靠的支持,那么那些愛好者和商業(yè)公司就不能使用它。因?yàn)槭褂昧?SDL,就添加了錯(cuò)誤修正并增強(qiáng)了性能,也就加強(qiáng)了 API 的強(qiáng)健性。就像內(nèi)核開發(fā)是分步進(jìn)行的,SDL 的開發(fā)也是分步進(jìn)行的,其中一部分是可靠穩(wěn)定的 API,其它部分是新功能和構(gòu)思的沙箱。
  • 簡(jiǎn)單。SDL 被設(shè)計(jì)成一個(gè)簡(jiǎn)單的 API,以最少的代碼實(shí)現(xiàn)您的構(gòu)思。比如,我最近從 Linux 演示組 Optimum中移植了一些演示程序,我將它們的 X11 代碼替換成 SDL 代碼(請(qǐng)參見下面的列表)。您可以看到,SDL 代碼非常易于編寫和理解。

    X11 代碼

    int init_x (int X, int Y,
    int W, int H, int bpp,
    const char *Name) {
    XPixmapFormatValues *formatList;
    int formatCount;
    int i;
    int formatOk;
    int scanlineLength;
    XGCValues gcVal;
    unsigned long gcMask;
    dis = XOpenDisplay ( NULL );
    if ( dis == NULL) {
    fprintf ( stderr , "Error :\n" );
    fprintf ( stderr , " Cannot connect to Display.\n");
    exit (1);
    }
    screen = DefaultScreen ( dis );
    depth = DefaultDepth ( dis , screen );
    width = DisplayWidth ( dis , screen );
    height = DisplayHeight ( dis , screen );

    winRoot = DefaultRootWindow ( dis );
    winAttr.border_pixel = BlackPixel ( dis , screen );
    winAttr.background_pixel = BlackPixel ( dis , screen );
    winMask = CWBackPixel | CWBorderPixel;

    formatList = XListPixmapFormats( dis, &formatCount);
    if (formatList == NULL){
    fprintf ( stderr , " Cannot get pixmap list\n");
    exit (1);
    }
    formatOk=-1;
    for (i=0; ibytes_per_line*xim->height,
    IPC_CREAT|0777);
    xim->data = SHMInfo.shmaddr = (char *)shmat(SHMInfo.shmid, 0, 0);
    SHMInfo.readOnly = False;
    XShmAttach(dis, &SHMInfo);
    XSync(dis, False);
    buffer=(unsigned char *)xim->data;
    #else
    buffer = (unsigned char *)calloc(W*H, pixmapFormat.bits_per_pixel/8);
    xim = XCreateImage ( dis , CopyFromParent , depth , ZPixmap , 0 ,
    (char *) buffer , W , H ,
    pixmapFormat.scanline_pad, scanlineLength);
    if (xim == NULL){
    fprintf(stderr, " Couldnt create Ximage..\n");
    exit(-1);
    }
    #endif
    gcVal.foreground = 0;
    gcVal.background = 0;
    gcMask = GCForeground | GCBackground;
    gc = XCreateGC ( dis , win , gcMask , &gcVal );
    if (depth==24)
    depth = pixmapFormat.bits_per_pixel;
    return (depth);
    }

    SDL 代碼

    int init_x (int X, int Y,
    int W, int H, int bpp,
    const char *Name) {
    int i;
    if ( SDL_Init(SDL_INIT_VIDEO) < 0 )
    {
    fprintf ( stderr , "Erreur :\n" );
    fprintf ( stderr , " Impossible de se connecter au Display\n");
    exit (1);
    }
    screen = SDL_SetVideoMode(W, H, bpp, SDL_SWSURFACE|SDL_HWPALETTE);
    if ( screen == NULL )
    {
    fprintf ( stderr , "Erreur :\n" );
    fprintf ( stderr , " Impossible de se connecter au Display\n");
    exit (1);
    }
    SDL_WM_SetCaption ( Name, Name );
    for ( i=SDL_NOEVENT; iformat->BitsPerPixel;
    width = screen->w;
    height = screen->h;
    buffer = (unsigned char *)screen->pixels;
    return (depth);
    }

  • 靈活。 返回到上面的 Optimum 演示代碼示例,只要移植到 SDL,并確定一些數(shù)據(jù)假設(shè),那么根本不必改動(dòng)代碼,演示就可以在 Win32、BeOS 和 Linux 控制臺(tái)上運(yùn)行了。靈活性的另一方面體現(xiàn)在盡管代碼完全是跨平臺(tái)的,但不會(huì)把您和底層實(shí)現(xiàn)隔開。SDL 提供了函數(shù) SDL_GetWMInfo(),該函數(shù)可以讓您訪問(wèn)底層驅(qū)動(dòng)程序的專用窗口信息。Loki Entertainment Software 廣泛使用這一技術(shù)為它們的游戲智能窗口管理器交互。

    Optimum 演示版的屏幕快照

這種堅(jiān)如磐石般的穩(wěn)定、簡(jiǎn)單和強(qiáng)大功能的組合已經(jīng)給 Linux 帶來(lái)了一些極其引人入勝的游戲,包括 Hopkins F.B.I.文明:力量的呼喚 (Civilization: Call To Power)神話 2:Soulblighter (MythII: Soulblighter)鐵路大亨 2 (Railroad Tycoon II)等等。編程愛好者和商業(yè)公司使用這個(gè)庫(kù)的事實(shí)表示它正在日益提高其功能和穩(wěn)定性。這符合實(shí)際游戲的實(shí)際需要。

文明:力量的呼喚 (Civilization: Call To Power)的圖片 天旋地轉(zhuǎn) 2 (Descent 2)的圖片
單擊以放大圖片 單擊以放大圖片