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

3d Game Walkman

3d圖形渲染,網(wǎng)絡(luò)引擎 — tonykee's Blog
隨筆 - 45, 文章 - 0, 評論 - 309, 引用 - 0
數(shù)據(jù)加載中……

轉(zhuǎn)載—網(wǎng)絡(luò)游戲程序中解決加載卡頓的有效方法

對于3d視頻游戲來說,游戲引擎的性能是至關(guān)重要的。玩家在體驗(yàn)一款游戲時(shí),游戲的流暢度是最基本的要求。與單機(jī)游戲不同,網(wǎng)絡(luò)游戲更需要考慮性能問題,因?yàn)闊o法像單機(jī)游戲那樣,控制游戲元素的復(fù)雜度來達(dá)到效率的要求。大量玩家涌入同一片區(qū)域,同屏出現(xiàn)大量的游戲角色是無法避免的,因此游戲幀率的大幅下降,系統(tǒng)資源的大量消耗也很難避免,這是網(wǎng)絡(luò)游戲引擎最難處理的問題之一。
    這里要講一下游戲幀率的控制,通常玩家在玩游戲抱怨游戲客戶端卡有兩個(gè)意思,一是游戲平均幀率很低,二是游戲的幀率非常不穩(wěn),導(dǎo)致了卡頓。實(shí)際上游戲平均幀率低,對玩家心情的影響遠(yuǎn)不及卡頓造成的影響。平均10幀的游戲,雖然已經(jīng)很糟糕了,但是依然能玩,但是頻繁的卡頓給人的感覺就糟糕透了,平時(shí)40幀左右的游戲忽然因?yàn)榧虞d個(gè)什么東西卡了一下,幀率掉到了零點(diǎn)幾,然后又恢復(fù)到40幀,這種卡頓給人的感覺就是煩透了。
    游戲引擎首要解決的性能問題就是卡頓的問題。要解決卡頓的話需要做到以下兩點(diǎn):
    第一,不要在主線程去加載資源,最忌諱的操作就是打開文件,這個(gè)操作會掛起當(dāng)前線程,也就是說會讓渲染線程停頓。把所有的資源加載操作全放在加載線程去做,畢竟加載線程隨便停頓也沒什么關(guān)系,對主線程的渲染沒影響,主線程只需要每幀判斷資源是否已經(jīng)加載上來就可以了。一但發(fā)現(xiàn)已經(jīng)加載上來了,就可以用這個(gè)數(shù)據(jù)去渲染了。
    第二,也是最重要的一點(diǎn),把加載的操作攤到多幀去做。通常角色走進(jìn)人堆里以后,或者在戰(zhàn)場上魔法漫天飛的時(shí)候,服務(wù)器會傳來大量消息需要處理,最典型的就是創(chuàng)建消息,無論是創(chuàng)建角色還創(chuàng)建特效,就算是采用多線程加載的方式,在一幀內(nèi)創(chuàng)建對象,通知線程加載底層資源,那么多消息的處理依然會不可避免地造成卡頓。這里有一個(gè)非常好的解決辦法,就是這些處理消息的操作不要一幀內(nèi)做完,而是分?jǐn)偟蕉鄮瓿伞?br>    一般說來,處理網(wǎng)絡(luò)消息的過程是這樣一個(gè)循環(huán):
while( 消息隊(duì)列中還有消息 )
{
   從隊(duì)列中取出第一條消息;
   處理這條消息;
   將這個(gè)消息從隊(duì)列中刪除;
}
    在一幀當(dāng)中,循環(huán)遍歷整個(gè)消息隊(duì)列,將這一幀收到的消息一個(gè)一個(gè)處理一遍。
    這樣做忽略了最重要的效率問題,當(dāng)你因?yàn)橛螒蚩D在焦頭爛額地優(yōu)化資源加載時(shí),不放考慮修改一下消息隊(duì)列的處理。
    在這里,我可以加入計(jì)時(shí):GetTickCount()

 

