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

天地之靈

Seed Engine中的輸入系統(tǒng)(一)、底層架構(gòu)、歷史

今天看了叛大的 KlayGE中輸入系統(tǒng)的改進(jìn)系列文章,覺(jué)得可以談?wù)凷eed Engine中的輸入系統(tǒng)。
因?yàn)镾eed Engine誕生之初,就定位為主要面向Android、iOS等移動(dòng)設(shè)備(直到2012年6月才有了Flash平臺(tái)的內(nèi)部版本,才開(kāi)始正式需求鼠標(biāo)事件),所以Seed的輸入模塊除了對(duì)鍵盤(pán)做了簡(jiǎn)單支持(主要是出于調(diào)試目的)外,在很長(zhǎng)的一段時(shí)間內(nèi),鼠標(biāo)事件都是被wrap成為觸摸事件。所有后續(xù)關(guān)于輸入的工作都是針對(duì)觸摸來(lái)做的。所以這篇文章主要重點(diǎn)講觸摸這個(gè)方面,尤其是手勢(shì)識(shí)別的做法。
在Seed發(fā)展至今的期間,面臨了大量復(fù)雜的需求,不斷改進(jìn)完善,目前還有很多不盡善盡美的地方。這篇文章會(huì)回顧一下這個(gè)過(guò)程,重點(diǎn)介紹一下當(dāng)前的處理機(jī)制,再展望一下將來(lái)期望進(jìn)行的改進(jìn)工作。

Seed目前總計(jì)支持四種輸入:鍵盤(pán)、鼠標(biāo)、觸摸、重力感應(yīng)。
所有的輸入會(huì)被響應(yīng)的處理模塊封裝成一個(gè)struct,這個(gè)struct的頭四個(gè)字節(jié)表明了觸摸的類(lèi)型。在單線(xiàn)程模式下,這個(gè)struct會(huì)被直接傳遞給應(yīng)用。在多線(xiàn)程模式下,這個(gè)struct會(huì)在堆上分配,將指針傳遞給邏輯線(xiàn)程。這樣的好處是在邏輯線(xiàn)程忙的時(shí)候,消息處理函數(shù)可以更及時(shí)返回,避免諸如窗口拖動(dòng)卡頓之類(lèi)的問(wèn)題。
這一部分極其簡(jiǎn)單,因?yàn)楹?jiǎn)單,所以不容易出問(wèn)題。之所以把底層架構(gòu)放在歷史之前談,正是因?yàn)樽詮?011年10月份Seed誕生以來(lái),引擎的這部分代碼幾乎從未變過(guò)。
對(duì)于Lua層來(lái)說(shuō),這部分的接口一直表現(xiàn)為一個(gè)全局事件,input.key、input.touch等等,參數(shù)struct會(huì)被iLuaWrapper(Seed中一個(gè)神秘組件)包裝成Lua可以直接訪問(wèn)的數(shù)據(jù),由Lua腳本去做任何上層的處理。

裸奔時(shí)代

Seed誕生以后的一段時(shí)間內(nèi),當(dāng)時(shí)的工作重心在完善2D渲染基礎(chǔ)、2D場(chǎng)景管理,2D物理等等較為繁雜的模塊上。因?yàn)闆](méi)有具體項(xiàng)目的負(fù)擔(dān),當(dāng)時(shí)的輸入模塊只以滿(mǎn)足調(diào)試需求、實(shí)現(xiàn)簡(jiǎn)單交互為目的。因此,Seed在2011年10月以前,一直處在輸入裸奔的狀態(tài)。譬如只用鍵盤(pán)做操控,那就直接注冊(cè)input.key去監(jiān)聽(tīng)需要的事件。為了實(shí)現(xiàn)諸如簡(jiǎn)單的按鈕之類(lèi)的功能,當(dāng)時(shí)產(chǎn)生了一堆垃圾代碼,在事件里直接判定坐標(biāo)等等。當(dāng)然,這樣寫(xiě)代碼是不可能做出沒(méi)有BUG的游戲來(lái)的,于是我們?cè)谝粋€(gè)游戲項(xiàng)目的原型階段結(jié)束后不久的時(shí)間,迅速推出了第一套框架。

山寨時(shí)代

