• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 96  文章 - 255  trackbacks - 0
            <2008年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            E-mail:zbln426@163.com QQ:85132383 長(zhǎng)期尋找對(duì)戰(zhàn)略游戲感興趣的合作伙伴。

            常用鏈接

            留言簿(21)

            隨筆分類

            隨筆檔案

            SDL相關(guān)網(wǎng)站

            我的個(gè)人網(wǎng)頁(yè)

            我的小游戲

            資源下載

            搜索

            •  

            積分與排名

            • 積分 - 492217
            • 排名 - 38

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            作者:龍飛

            2.1:需要修改的地方。

                    這里,我們真正的開(kāi)始使用SDL的硬件渲染。首先,我們需要設(shè)置驅(qū)動(dòng)的環(huán)境(以windows為例,我們?cè)O(shè)置為directx,Linux的設(shè)置請(qǐng)參考官方網(wǎng)站,我們這里預(yù)留為dga)。另外,如果要啟動(dòng)硬件加速,必須使用全屏模式(SDL_FULLSCREEN),所以,在前面的軟件渲染中,我們也使用全屏以作對(duì)比。第三,硬件渲染需要打開(kāi)雙緩沖(SDL_DOUBLEBUF),至于為什么我們?cè)谧詈笥懻摚覀冞€是先看看完整的代碼。

            2.2:硬件渲染演示程序完整的源代碼。
            #define __windows__    // Linux using #define __linux__
            #include 
            <iostream>
            #include 
            "SDL/SDL.h"

            SDL_Surface
            * pScreen = 0;
            SDL_Surface
            * pBack = 0;
            SDL_Surface
            * pFront = 0;

            void pressESCtoQuitPlus();
            void loopRender();

            int main(int argc, char* argv[])
            {
            #ifdef __windows__
                SDL_putenv(
            "SDL_VIDEODRIVER=directx");
            #endif

            #ifdef __linux__
                putenv(
            "SDL_VIDEODRIVER=dga");
            #endif

                
            try {
                    
            if ( SDL_Init(SDL_INIT_VIDEO) != 0 )
                        
            throw SDL_GetError();
                }
                
            catch ( const char* s ) {
                    std::cerr 
            << "SDL_Init() failed!\n" << s << std::endl;
                    
            return -1;
                }

                
            const int SCREEN_WIDTH = 640;
                
            const int SCREEN_HEIGHT = 480;
                
            const int SCREEN_BPP = 32;    
                
            const Uint32 SCREEN_FLAGS = SDL_FULLSCREEN | SDL_DOUBLEBUF | SDL_HWSURFACE;

                pScreen 
            = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SCREEN_FLAGS);    
                
            try {
                    
            if ( pScreen == 0 )
                        
            throw SDL_GetError();
                }
                
            catch ( const char* s ) {
                    std::cerr 
            << "SDL_SetVideoMode() failed!\n" << s << std::endl;
                    SDL_Quit();
                    
            return -1;
                }

                pBack 
            = SDL_LoadBMP("back.bmp"); 
                
            try {
                    
            if ( pBack == 0 )
                        
            throw SDL_GetError();
                }
                
            catch ( const char* s ) {
                    std::cerr 
            << "SDL_LoadBMP() failed!\n" << s << std::endl;
                    SDL_Quit();
                    
            return -1;
                }

                pFront 
            = SDL_LoadBMP("front.bmp"); 
                
            try {
                    
            if ( pFront == 0 )
                        
            throw SDL_GetError();
                }
                
            catch ( const char* s ) {
                    std::cerr 
            << "SDL_LoadBMP() failed!\n" << s << std::endl;
                    SDL_Quit();
                    
            return -1;
                }

                
            try {
                    pressESCtoQuitPlus();
                }
                
            catch ( const char* s ) {
                    std::cerr 
            << "pressESCtoQuitPlus() failed!\n" << s << std::endl;
                    SDL_Quit();
                    
            return -1;
                }

                SDL_Quit();

                
            return 0;
            }

            void pressESCtoQuitPlus()
            {
                
            bool gameOver = false;
                
            while( gameOver == false ){
                    SDL_Event gameEvent;
                    
            while ( SDL_PollEvent(&gameEvent) != 0 ){
                        
            if ( gameEvent.type == SDL_QUIT ){
                            gameOver 
            = true;
                        }
                        
            if ( gameEvent.type == SDL_KEYUP ){
                            
            if ( gameEvent.key.keysym.sym == SDLK_ESCAPE ){
                                gameOver 
            = true;
                            }
                        }
                    }
                    loopRender();
                }
                
            return;
            }

            void loopRender()
            {
                SDL_Rect
            * pSrcRect = 0;    
                SDL_Rect
            * pDstRect = 0;
                
            if ( SDL_BlitSurface(pBack, pSrcRect, pScreen, pDstRect) != 0 )
                    
            throw SDL_GetError();
                
            if ( SDL_BlitSurface(pFront, pSrcRect, pScreen, pDstRect) != 0 )
                    
            throw SDL_GetError();
                
            if ( SDL_Flip(pScreen) != 0 )
                    
            throw SDL_GetError();
                
            return;
            }

            2.3:?jiǎn)栴}。

                    你可能發(fā)現(xiàn)除了鼠標(biāo)指針不顯示之外,沒(méi)有其它問(wèn)題——這其實(shí)不是好現(xiàn)象,因?yàn)閼?yīng)該和可能出現(xiàn)的問(wèn)題,都被我們事先避免了,但是這樣讓我們離事情的本質(zhì)越來(lái)越遠(yuǎn)。你可以嘗試著關(guān)掉SDL_DOUBLEBUF位標(biāo)看看是什么效果;或者,在前面渲染單幀的程序中使用硬件渲染同時(shí)打開(kāi)雙緩沖看看出現(xiàn)什么問(wèn)題——這些正是我們下一節(jié)將要討論的。
                    如果你迫不及待的想知道原因,并且英語(yǔ)也過(guò)關(guān)的話,對(duì)于硬件渲染可能會(huì)引發(fā)的問(wèn)題,我給你推薦一篇SDL官方也推薦的論文:
            http://www.linuxdevcenter.com/pub/a/linux/2003/08/07/sdl_anim.html
                    但是很不幸的是,我在試驗(yàn)的過(guò)程中發(fā)現(xiàn)這篇文章有很多問(wèn)題,當(dāng)然,也許是我錯(cuò)了。因?yàn)槲覂H僅把SDL作為了一個(gè)黑盒子來(lái)研究,但是我得到的試驗(yàn)結(jié)果,卻是不可能錯(cuò)的。

            2.4:補(bǔ)充。

                    目前用Debian試驗(yàn)的時(shí)候,發(fā)現(xiàn)NVidia的顯卡驅(qū)動(dòng)屏蔽掉了dga的。也就是說(shuō)實(shí)際上用不了,或者會(huì)設(shè)置起來(lái)很麻煩。實(shí)際上,SDL通過(guò)x11來(lái)實(shí)現(xiàn)圖像,我目前的認(rèn)識(shí)應(yīng)該是這樣的:SDL->x11->NV驅(qū)動(dòng)->顯卡。所以,實(shí)際上我們雖然沒(méi)有通過(guò)SDL接觸到顯卡,但實(shí)際上還是通過(guò)種種渠道調(diào)用了顯卡,我們應(yīng)該充分相信NV的工程師比我們牛得多。NV官方解釋如下:
            http://us.download.nvidia.com/XFree86/Linux-x86/169.04/README/chapter-07.html#id2546686

            Why do applications that use DGA graphics fail?


            The NVIDIA driver does not support the graphics component of the XFree86-DGA (Direct Graphics Access) extension. Applications can use the XDGASelectInput() function to acquire relative pointer motion, but graphics-related functions such as XDGASetMode() and XDGAOpenFramebuffer() will fail.

            The graphics component of XFree86-DGA is not supported because it requires a CPU mapping of framebuffer memory. As graphics cards ship with increasing quantities of video memory, the NVIDIA X driver has had to switch to a more dynamic memory mapping scheme that is incompatible with DGA. Furthermore, DGA does not cooperate with other graphics rendering libraries such as Xlib and OpenGL because it accesses GPU resources directly.

            NVIDIA recommends that applications use OpenGL or Xlib, rather than DGA, for graphics rendering. Using rendering libraries other than DGA will yield better performance and improve interoperability with other X applications.


            posted on 2008-02-15 16:23 lf426 閱讀(9508) 評(píng)論(6)  編輯 收藏 引用 所屬分類: SDL入門教程

            FeedBack:
            # re: SDL入門教程(四):2、SDL動(dòng)畫的硬件渲染(Hardware Render)  2008-08-03 19:28 xiangxiangxiangxiangxiangxiangxiang
            我顯卡是NVIDIA的,用dga果然不行
            用x11也不行!
            請(qǐng)問(wèn)怎么才能啟用硬加速呢?謝謝  回復(fù)  更多評(píng)論
              
            # re: SDL入門教程(四):2、SDL動(dòng)畫的硬件渲染(Hardware Render) [未登錄](méi) 2008-08-03 20:07 lf426
            我的認(rèn)識(shí)是這樣的,只要x11啟動(dòng)了nv的驅(qū)動(dòng),硬件加速實(shí)際上是打開(kāi)的,只是被封裝到了x11內(nèi)部,我們通過(guò)SDL軟件渲染調(diào)用了封裝后的x11接口,實(shí)際作用的時(shí)候是啟動(dòng)了硬件加速。這樣應(yīng)該比我們直接調(diào)用硬件接口更加安裝簡(jiǎn)單易用。如何繞過(guò)這個(gè)設(shè)定,估計(jì)只有問(wèn)問(wèn)SDL的作者了,我在fqa里是沒(méi)找到。  回復(fù)  更多評(píng)論
              
            # re: SDL入門教程(四):2、SDL動(dòng)畫的硬件渲染(Hardware Render)  2008-08-04 18:25 xiangxiangxiangxiangxiangxiangxiang
            按照你的意思那么在linux 下面就可以不用寫putenv("SDL_VIDEODRIVER=dga");
            以為x11會(huì)去調(diào)用他
            而且我加上這句話運(yùn)行會(huì)崩掉的(其他directfb,svgalib,ggi也一樣不行)

            可是我檢測(cè)到的pScreen->flags確是沒(méi)有開(kāi)啟加速。
            暈了
            設(shè)置成
            putenv("SDL_VIDEODRIVER=fbcon");
            顯示有點(diǎn)有變化,但pScreen->flags==0
            同樣,
            putenv("SDL_VIDEODRIVER=aalib");
            會(huì)有亂馬,但仍然pScreen->flags==0
              回復(fù)  更多評(píng)論
              
            # re: SDL入門教程(四):2、SDL動(dòng)畫的硬件渲染(Hardware Render) [未登錄](méi) 2008-08-04 22:06 lf426
            我的意思其實(shí)就是,一般情況下,不需要設(shè)置成硬件渲染。我認(rèn)為SDL軟件渲染實(shí)際是把任務(wù)交給了x11,至于x11最終是通過(guò)什么途徑渲染不是很重要,而且我認(rèn)為x11實(shí)際上是調(diào)用了nv的驅(qū)動(dòng),所以,雖然沒(méi)有在SDL中設(shè)置成硬件渲染,但是并不意味著就沒(méi)調(diào)用顯卡。當(dāng)然,都是我的猜測(cè),具體情況,可能得問(wèn)問(wèn)SDL作者本人。  回復(fù)  更多評(píng)論
              
            # re: SDL入門教程(四):2、SDL動(dòng)畫的硬件渲染(Hardware Render)  2013-06-10 13:06 蕭蕭_gloxec
            關(guān)于sdl的渲染樓主說(shuō)錯(cuò)了
            sdl源碼我認(rèn)真分析了
            sdl的渲染模式是繞過(guò)了x11
            直接建立在底層了
            因此想怎么渲染都行
            但又設(shè)計(jì)者把零碎的給屏幕描點(diǎn)給封裝成了各式的渲染,并且為了方便他人開(kāi)發(fā),又用x11在外圍加了一層不必要的框
            因此在沒(méi)有x11,文本的狀態(tài)下仍然可以各種渲染
            并且sdl是基于底層的原因,所以可以實(shí)現(xiàn)任意坐標(biāo)點(diǎn)的顏色改變,但又因?yàn)榉庋b的緣故,所以沒(méi)那么隨心所欲

            按找sdl的渲染原理。
            我也同樣做出了可以任意改變屏幕某個(gè)點(diǎn),或塊,的函數(shù)

            同時(shí)又找了x11的顯圖原理
            發(fā)現(xiàn)應(yīng)該是
            x11→顯卡
            sdl→顯卡
            而且x11,sdl都是平等的用了2.4以上kernel的fb設(shè)備,實(shí)現(xiàn)顯圖,只不過(guò)是功能不同而以  回復(fù)  更多評(píng)論
              
            # re: SDL入門教程(四):2、SDL動(dòng)畫的硬件渲染(Hardware Render)  2013-06-10 13:14 蕭蕭_gloxec
            并且雙緩沖也是需要硬件支持的
            sdl是用fb的接口做渲染的
            所以要想雙緩沖,那么就要fb的總內(nèi)存大于 〔fb.xres *
            fb.yres *
            fb.bits_per_pixel /
            8〕 的值  回復(fù)  更多評(píng)論
              
            久久青青国产| 国产aⅴ激情无码久久| 精品久久人人爽天天玩人人妻 | 性做久久久久久久久久久| 久久久噜噜噜久久熟女AA片| 久久精品国产半推半就| 欧美精品九九99久久在观看| 久久精品国产72国产精福利| 日本久久久精品中文字幕| 久久99精品久久久久久| 高清免费久久午夜精品| 久久国产精品无码一区二区三区 | 亚洲欧美国产精品专区久久| 久久成人永久免费播放| 精品久久久久久久| 欧美激情精品久久久久| 国产精品久久久久9999| 青青草原1769久久免费播放| 天天久久狠狠色综合| 国产日产久久高清欧美一区| 国产精品久久一区二区三区 | 久久久亚洲AV波多野结衣| 国产69精品久久久久观看软件| 亚洲国产精品人久久| 久久亚洲高清综合| 久久超乳爆乳中文字幕| 久久丫忘忧草产品| 亚洲乱码中文字幕久久孕妇黑人| 97久久精品国产精品青草| 久久777国产线看观看精品| 久久久久久久97| 久久久久久久综合日本| 天堂无码久久综合东京热| 久久天天躁狠狠躁夜夜2020 | 国产精品内射久久久久欢欢| 国产成人精品综合久久久| 久久99精品国产| 久久久久av无码免费网| 亚洲?V乱码久久精品蜜桃| 99国产欧美精品久久久蜜芽| 久久亚洲AV无码西西人体|