初始時(shí)間 = GetTickCount();
while( 消息隊(duì)列中還有消息 )
{
   從隊(duì)列中取出第一條消息;
   處理這條消息;
   當(dāng)前時(shí)間 = GetTickCount();
   經(jīng)過時(shí)間 = 當(dāng)前時(shí)間 - 初始時(shí)間;
   if( 經(jīng)過時(shí)間 > 20 )
   {
      break;
   }
}
    如果這一幀的處理時(shí)間超過了20ms,則把剩下的消息放到下一幀處理。通過這種計(jì)時(shí)的方式,你會發(fā)現(xiàn)游戲的流暢度簡直有了天翻地覆的變化!在優(yōu)化之前,有個(gè)幾個(gè)人在用群攻魔法攻擊大量的怪物,這些家伙忽然涌入到視野中,幀率便一下掉到了零點(diǎn)幾,游戲出現(xiàn)了非常嚴(yán)重的卡頓,這種狀態(tài)持續(xù)了很短一段時(shí)間,幀率又迅速回升上去。而現(xiàn)在,經(jīng)過修改以后,你會發(fā)現(xiàn)那些家伙很平滑地出現(xiàn)在視野中,沒有一絲的卡頓。如此效果簡直是奇跡一般,而這一切僅僅是修改了幾行代碼而已。
    現(xiàn)在考慮這么做所帶來的問題。如果消息量非常大,而機(jī)器又慢,平均幀率又很低的話,那麻煩可就大了:每幀處理的消息量還沒有收到的消息量大。這可是個(gè)很嚴(yán)重的問題,這會讓客戶端的表現(xiàn)與實(shí)際情況嚴(yán)重脫節(jié)。在這里,就需要有一個(gè)機(jī)制,保證消息在積攢超過一定數(shù)量時(shí),能得到及時(shí)的處理:

初始時(shí)間 = GetTickCount();
while( 消息隊(duì)列中還有消息 )
{
   if( 消息隊(duì)列中的消息數(shù)量 > 300 )
   {
      一次性處理所有的消息;
   }
   else
   {
      從隊(duì)列中取出第一條消息;
      處理這條消息;
      當(dāng)前時(shí)間 = GetTickCount();
      經(jīng)過時(shí)間 = 當(dāng)前時(shí)間 - 初始時(shí)間;
      if( 經(jīng)過時(shí)間 > 20 )
      {
         break;
      }
   }   
}
    這樣就解決了消息越積攢越多的問題,當(dāng)消息越攢越多時(shí),會一次性處理所有的消息。但這樣也會帶來一個(gè)問題,那就是在幀率比較低的機(jī)器上,當(dāng)需要處理的消息特別多時(shí)會出現(xiàn)周期性的卡頓。卡頓的原因就是那步一次性處理所有消息的操作。優(yōu)化的目的就是要避免這樣的卡頓,而對于低端機(jī)器來說,這樣的優(yōu)化不但沒有起到效果,反而加重了卡頓現(xiàn)象。為了彌補(bǔ)這個(gè)方法帶來的弊端,就要對那個(gè)經(jīng)過時(shí)間20ms做點(diǎn)手腳:

static 時(shí)間閾值 = 20;     //注意時(shí)間閾值是static的
if( 消息隊(duì)列中的消息數(shù)量 > 100 )
{
   ++時(shí)間閾值;
}
else
{
   --時(shí)間閾值;
}
if( 時(shí)間閾值 < 20 )
   時(shí)間閾值 = 20;
if( 時(shí)間閾值 > 40 )
   時(shí)間閾值 = 40;

初始時(shí)間 = GetTickCount();
while( 消息隊(duì)列中還有消息 )
{
   if( 消息隊(duì)列中的消息數(shù)量 > 300 )
   {
      一次性處理所有的消息;
   }
   else
   {
      從隊(duì)列中取出第一條消息;
      處理這條消息;
      當(dāng)前時(shí)間 = GetTickCount();
      經(jīng)過時(shí)間 = 當(dāng)前時(shí)間 - 初始時(shí)間;
      if( 經(jīng)過時(shí)間 > 時(shí)間閾值 )
      {
         break;
      }
   }   
}
    這里增加了時(shí)間閾值這個(gè)靜態(tài)變量,替代了之前代碼中的20,使之成為一個(gè)由當(dāng)前幀消息包數(shù)量決定的一個(gè)可變的值。當(dāng)前幀消息包的數(shù)量超過一個(gè)值時(shí),就將這個(gè)時(shí)間閾值加一,否則減一。這么做的效果就是,消息包來得越多,每幀用于處理消息的時(shí)間就越長,也就是說消息處理耗時(shí)的比重在逐漸上升。這樣就能很大程度上降低消息數(shù)量超過上限的可能性。