因?yàn)樾枨缶o迫,做任何游戲至少都少不了做一堆能tap的button出來(lái),所以我們抓緊推出了第一版的input_ex插件。
input_ex以盡可能簡(jiǎn)單的方式實(shí)現(xiàn)了對(duì)指定對(duì)象的觸摸事件處理。場(chǎng)景中的node可以被注冊(cè)到input_ex中,以接受tap、hold、drag事件。在touchdown的時(shí)候,input_ex會(huì)遍歷所有注冊(cè)的結(jié)點(diǎn)以找到被命中的node,之后的消息都會(huì)派發(fā)給這個(gè)node。
好吧,至少現(xiàn)在可以創(chuàng)建一堆不同的button了。input_ex的嚴(yán)重不足主要體現(xiàn)在功能上:
        1、input_ex中的手寫(xiě)狀態(tài)機(jī),幾乎決定了除了tap、hold、drag以外,每加一個(gè)新的操作種類(lèi)都是一個(gè)巨大的困難。
        2、input_ex不能很好的處理多點(diǎn)觸摸。在多點(diǎn)的設(shè)備上各種出問(wèn)題,以至于后來(lái)在某些項(xiàng)目里,強(qiáng)行屏蔽了除了1號(hào)手指(對(duì)應(yīng)安卓里的0號(hào)手指)以外的所有操作。
        3、消息最開(kāi)始就確定了對(duì)象,隨后的過(guò)程不能改變消息的對(duì)象。譬如一個(gè)scrollview上面有一堆button,那么當(dāng)button截獲了消息的時(shí)候,scrollview就無(wú)法處理相應(yīng)的拖拽事件了。
除此以外,在使用上,每個(gè)節(jié)點(diǎn)存在一個(gè)獨(dú)立的用于處理輸入的對(duì)象,其生命周期需要手動(dòng)管理,錯(cuò)誤的使用會(huì)導(dǎo)致各種問(wèn)題。初學(xué)者幾乎很難寫(xiě)出正確的代碼。因?yàn)閷?shí)現(xiàn)復(fù)雜,input_ex本身也在很長(zhǎng)的時(shí)間內(nèi)都存在引用關(guān)系的BUG,導(dǎo)致不需要的資源不能被正確的釋放。總體來(lái)說(shuō),使用input_ex插件做游戲簡(jiǎn)直是一段不堪回憶的黑歷史。

山寨時(shí)代之后

在使用input_ex完成了三四個(gè)界面操作簡(jiǎn)單的小游戲后,我們開(kāi)始構(gòu)思新的輸入系統(tǒng)。我們理想中的輸入系統(tǒng)應(yīng)該符合如下幾個(gè)條件:
1、很好的支持多點(diǎn)觸摸。這包含兩方面:第一,必須能夠很好的識(shí)別利用多個(gè)手指的操作,譬如scale, pinch, rotate等。第二,我們認(rèn)為對(duì)于大屏幕的觸屏設(shè)備,能讓多個(gè)玩家在不同的地方互不干擾的進(jìn)行多個(gè)操作也是很有必要的需求,這會(huì)給游戲設(shè)計(jì)師帶來(lái)很多新奇的玩法創(chuàng)意。
2、一定要很方便的加入各種不同的操作識(shí)別。我們希望能夠?qū)崿F(xiàn)很多有創(chuàng)意的小游戲,依靠觸摸的操作來(lái)做很多有意思的事情。我們也希望我們的界面能夠交互起來(lái)更酷,可以操作控制的地方更多。那么操作一定不能只局限于區(qū)區(qū)數(shù)種,一定要在特定的游戲里就能通過(guò)代碼添加大量不同的全新操作才行。
3、操作對(duì)象的識(shí)別更智能。在scrollview 上面的button做scroll操作時(shí),操作對(duì)象要能正確的變成scrollview。
4、根據(jù)操作對(duì)象所接受的事件有所不同,以及其父結(jié)點(diǎn)所接受的事件有所不同,對(duì)同一事件的處理可能會(huì)有差別。譬如一個(gè)button接受tap,當(dāng)觸摸并移動(dòng)的時(shí)候,只要沒(méi)移開(kāi)范圍,邏輯應(yīng)等待手指松開(kāi)時(shí)再判定為tap成功(正如你在windows下按住一個(gè)按鈕然后小范圍拖動(dòng)鼠標(biāo),click并不會(huì)因此而失敗)。但假如這個(gè)button有一個(gè)父結(jié)點(diǎn)甚至是祖先結(jié)點(diǎn)接受drag,那么早在剛開(kāi)始移動(dòng)的時(shí)候,就應(yīng)該判定為tap取消,事件轉(zhuǎn)為drag事件而派發(fā)給相應(yīng)的祖先結(jié)點(diǎn)。
5、不會(huì)為了滿(mǎn)足上面的需求,把上層邏輯代碼搞的太麻煩。最理想的情況下,上層邏輯代碼只要選擇好自己所接受的操作種類(lèi),然后安心等待事件監(jiān)聽(tīng)器被調(diào)用就好了。
而我們不想要:
1、像安卓那樣復(fù)雜的事件分派機(jī)制,所有的觸摸都被綁在一起依次分派下去,在結(jié)點(diǎn)上依據(jù)類(lèi)型的不同寫(xiě)代碼去做對(duì)應(yīng)的操作。必須要有一個(gè)很好的手勢(shì)識(shí)別底層,僅僅把結(jié)點(diǎn)關(guān)心的信息拋給它。
2、像HTML DOM那樣的事件冒泡機(jī)制。因?yàn)橛|摸處理的復(fù)雜性,在touch down的時(shí)候往往根本不能確定真正用戶(hù)想要進(jìn)行何種操作。而如果等操作進(jìn)行完了才給予反饋,那操作過(guò)程就很難得到非常及時(shí)的反饋。在上述scrollview和button的例子里,button必須首先獲得事件以立即展現(xiàn)被按下的效果,等到用戶(hù)的操作能夠明確為一個(gè)scroll操作之后,再由scrollview來(lái)處理后續(xù)的事件。再加上之前所述的期望4,已經(jīng)不是簡(jiǎn)單的對(duì)同一事件的冒泡足以滿(mǎn)足的。
真的有一套框架能完美的解決我們的需求嗎?下一章起,我會(huì)逐步講解我們?yōu)榇怂龅呐Α?/div>

