青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 96  文章 - 255  trackbacks - 0
<2008年2月>
272829303112
3456789
10111213141516
17181920212223
2425262728291
2345678

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

常用鏈接

留言簿(21)

隨筆分類

隨筆檔案

SDL相關網站

我的個人網頁

我的小游戲

資源下載

搜索

  •  

積分與排名

  • 積分 - 495961
  • 排名 - 39

最新評論

閱讀排行榜

評論排行榜

作者:龍飛

2.1:需要修改的地方。

        這里,我們真正的開始使用SDL的硬件渲染。首先,我們需要設置驅動的環(huán)境(以windows為例,我們設置為directx,Linux的設置請參考官方網站,我們這里預留為dga)。另外,如果要啟動硬件加速,必須使用全屏模式(SDL_FULLSCREEN),所以,在前面的軟件渲染中,我們也使用全屏以作對比。第三,硬件渲染需要打開雙緩沖(SDL_DOUBLEBUF),至于為什么我們在最后討論,我們還是先看看完整的代碼。

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:問題。

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

2.4:補充。

        目前用Debian試驗的時候,發(fā)現(xiàn)NVidia的顯卡驅動屏蔽掉了dga的。也就是說實際上用不了,或者會設置起來很麻煩。實際上,SDL通過x11來實現(xiàn)圖像,我目前的認識應該是這樣的:SDL->x11->NV驅動->顯卡。所以,實際上我們雖然沒有通過SDL接觸到顯卡,但實際上還是通過種種渠道調用了顯卡,我們應該充分相信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 閱讀(9578) 評論(6)  編輯 收藏 引用 所屬分類: SDL入門教程

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

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

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

同時又找了x11的顯圖原理
發(fā)現(xiàn)應該是
x11→顯卡
sdl→顯卡
而且x11,sdl都是平等的用了2.4以上kernel的fb設備,實現(xiàn)顯圖,只不過是功能不同而以  回復  更多評論
  