最差的情況,如果這樣做依然有周期性卡頓的話,這臺機(jī)器真的就不適合運(yùn)行這個(gè)游戲了,退一步講,不作這個(gè)優(yōu)化的話,這臺機(jī)器玩這個(gè)游戲也依然會卡得要命。:)
   當(dāng)然,時(shí)間閾值的范圍,和消息包的數(shù)量上限可以調(diào)整,以適合于不同的游戲。

posted on 2009-02-28 13:47 李侃 閱讀(1475) 評論(2)  編輯 收藏 引用 所屬分類: 前臺客戶端

評論

# re: 轉(zhuǎn)載—網(wǎng)絡(luò)游戲程序中解決加載卡頓的有效方法  回復(fù)  更多評論   

對于分?jǐn)偟蕉鄮姆桨福_實(shí)身有體會,記得以前做過一個(gè)游戲模板數(shù)據(jù)查詢的工具,是用MFC做的,由于一次性查找到的數(shù)據(jù)過多,一下子加載到列表控件中會引起很嚴(yán)重的停頓,于是我便學(xué)游戲的樣子將其放到多個(gè)幀中處理,程序仍然是單線程,但立馬流暢了很多。
2009-08-10 22:01 | 李現(xiàn)民

# re: 轉(zhuǎn)載—網(wǎng)絡(luò)游戲程序中解決加載卡頓的有效方法  回復(fù)  更多評論   