posted on 2013-04-12 01:31 天地之靈 閱讀(164) 評(píng)論(0)  編輯 收藏 引用


只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

導(dǎo)航

統(tǒng)計(jì)

  • 隨筆 - 7
  • 文章 - 2
  • 評(píng)論 - 11
  • 引用 - 0

常用鏈接

留言簿(3)

隨筆檔案

文章檔案

搜索

  •  

最新評(píng)論

閱讀排行榜

評(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>
              欧美大片91| 亚洲一区在线观看免费观看电影高清| 久久精品视频免费| 亚洲精品久久久久久一区二区| 亚洲欧美日韩另类| 欧美巨乳在线观看| 日韩一区二区福利| 欧美成人一区二区三区在线观看| 亚洲小说区图片区| 欧美日韩在线精品一区二区三区| 亚洲国产福利在线| 久久久精品视频成人| 亚洲一二三区视频在线观看| 欧美啪啪成人vr| 91久久久久久国产精品| 欧美韩国一区| 久久综合免费视频影院| 狠狠v欧美v日韩v亚洲ⅴ| 性色av一区二区三区在线观看 | 欧美日韩四区| 一区二区三区四区精品| 亚洲人精品午夜| 久久夜色精品国产| 在线观看福利一区| 亚洲电影第1页| 欧美日韩视频免费播放| 亚洲一区bb| 亚洲综合电影| 国产一区深夜福利| 狂野欧美性猛交xxxx巴西| 午夜精品亚洲一区二区三区嫩草| 国产精品久久久久久久第一福利 | 亚洲视频免费| 99视频在线精品国自产拍免费观看 | 欧美暴力喷水在线| 欧美黑人多人双交| 亚洲淫性视频| 欧美一区二区三区视频| 亚洲第一中文字幕在线观看| 亚洲第一区在线观看| 欧美国产第一页| 亚洲欧美国产77777| 亚洲欧美色一区| 亚洲精品三级| 欧美一区二区在线视频| 亚洲黄色成人久久久| 一本色道久久精品| 国产综合激情| 99精品黄色片免费大全| 国产日韩精品一区| 亚洲国产专区校园欧美| 国产精品视频免费在线观看| 免费久久久一本精品久久区| 欧美理论大片| 久久亚洲欧美| 国产精品久久久久久久app| 免费日韩一区二区| 国产精品视频一区二区高潮| 亚洲午夜视频| 久久久国产精品亚洲一区| 欧美xxx成人| 午夜一级久久| 久久蜜桃香蕉精品一区二区三区| 亚洲免费观看| 久久久久久91香蕉国产| 亚洲永久精品国产| 欧美高清在线精品一区| 久久精品盗摄| 欧美亚韩一区| 亚洲黄色成人久久久| 国产一区二区高清视频| 亚洲日本激情| 亚洲国产精品999| 欧美伊人久久久久久午夜久久久久 | 在线免费不卡视频| 一区二区高清| 亚洲精品精选| 女仆av观看一区| 免播放器亚洲一区| 国产在线观看精品一区二区三区| 夜夜夜精品看看| 亚洲私人影吧| 欧美日韩另类在线| 亚洲黄色成人久久久| 亚洲国产免费看| 久久一区二区视频| 久久午夜av| 好看的日韩视频| 久久国产精品久久久久久久久久| 亚洲视频久久| 欧美视频日韩视频在线观看| 亚洲国产天堂久久综合网| 亚洲高清在线| 麻豆久久精品| 欧美91大片| 亚洲精品国产品国语在线app| 美女日韩欧美| 亚洲国产99精品国自产| 亚洲精品一区二区三区樱花| 欧美freesex交免费视频| 欧美激情亚洲视频| 亚洲精品五月天| 欧美日韩综合精品| 亚洲视频在线观看一区| 欧美亚洲在线视频| 国产丝袜一区二区三区| 久久丁香综合五月国产三级网站| 久久久中精品2020中文| 又紧又大又爽精品一区二区| 久久蜜桃av一区精品变态类天堂| 免费成人高清视频| 亚洲美女黄色| 国产精品乱码| 久久久久国产精品一区三寸| 欧美成人亚洲成人日韩成人| 91久久夜色精品国产九色| 欧美福利电影网| 亚洲素人一区二区| 久久视频免费观看| 亚洲精品美女久久7777777| 欧美激情按摩| 亚洲欧美电影院| 欧美高清在线精品一区| 亚洲视频一区| 国模吧视频一区| 欧美成人激情在线| 午夜一区不卡| 欧美a级片网| 亚洲午夜女主播在线直播| 久久久www成人免费毛片麻豆| 精品二区久久| 欧美黄网免费在线观看| 午夜久久电影网| 欧美激情视频免费观看| 中文在线资源观看视频网站免费不卡| 国产精品久久久一本精品| 久久久无码精品亚洲日韩按摩| 亚洲高清不卡av| 亚洲综合欧美日韩| 精品99一区二区三区| 欧美三级视频在线| 久久亚洲综合网| 亚洲深夜福利| 亚洲欧洲一区二区在线播放| 久久久久久夜| 一本大道av伊人久久综合| 国内精品视频666| 欧美日韩一区二区免费视频| 久久久精品日韩| 亚洲一区图片| 亚洲精品三级| 欧美国产综合一区二区| 久久久国产精品一区二区三区| 亚洲午夜高清视频| 在线不卡中文字幕播放| 国产日韩欧美一区二区三区在线观看| 猛男gaygay欧美视频| 亚洲欧美在线免费观看| 一本色道久久精品| 亚洲毛片网站| 亚洲精品老司机| 亚洲国产高清一区二区三区| 久久一区二区精品| 久久精彩视频| 久久国产精品72免费观看| 亚洲图片你懂的| 在线亚洲精品| 一区二区三区黄色| 中国成人亚色综合网站| 99riav久久精品riav| 亚洲精品视频啊美女在线直播| 国内成+人亚洲| 国产亚洲精品资源在线26u| 国产精品福利片| 国产精品乱码一区二三区小蝌蚪| 欧美久久成人| 欧美国产免费| 欧美精品免费在线观看| 欧美激情国产日韩精品一区18| 另类av导航| 欧美freesex交免费视频| 噜噜噜久久亚洲精品国产品小说| 久久精品国产综合精品| 午夜精品免费在线| 欧美一区2区视频在线观看| 亚洲欧美国产视频| 欧美在线播放一区| 久久久91精品国产一区二区精品| 午夜精品成人在线视频| 欧美亚洲视频在线看网址| 欧美中文字幕| 久久久久一区二区| 久久综合网色—综合色88| 欧美大片在线观看一区| 欧美国产一区二区在线观看 | 久热精品在线视频| 欧美成人精品在线播放| 欧美美女bb生活片| 国产精品一区二区男女羞羞无遮挡| 国产精品jizz在线观看美国 |