# re: SDL入門教程(四):2、SDL動畫的硬件渲染(Hardware Render)  2013-06-10 13:14 蕭蕭_gloxec
并且雙緩沖也是需要硬件支持的
sdl是用fb的接口做渲染的
所以要想雙緩沖,那么就要fb的總內存大于 〔fb.xres *
fb.yres *
fb.bits_per_pixel /
8〕 的值  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
              亚洲视频欧美视频| 日韩视频永久免费| 欧美日韩亚洲一区在线观看| 久久综合亚州| 国产精品美女主播在线观看纯欲| 亚洲电影第1页| 国内精品久久久久伊人av| 亚洲一区二区三区在线看| av成人激情| 欧美a级片一区| 久久综合色8888| 国产一区二区欧美| 欧美一级专区| 久久av一区二区三区漫画| 欧美午夜一区二区| aa亚洲婷婷| 亚洲一区二区视频在线| 欧美伦理影院| 亚洲日本理论电影| 99re6热只有精品免费观看 | 久久精精品视频| 久久国产视频网站| 国产亚洲激情视频在线| 亚洲欧美在线观看| 久久精品青青大伊人av| 国产中文一区| 久久久综合视频| 欧美成人精品| 亚洲精品国产系列| 欧美日本免费| 亚洲午夜精品网| 久久精品成人欧美大片古装| 国产亚洲精品成人av久久ww| 欧美一区亚洲二区| 欧美成人一区二区| 亚洲精品视频二区| 欧美日韩亚洲另类| 亚洲欧美另类在线观看| 久久久精品国产一区二区三区| 国产亚洲高清视频| 免费国产自线拍一欧美视频| 亚洲第一狼人社区| 亚洲免费一区二区| 国产一区二区观看| 久久综合电影| 亚洲精品专区| 久久国产欧美精品| 亚洲国产精品久久久久秋霞影院| 六十路精品视频| 99riav国产精品| 久久精品99国产精品日本| 亚洲福利视频免费观看| 欧美精品一区二区三| 中文精品视频| 老司机亚洲精品| 99这里只有久久精品视频| 国产精品三上| 免费一区二区三区| 亚洲一区二区三区精品在线| 久久婷婷国产综合国色天香| 亚洲日本黄色| 国产日韩欧美日韩大片| 欧美成人日韩| 性色av一区二区三区红粉影视| 欧美成人免费在线视频| 欧美夜福利tv在线| 亚洲精品视频在线观看免费| 国产欧美日韩在线视频| 欧美久久九九| 久久国产一区二区| 中文一区二区| 亚洲国产美女| 六十路精品视频| 亚洲欧洲av一区二区| 亚洲国产欧美不卡在线观看| 国产精品综合久久久| 欧美激情精品久久久久| 欧美专区在线观看| 在线综合亚洲欧美在线视频| 欧美国产精品v| 久久米奇亚洲| 亚洲欧美文学| 这里只有精品丝袜| 亚洲精选在线| 亚洲激情偷拍| 一区二区三区无毛| 国产亚洲成精品久久| 国产精品大片免费观看| 欧美精品久久天天躁| 美女91精品| 久久一区二区三区四区五区| 欧美亚洲日本网站| 亚洲视频一二| 一本久道综合久久精品| 亚洲激情网址| 亚洲片在线资源| 亚洲国产日韩在线一区模特| 欧美成人免费视频| 美国十次成人| 米奇777在线欧美播放| 午夜免费久久久久| 欧美亚洲自偷自偷| 久久国产黑丝| 久久久久国产精品厨房| 久久精品视频在线免费观看| 久久爱www久久做| 久久9热精品视频| 亚洲欧美激情精品一区二区| 亚洲图片欧美午夜| 亚洲自拍高清| 久久99伊人| 久久综合导航| 欧美激情视频一区二区三区不卡| 农夫在线精品视频免费观看| 美女诱惑一区| 亚洲高清自拍| 99精品国产一区二区青青牛奶| 亚洲三级色网| 亚洲色图在线视频| 亚洲视频第一页| 亚洲一区三区电影在线观看| 亚洲欧美999| 久久国产精品亚洲77777| 久久午夜电影| 欧美精品一区二区三区四区| 欧美色图天堂网| 国产日韩欧美高清免费| 在线观看日韩一区| 日韩一区二区电影网| 亚洲欧美精品一区| 久久久99久久精品女同性| 麻豆九一精品爱看视频在线观看免费| 嫩草国产精品入口| 日韩视频在线观看| 亚洲永久免费精品| 久久亚洲不卡| 欧美日韩中文在线观看| 国产女人18毛片水18精品| 在线播放视频一区| 这里只有视频精品| 久久久久久久久久久久久久一区| 欧美激情一区三区| 亚洲天堂av图片| 美国成人直播| 国产精品自拍三区| 亚洲精品九九| 久久成人人人人精品欧| 亚洲成色777777在线观看影院| 国产精品久久看| 国产一区日韩欧美| 一区二区三区福利| 久久人人爽人人| 亚洲巨乳在线| 麻豆久久婷婷| 国产日韩欧美视频| 一区二区三区国产在线| 麻豆精品91| 亚洲一区日韩| 欧美日韩 国产精品| 极品日韩av| 欧美亚洲综合久久| 亚洲欧洲一级| 久热re这里精品视频在线6| 国产精品女主播| 99精品国产一区二区青青牛奶| 久久久久久黄| 亚洲女优在线| 国产精品激情偷乱一区二区∴| 亚洲欧洲精品成人久久奇米网| 久久精品国产精品亚洲综合| 这里只有视频精品| 欧美日韩亚洲免费| 亚洲另类在线视频| 免费的成人av| 久久久99免费视频| 国产色综合久久| 午夜精品福利一区二区三区av| 日韩一级在线观看| 欧美黄色视屏| 亚洲精品激情| 亚洲第一天堂av| 欧美 日韩 国产精品免费观看| 伊人久久综合97精品| 久久久久国产精品人| 亚洲欧美日韩电影| 国产精品私人影院| 羞羞答答国产精品www一本 | 欧美精品二区三区四区免费看视频| 国产自产在线视频一区| 欧美在线精品免播放器视频| 亚洲香蕉成视频在线观看| 欧美日韩在线直播| 亚洲性av在线| 艳妇臀荡乳欲伦亚洲一区| 欧美日本高清视频| 亚洲在线视频观看| 一区二区三区偷拍| 国产精品视频不卡| 久久精品一二三区| 欧美在线在线|