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

隨筆 - 96  文章 - 255  trackbacks - 0
<2008年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

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

常用鏈接

留言簿(21)

隨筆分類

隨筆檔案

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

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

我的小游戲

資源下載

搜索

  •  

積分與排名

  • 積分 - 494500
  • 排名 - 39

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

作者:龍飛

2.1:需要修改的地方。

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

2.4:補(bǔ)充。

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

FeedBack:
# re: SDL入門教程(四):2、SDL動(dòng)畫的硬件渲染(Hardware Render)  2008-08-03 19:28 xiangxiangxiangxiangxiangxiangxiang
我顯卡是NVIDIA的,用dga果然不行
用x11也不行!
請(qǐng)問怎么才能啟用硬加速呢?謝謝  回復(fù)  更多評(píng)論
  
# re: SDL入門教程(四):2、SDL動(dòng)畫的硬件渲染(Hardware Render) [未登錄] 2008-08-03 20:07 lf426
我的認(rèn)識(shí)是這樣的,只要x11啟動(dòng)了nv的驅(qū)動(dòng),硬件加速實(shí)際上是打開的,只是被封裝到了x11內(nèi)部,我們通過SDL軟件渲染調(diào)用了封裝后的x11接口,實(shí)際作用的時(shí)候是啟動(dòng)了硬件加速。這樣應(yīng)該比我們直接調(diào)用硬件接口更加安裝簡(jiǎn)單易用。如何繞過這個(gè)設(shè)定,估計(jì)只有問問SDL的作者了,我在fqa里是沒找到。  回復(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確是沒有開啟加速。
暈了
設(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) [未登錄] 2008-08-04 22:06 lf426
我的意思其實(shí)就是,一般情況下,不需要設(shè)置成硬件渲染。我認(rèn)為SDL軟件渲染實(shí)際是把任務(wù)交給了x11,至于x11最終是通過什么途徑渲染不是很重要,而且我認(rèn)為x11實(shí)際上是調(diào)用了nv的驅(qū)動(dòng),所以,雖然沒有在SDL中設(shè)置成硬件渲染,但是并不意味著就沒調(diào)用顯卡。當(dāng)然,都是我的猜測(cè),具體情況,可能得問問SDL作者本人。  回復(fù)  更多評(píng)論
  
# re: SDL入門教程(四):2、SDL動(dòng)畫的硬件渲染(Hardware Render)  2013-06-10 13:06 蕭蕭_gloxec
關(guān)于sdl的渲染樓主說錯(cuò)了
sdl源碼我認(rèn)真分析了
sdl的渲染模式是繞過了x11
直接建立在底層了
因此想怎么渲染都行
但又設(shè)計(jì)者把零碎的給屏幕描點(diǎn)給封裝成了各式的渲染,并且為了方便他人開發(fā),又用x11在外圍加了一層不必要的框
因此在沒有x11,文本的狀態(tài)下仍然可以各種渲染
并且sdl是基于底層的原因,所以可以實(shí)現(xiàn)任意坐標(biāo)點(diǎn)的顏色改變,但又因?yàn)榉庋b的緣故,所以沒那么隨心所欲

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