嗯,不錯(cuò),學(xué)習(xí)了。
2010-03-10 09:55 | 月隱
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲激情专区| 亚洲综合色视频| 一区二区三区欧美激情| 国产真实精品久久二三区| 欧美午夜免费影院| 欧美日韩精品福利| 国产精品久久久久久久久久久久| 欧美午夜视频在线| 国产精品嫩草99a| 国产欧亚日韩视频| 亚洲承认在线| 一区二区三区你懂的| 亚洲一区二区三区精品视频 | 免费观看成人鲁鲁鲁鲁鲁视频| 麻豆av一区二区三区| 欧美人与性动交cc0o| 国产精品久99| 亚洲第一中文字幕在线观看| 亚洲精品视频免费在线观看| 亚洲一区日本| 久热国产精品| 一本大道久久a久久综合婷婷| 亚洲午夜av在线| 久久噜噜噜精品国产亚洲综合| 蜜臀av性久久久久蜜臀aⅴ| 欧美精品日韩一区| 国产亚洲一区二区三区在线观看 | 欧美大胆人体视频| 亚洲手机视频| 欧美成人精品| 国产日韩在线一区| 亚洲午夜精品一区二区三区他趣| 欧美中文在线观看| 亚洲美女视频在线观看| 久久国产欧美精品| 国产精品手机视频| 日韩一区二区免费高清| 老司机成人在线视频| 亚洲一区二区精品在线| 欧美激情一区二区三区在线视频| 国产欧美 在线欧美| 亚洲午夜精品17c| 亚洲三级观看| 午夜久久电影网| 国产欧美视频一区二区| 国产在线精品一区二区夜色| 在线亚洲欧美| 亚洲观看高清完整版在线观看| 亚洲欧美日韩国产综合在线| 欧美精品手机在线| 伊人久久噜噜噜躁狠狠躁 | 国产精品成人观看视频免费| 亚洲黄页一区| 欧美成人黄色小视频| 午夜精品一区二区三区在线播放| 欧美性视频网站| 亚洲综合色激情五月| 99re热精品| 国产精品国码视频| 亚洲影院一区| 亚洲制服av| 国产欧美一区二区精品性| 午夜久久黄色| 午夜精品久久久久久久久| 国产精品亚洲片夜色在线| 亚洲欧美欧美一区二区三区| 亚洲午夜久久久久久久久电影网| 欧美日本一区| 亚洲欧美日韩精品久久久久| 亚洲一区二区三区四区视频 | 久久激情五月激情| 国产主播一区二区三区| 久久久综合免费视频| 久久久精彩视频| 亚洲欧洲综合另类| 99视频精品| 国产欧美一区二区色老头| 久久亚洲精品一区二区| 蜜臀av一级做a爰片久久| 99视频一区| 香蕉精品999视频一区二区 | 激情小说另类小说亚洲欧美| 美女免费视频一区| 女人色偷偷aa久久天堂| 亚洲午夜羞羞片| 亚洲欧美日韩精品一区二区| 国产一区二区三区四区hd| 欧美激情精品久久久久久变态| 欧美成人自拍视频| 亚洲免费视频一区二区| 久久精品国产一区二区电影 | 久久精品视频在线免费观看| 美国十次了思思久久精品导航| 亚洲精品日韩在线观看| 99精品国产在热久久下载| 国产精品尤物| 亚洲国内在线| 国产一区二区电影在线观看| 久久xxxx精品视频| 一本色道久久综合亚洲精品高清 | 久久国产精品一区二区| 最新中文字幕一区二区三区| 日韩视频久久| 狠狠色2019综合网| 9l视频自拍蝌蚪9l视频成人| 欧美成人小视频| 欧美一区网站| 欧美日韩精品欧美日韩精品一| 久久精品道一区二区三区| 蜜乳av另类精品一区二区| 欧美一区二区三区婷婷月色 | 免费中文字幕日韩欧美| 国产精品成人aaaaa网站| 欧美国产1区2区| 国产精品视频免费观看www| 亚洲国产专区校园欧美| 国产亚洲一区二区在线观看| 亚洲卡通欧美制服中文| 一区在线观看视频| 欧美一级夜夜爽| 日韩午夜精品| 欧美va天堂| 免费人成网站在线观看欧美高清| 国产精品视频成人| 中文在线不卡| 亚洲天堂成人在线观看| 欧美成人按摩| 亚洲国产欧美日韩| 在线精品国产欧美| 久久久久久黄| 另类酷文…触手系列精品集v1小说| 国产精品每日更新| 一本色道久久综合亚洲91| 99re热精品| 欧美激情综合网| 91久久在线视频| 亚洲精品美女| 欧美精品偷拍| 亚洲国产国产亚洲一二三| 亚洲电影免费在线观看| 久久男人资源视频| 欧美99在线视频观看| 亚洲福利国产| 欧美国产日本| 亚洲精品在线免费| 亚洲一区二区三区免费视频| 欧美日韩精品二区| 亚洲无吗在线| 久久精品国产第一区二区三区最新章节| 国产精品毛片va一区二区三区 | 老司机午夜精品视频| 亚洲国产毛片完整版| 亚洲国产日韩欧美在线动漫| 亚洲精品黄色| 国产精品久久久久久久久搜平片| 亚洲伊人一本大道中文字幕| 亚洲欧美日韩中文视频| 国产精品激情av在线播放| 99热精品在线| 欧美一区二视频| 一区二区视频免费在线观看| 久久免费视频在线观看| 欧美大色视频| 亚洲在线成人精品| 国产一区二区福利| 欧美日韩国产成人在线91| 亚洲系列中文字幕| 免费高清在线一区| 亚洲性色视频| 激情成人av| 欧美日韩国产一区二区三区地区| 午夜一区在线| 欧美大片在线观看一区二区| 亚洲午夜精品一区二区三区他趣| 国产精品视区| 欧美另类一区| 久久免费视频一区| 亚洲欧美日韩国产| 亚洲日本va在线观看| 久久精品人人| 亚洲午夜激情在线| 亚洲激情视频在线| 国产日韩精品一区观看| 欧美精品久久久久久久久久| 久久av一区| 亚洲图片在线| 亚洲三级性片| 欧美国产另类| 久久久久国产一区二区三区四区| 日韩一级在线| 亚洲欧洲偷拍精品| 激情欧美日韩| 国产视频精品xxxx| 国产精品狠色婷| 欧美搞黄网站| 久久久国产亚洲精品| 性色av一区二区三区| 一区二区免费在线播放| 亚洲精品免费一二三区| 欧美国产精品劲爆|