同時(shí)又找了x11的顯圖原理
發(fā)現(xiàn)應(yīng)該是
x11→顯卡
sdl→顯卡
而且x11,sdl都是平等的用了2.4以上kernel的fb設(shè)備,實(shí)現(xiàn)顯圖,只不過是功能不同而以  回復(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)論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
              亚洲美女精品一区| 亚洲午夜一二三区视频| 欧美粗暴jizz性欧美20| 老司机aⅴ在线精品导航| 久久精品一区二区三区四区| 久久国产精品久久精品国产| 久久蜜桃精品| 欧美freesex8一10精品| 欧美精品久久久久久久免费观看| 欧美精品1区2区3区| 欧美日韩在线高清| 国产精品手机视频| 国产性天天综合网| 亚洲国产成人不卡| 亚洲已满18点击进入久久| 久久久久久一区| 亚洲激情成人在线| 99精品免费| 久久av资源网站| 欧美日本国产在线| 国产日产亚洲精品系列| 亚洲精品日韩在线观看| 亚洲欧美另类国产| 欧美激情第10页| 亚洲欧美日韩国产综合| 猛男gaygay欧美视频| 国产精品久久久久999| 亚洲国产婷婷香蕉久久久久久| 中文网丁香综合网| 免费成人小视频| 亚洲一区二区三区在线看| 麻豆成人在线播放| 欧美性猛交一区二区三区精品| 亚洲大黄网站| 久久久久一本一区二区青青蜜月| 亚洲国产激情| 久久成人综合网| 国产精品亚洲一区二区三区在线| 狠狠综合久久av一区二区小说| 狠狠操狠狠色综合网| 亚洲免费av电影| 老鸭窝91久久精品色噜噜导演| 一本色道**综合亚洲精品蜜桃冫| 久久精品在线观看| 国产精品久久久久久久浪潮网站| 91久久久久久| 欧美大片网址| 久久9热精品视频| 国产一区在线看| 欧美一区二区三区视频免费播放| 日韩亚洲欧美成人一区| 欧美激情网友自拍| 亚洲精品小视频| 免费欧美高清视频| 久久精品水蜜桃av综合天堂| 国产欧美日韩视频一区二区三区 | 好看的亚洲午夜视频在线| 午夜精品久久久久久久99樱桃| 亚洲日本aⅴ片在线观看香蕉| 久久一区国产| 亚洲第一精品夜夜躁人人爽| 久久一二三区| 玖玖综合伊人| 亚洲欧洲一区二区在线观看| 亚洲高清一二三区| 欧美人与性禽动交情品| 亚洲一区二区视频在线| 一本色道久久综合亚洲精品不| 欧美日韩中文字幕| 午夜视频在线观看一区| 小处雏高清一区二区三区| 国内外成人在线| 亚洲第一网站| 欧美精品日韩综合在线| 亚洲图色在线| 午夜欧美不卡精品aaaaa| 很黄很黄激情成人| 亚洲电影专区| 国产精品三区www17con| 久久久久久夜| 欧美国产日韩一区二区在线观看| 亚洲精品一区久久久久久| 日韩视频免费观看高清完整版| 欧美日韩国产在线观看| 欧美一区2区三区4区公司二百| 久久精品欧美| 亚洲视频一区二区免费在线观看| 亚洲欧美久久久| 亚洲福利视频网| 一区二区三区回区在观看免费视频| 国产伦精品免费视频| 亚洲电影在线观看| 国产精品进线69影院| 久久综合影音| 91久久国产综合久久| 国产精品你懂得| 麻豆成人精品| 欧美性猛交xxxx乱大交蜜桃| 久久人人97超碰精品888| 欧美精品自拍| 久久天堂国产精品| 国产精品高清免费在线观看| 久久综合999| 国产精品videossex久久发布| 免费在线观看日韩欧美| 国产精品久久久久婷婷| 欧美成年人视频| 国产欧美日韩免费看aⅴ视频| 亚洲电影天堂av| 精品成人乱色一区二区| 一区二区三区.www| 亚洲精品久久久久| 欧美中文在线观看| 亚洲综合清纯丝袜自拍| 麻豆视频一区二区| 久久久亚洲午夜电影| 欧美色另类天堂2015| 亚洲人成网站精品片在线观看| 尤物yw午夜国产精品视频明星| 亚洲自拍偷拍麻豆| 国产精品99久久久久久有的能看| 久久只有精品| 久久婷婷av| 国产精品丝袜xxxxxxx| 亚洲精品乱码| 亚洲免费成人av电影| 免费日韩av电影| 欧美高清在线一区二区| 精品成人乱色一区二区| 欧美在线亚洲综合一区| 久久国产一区二区| 国产精品一区在线观看你懂的| 日韩视频欧美视频| 亚洲一区二区成人| 国产精品久久久久三级| 中文一区二区| 欧美一区二区精品在线| 国产精自产拍久久久久久| 亚洲一区二区三区四区视频| 欧美一级二级三级蜜桃| 国产欧美一区二区精品忘忧草| 午夜欧美视频| 猫咪成人在线观看| 亚洲欧洲在线视频| 欧美日韩中文在线| 亚洲综合社区| 美女任你摸久久| 亚洲大胆av| 欧美日韩精品免费观看视频| 亚洲高清资源| 亚洲精品一区二区三区在线观看| 欧美伦理91i| 亚洲无亚洲人成网站77777| 性久久久久久久久久久久| 国产午夜精品久久| 另类激情亚洲| 日韩亚洲一区在线播放| 午夜在线视频观看日韩17c| 国产噜噜噜噜噜久久久久久久久| 久久精品国产成人| 亚洲经典在线| 亚洲摸下面视频| 黑人巨大精品欧美黑白配亚洲 | 欧美成人午夜激情视频| 欧美自拍偷拍午夜视频| 一区精品在线| 欧美激情精品久久久| 中文网丁香综合网| 麻豆久久精品| 亚洲性视频网址| 永久免费毛片在线播放不卡| 欧美精品不卡| 午夜精品久久久久久| 欧美xx视频| 性欧美18~19sex高清播放| 在线欧美日韩| 国产日韩在线一区| 欧美区一区二| 久久精品亚洲一区| 在线综合亚洲| 亚洲黑丝一区二区| 久久久噜噜噜久久| 亚洲午夜精品久久久久久浪潮| 黄色亚洲在线| 国产精品v欧美精品v日本精品动漫| 久久嫩草精品久久久久| 亚洲免费小视频| 91久久精品国产| 久久久久成人网| 亚洲免费在线视频| aⅴ色国产欧美| 亚洲激情第一页| 国产午夜精品在线观看| 欧美视频一区在线| 欧美黄色网络| 欧美1区2区视频| 久久久美女艺术照精彩视频福利播放 | 狠狠色狠狠色综合| 欧美体内谢she精2性欧美| 久久久久久**毛片大全|