發(fā)布時(shí)間:2023-11-27 10:02:08 瀏覽量:102次
簡(jiǎn)介: 最近APP游戲化成為了一個(gè)新的風(fēng)口,把在游戲中一些好玩的、能吸引用戶的娛樂(lè)方式或場(chǎng)景應(yīng)用在應(yīng)用當(dāng)中,以達(dá)到增加用戶粘性,提升DAU的效果,成本較低。同時(shí)在一些需要對(duì)用戶有引導(dǎo)性的場(chǎng)景,游戲化還可以使用戶更易于接受并完成引導(dǎo)性任務(wù),并通過(guò)激勵(lì)的形式鼓勵(lì)用戶持續(xù)沉浸在任務(wù)當(dāng)中,形成良性循環(huán)?;谶@個(gè)思路,閑魚開發(fā)了互動(dòng)引擎Candy。
Candy 是閑魚技術(shù)團(tuán)隊(duì)設(shè)計(jì)開發(fā)的一款引擎:
APP嵌入式的、輕量級(jí)的、易于開發(fā)、性能穩(wěn)定的互動(dòng)引擎;繪制系統(tǒng)高度融合Flutter體系,游戲場(chǎng)景和Flutter UI支持無(wú)縫混排;動(dòng)畫系統(tǒng)對(duì)主流格式的支持友好且易擴(kuò)展。
本文講解我們?yōu)槭裁匆鲞@款引擎以及我們是如何設(shè)計(jì)這款引擎的。
緣起
目前APP內(nèi)嵌小游戲一般采用H5小游戲的方式,而這個(gè)方式存在一些隱患,并不被很多應(yīng)用商店推薦。因此我們需要尋找一種新的安全的方式來(lái)實(shí)現(xiàn)APP內(nèi)嵌小游戲,并且我們希望這個(gè)方式開發(fā)友好、性能穩(wěn)定、功能齊全;所以我們遵循這三點(diǎn)去尋找一種新的方式。
思考
我們主要通過(guò)下面三種思路來(lái)探討APP內(nèi)嵌小游戲:
采用Native的游戲能力
目前Native開發(fā)游戲生態(tài)并不是特別成熟,而且采用Native開發(fā),就必須面臨雙端兩套代碼的問(wèn)題,開發(fā)成本和后續(xù)維護(hù)成本都會(huì)比較高。
采用游戲引擎,比如Cocos-2dx、Unity等
雖然游戲引擎目前非常成熟,但是游戲引擎一般用于開發(fā)重度游戲,所以引擎大小一般比較大,引入游戲引擎會(huì)導(dǎo)致包大小增幅不小。而且游戲引擎比較復(fù)雜,所以引擎啟動(dòng)耗時(shí)較多,比較難做到游戲頁(yè)面秒開;游戲引擎加載進(jìn)來(lái)后內(nèi)存消耗都會(huì)比較大。游戲引擎和APP間的通信互動(dòng)相對(duì)較為麻煩,目前沒(méi)有比較好的混合棧支持。游戲引擎的UI能力較弱,無(wú)法勝任復(fù)雜的APP UI邏輯,若采用游戲引擎開發(fā)內(nèi)嵌小游戲,無(wú)法融合小游戲頁(yè)面內(nèi)游戲場(chǎng)景和Feeds等UI。
采用Flutter的輕量級(jí)互動(dòng)引擎
Flutter本身是基于Skia這個(gè)2D繪制引擎實(shí)現(xiàn)的跨端APP解決方案,所以它天然具備2D繪制能力,所以采用Flutter來(lái)實(shí)現(xiàn)App內(nèi)嵌小游戲存在可能。目前Flutter存在一些輕量級(jí)游戲引擎,比如Flame,這款引擎支持簡(jiǎn)單游戲邏輯和動(dòng)畫能力,同時(shí)整個(gè)游戲是以一個(gè)Widget的形式最終插入到APP中,可以讓小游戲頁(yè)面中游戲部分和UI部分完美融合。
綜上考慮,我們決定采用Flutter的輕量級(jí)互動(dòng)引擎。
Flame引擎目前是Flutter生態(tài)中比較不錯(cuò)的一款小游戲引擎,但是依然存在很多問(wèn)題:
游戲系統(tǒng)不完善:引擎只有Game和Componet,沒(méi)有Scene和GameObject概念,這樣會(huì)導(dǎo)致游戲?qū)ο笄短讖?fù)雜,對(duì)多場(chǎng)景不友好。引擎完全采用Canvas來(lái)實(shí)現(xiàn),游戲場(chǎng)景中無(wú)法實(shí)現(xiàn)局部刷新,存在性能隱患。缺少GUI系統(tǒng),場(chǎng)景內(nèi)嵌套UI比較難。缺少手勢(shì)事件系統(tǒng)。動(dòng)畫支持格式不主流:骨骼動(dòng)畫是通過(guò)Flare支持的,不支持DragonBones。粒子動(dòng)畫最近才上,對(duì)主流格式支持也不太友好。資源管理存在內(nèi)存問(wèn)題,資源加載后一直不會(huì)釋放。缺少機(jī)型適配能力。
基于這些考慮,我們決定重新設(shè)計(jì)一款Flutter互動(dòng)引擎:
對(duì)標(biāo)集團(tuán)的EVA引擎和業(yè)界的Unity引擎,完善游戲系統(tǒng)。復(fù)用Flutter局部刷新。復(fù)用Flutter UI作為GUI。復(fù)用Flutter手勢(shì)管理。實(shí)現(xiàn)支持主流格式的骨骼動(dòng)畫和粒子動(dòng)畫。復(fù)用APP資源庫(kù)(圖片庫(kù))。實(shí)現(xiàn)全局750適配。
其中2-4點(diǎn)本質(zhì)上是將互動(dòng)引擎的繪制系統(tǒng)融合入Flutter的繪制體系中,本文下面按解決上面問(wèn)題的思路依次介紹我們的引擎設(shè)計(jì)。
框架設(shè)計(jì)
首先分析游戲化業(yè)務(wù)需要哪些能力,分析我們的業(yè)務(wù)場(chǎng)景,得出游戲化業(yè)務(wù)需要圖4-1所示的能力:
圖4-1 游戲化業(yè)務(wù)能力需求
拆解后,互動(dòng)引擎需要有游戲系統(tǒng)、繪制系統(tǒng)、生命周期系統(tǒng)、GUI系統(tǒng)、物理系統(tǒng)、動(dòng)畫系統(tǒng)、資源系統(tǒng)、事件系統(tǒng)(手勢(shì)管理)。
根據(jù)我們之前的定位,互動(dòng)游戲繪制融合到Flutter繪制體系中來(lái),基于這個(gè)思路,我們可以復(fù)用Flutter的UI系統(tǒng),同時(shí)需要融合Flutter和游戲的手勢(shì)管理。最終我們得出如圖4-2所示的框架圖:
圖4-2 互動(dòng)引擎架構(gòu)
整個(gè)互動(dòng)引擎架構(gòu)共分為四部分:
接口層
對(duì)外暴露的游戲接口,主要包含創(chuàng)建游戲、創(chuàng)建游戲?qū)ο蟆⑻砑佑螒蚪M件等接口,同時(shí)還封裝了一些常用游戲?qū)ο?、常用游戲組件的工廠接口。
游戲系統(tǒng)
游戲世界的管理系統(tǒng),主要管理Game、Scene、GameObject和Compoent間的組織關(guān)系,還控制游戲子系統(tǒng)和繪制系統(tǒng)的啟動(dòng)與關(guān)閉。
游戲子系統(tǒng)
游戲化能力補(bǔ)充,主要包含生命周期系統(tǒng)、物理系統(tǒng)、動(dòng)畫系統(tǒng)和資源系統(tǒng),被游戲系統(tǒng)調(diào)用。
繪制系統(tǒng)
負(fù)責(zé)游戲的繪制,本引擎的繪制系統(tǒng)會(huì)高度和Flutter繪制邏輯融合,所以兼容了GUI系統(tǒng)和事件系統(tǒng)(手勢(shì)管理)。
游戲系統(tǒng)
對(duì)標(biāo)Unity設(shè)計(jì),游戲系統(tǒng)有下列四大元素:
Game:游戲類,負(fù)責(zé)整個(gè)游戲的管理,Scene的加載管理以及各子系統(tǒng)管理與調(diào)度。Scene:游戲場(chǎng)景類,負(fù)責(zé)游戲場(chǎng)景中各游戲?qū)ο蟮墓芾怼ameObject:游戲?qū)ο箢?,游戲世界中游戲?qū)ο蟮淖钚挝唬螒蚴澜缰械娜魏挝矬w都是GameObject。Component:游戲組件類,表示游戲?qū)ο蟮哪芰傩裕热鏢priteComponent表示精靈組件,表示繪制精靈的能力。
GameObject通過(guò)組合Component的形式來(lái)讓自己擁有各種能力,不同的組合讓GameObject相互之間不一樣。整個(gè)游戲系統(tǒng)的組織關(guān)系如圖4-3所示:
圖4-3 游戲組織形式
生命周期
對(duì)標(biāo)Unity和Flutter特性,我們?cè)O(shè)計(jì)了如表4-1所示的生命周期,共有八個(gè)回調(diào),基本可以滿足互動(dòng)游戲業(yè)務(wù)開發(fā)。
表4-1 生命周期
渲染系統(tǒng)
基于融合Flutter繪制體系思考,我們就不能全盤用Canvas來(lái)做整個(gè)游戲的繪制管理,我們需要將游戲?qū)ο蠛虵lutter的繪制對(duì)象RenderObject結(jié)合起來(lái),如圖4-4所示:
圖4-4 渲染映射
首先是Game的對(duì)象數(shù)和Flutter的三顆樹有效融合,所以每一個(gè)GameObject必須對(duì)應(yīng)一個(gè)Widget、Element和RenderObject。
融合過(guò)程主要需要解決以下問(wèn)題:
游戲的坐標(biāo)系與Flutter的布局轉(zhuǎn)換融合。動(dòng)態(tài)添加和刪除游戲?qū)ο蟮奶幚?。?dòng)態(tài)修改游戲繪制深度的處理。Flutter Inspector對(duì)游戲?qū)ο蟮闹С帧?/p>
整個(gè)繪制融合相對(duì)復(fù)雜,需要解決很多BadCase,后續(xù)會(huì)另撰文詳述互動(dòng)引擎繪制融合Flutter繪制體系的過(guò)程,本文不再贅述。
GUI系統(tǒng)
由于繪制已經(jīng)融合到Flutter體系,GameObject都會(huì)對(duì)應(yīng)Widget,所以我們可以設(shè)計(jì)一個(gè)特殊的GameObject,支持插入一段Flutter Widget樹,這樣我們就不需要另外實(shí)現(xiàn)GUI了,復(fù)用Flutter UI作為GUI即可。這個(gè)邏輯和繪制融合思路比較一致,將插入的Widget樹作為GUIWidget的孩子即可,在GUIRenderObject中打通layout、paint和hitTest邏輯即可。
這里給一段我們GUI的示例實(shí)例代碼,開發(fā)過(guò)程相對(duì)簡(jiǎn)單:
final GUIObject gui = IdleFishGame.createGUI(
'gui',
child: GestureDetector(
child: Container(
width: 100.0,
height: 60.0,
decoration: BoxDecoration(
color: const Color(0xFFA9CCE3),
borderRadius: const BorderRadius.all(
Radius.circular(10.0),
),
),
child: const Center(
child: Text(
'Flutter UI示例',
style: TextStyle(
fontSize: 14.0,
),
),
),
),
behavior: HitTestBehavior.opaque,
onTap: () {
print('UI被點(diǎn)擊了');
},
),
position: Position(100, 100),
);
game.scene.addChild(gui);
事件系統(tǒng)
在繪制融合到Flutter體系的基礎(chǔ)上,我們?nèi)诤狭耸录到y(tǒng),增加了手勢(shì)處理組件GestureBoxComponent,如圖4-5所示:
圖4-5 手勢(shì)競(jìng)技
整個(gè)融合過(guò)程分下列幾步:
GestureBoxComponent將開發(fā)者注冊(cè)手勢(shì)回調(diào)方法注冊(cè)到手勢(shì)識(shí)別器中。GameObject對(duì)應(yīng)的RenderObject復(fù)寫hitTest邏輯,按Flutter規(guī)范來(lái)處理點(diǎn)擊的hitTest。通過(guò)GestureBoxComponent來(lái)判斷點(diǎn)擊是否該被消費(fèi)。GameObject復(fù)寫handEvent來(lái)將點(diǎn)擊事件傳遞給GestureBoxComponent消費(fèi)。GestureBoxComponent收到點(diǎn)擊事件后,傳遞給手勢(shì)識(shí)別器處理。手勢(shì)識(shí)別器在將點(diǎn)擊傳給手勢(shì)競(jìng)技場(chǎng)開始手勢(shì)競(jìng)技,最終將勝出的手勢(shì)返回手勢(shì)識(shí)別器,最終返回并做出手勢(shì)事件響應(yīng),當(dāng)然這一步屬于Flutter邏輯了。
動(dòng)畫系統(tǒng)
我們目前動(dòng)畫主要支持骨骼動(dòng)畫和粒子動(dòng)畫,骨骼動(dòng)畫資源目前支持DragonBones,粒子動(dòng)畫資源目前支持EgretFeather。
資源系統(tǒng)
目前互動(dòng)引擎的資源系統(tǒng)相對(duì)簡(jiǎn)單,本文就簡(jiǎn)單介紹下。資源系統(tǒng)的設(shè)計(jì)思路是復(fù)用APP的資源系統(tǒng),確保整個(gè)APP只有一份資源庫(kù),減少內(nèi)存開銷和增大資源復(fù)用率。資源系統(tǒng)架構(gòu)如圖4-6所示,在游戲系統(tǒng)和資源系統(tǒng)中間增加了一層代理,兼容APP資源系統(tǒng)和兜底資源系統(tǒng)。若我們沒(méi)有注冊(cè)APP的資源系統(tǒng),系統(tǒng)會(huì)自動(dòng)調(diào)用兜底的資源系統(tǒng)。
兜底資源系統(tǒng)目前分兩部分:
兜底圖片庫(kù),復(fù)用Flutter的ImageCache,復(fù)用Flutter的能力做內(nèi)存管理。
動(dòng)畫JSON資源管理,目前只實(shí)現(xiàn)了JSON讀取邏輯,由于JSON復(fù)用性不高,所以目前并沒(méi)有實(shí)現(xiàn)緩存管理。
圖4-6 資源系統(tǒng)
目前資源系統(tǒng)沒(méi)有做遠(yuǎn)程加載和預(yù)加載的能力,這部分在我們的后續(xù)規(guī)劃中,后續(xù)我們?cè)僮姆窒砭唧w設(shè)計(jì)實(shí)現(xiàn)。
本文主要講述了Candy互動(dòng)引擎的設(shè)計(jì),而我們?cè)谠O(shè)計(jì)實(shí)現(xiàn)過(guò)程中遇到了很多問(wèn)題,如發(fā)現(xiàn)了Flutter在繪制過(guò)程中存在一定的內(nèi)存泄露,內(nèi)存回收不及時(shí)等,我們后續(xù)會(huì)詳述這些問(wèn)題的排查與解決,同時(shí)還會(huì)對(duì)Candy引擎的性能與穩(wěn)定性方面做詳細(xì)測(cè)試分析。
熱門資訊
探討游戲引擎的文章,介紹了10款游戲引擎及其代表作品,涵蓋了RAGE Engine、Naughty Dog Game Engine、The Dead Engine、Cry Engine、Avalanche Engine、Anvil Engine、IW Engine、Frostbite Engine、Creation引擎、Unreal Engine等引擎。借此分析引出了游戲設(shè)計(jì)領(lǐng)域和數(shù)字藝術(shù)教育的重要性,歡迎點(diǎn)擊咨詢報(bào)名。
2. 手機(jī)游戲如何開發(fā)(如何制作傳奇手游,都需要準(zhǔn)備些什么?)
?如何制作傳奇手游,都需要準(zhǔn)備些什么?提到傳奇手游相信大家都不陌生,他是許多80、90后的回憶;從起初的端游到現(xiàn)在的手游,說(shuō)明時(shí)代在進(jìn)步游戲在更新,更趨于方便化移動(dòng)化。而如果我們想要制作一款傳奇手游的
3. B站視頻剪輯軟件「必剪」:免費(fèi)、炫酷特效,小白必備工具
B站視頻剪輯軟件「必剪」,完全免費(fèi)、一鍵制作炫酷特效,適合新手小白。快來(lái)試試!
4. Steam值得入手的武俠游戲盤點(diǎn),各具特色的快意江湖
游戲中玩家將面臨武俠人生的掙扎抉擇,戰(zhàn)或降?殺或放?每個(gè)抉定都將觸發(fā)更多愛(ài)恨糾葛的精彩奇遇?!短烀嬗肪哂卸嗑€劇情多結(jié)局,不限主線發(fā)展,高自由...
5. Bigtime加密游戲經(jīng)濟(jì)體系揭秘,不同玩家角色的經(jīng)濟(jì)活動(dòng)
Bigtime加密游戲經(jīng)濟(jì)模型分析,探討游戲經(jīng)濟(jì)特點(diǎn),幫助玩家更全面了解這款GameFi產(chǎn)品。
6. 3D動(dòng)畫軟件你知道幾個(gè)?3ds Max、Blender、Maya、Houdini大比拼
當(dāng)提到3D動(dòng)畫軟件或動(dòng)畫工具時(shí),指的是數(shù)字內(nèi)容創(chuàng)建工具。它是用于造型、建模以及繪制3D美術(shù)動(dòng)畫的軟件程序。但是,在3D動(dòng)畫軟件中還包含了其他類型的...
7. 3D動(dòng)漫建模全過(guò)程,不是一般人能學(xué)的會(huì)的,會(huì)的多不是人?
步驟01:面部,頸部,身體在一起這次我不準(zhǔn)備設(shè)計(jì)圖片,我從雕刻進(jìn)入。這一次,它將是一種純粹關(guān)注建模而非整體繪畫的形式。像往常一樣,我從Sphere創(chuàng)建它...
8. 如何自己開發(fā)一款游戲(游戲開發(fā)入門必看:五大獨(dú)立游戲開發(fā)技巧)
?游戲開發(fā)入門必看:五大獨(dú)立游戲開發(fā)技巧無(wú)論您是剛剛起步開發(fā)自己的第一款游戲,還是已經(jīng)制作了幾款游戲,本篇文章中的5大獨(dú)立游戲開發(fā)技巧都可以幫助您更好地設(shè)計(jì)下一款游戲。無(wú)論你對(duì)游戲有著什么樣的概念,都
?三昧動(dòng)漫對(duì)于著名ARPG游戲《巫師》系列,最近CD Projekt 的高層回應(yīng)并不會(huì)推出《巫師4》。因?yàn)椤段讕煛废盗性诓邉澋臅r(shí)候一直定位在“三部曲”的故事框架,所以在游戲的出品上不可能出現(xiàn)《巫師4》
10. 3D打印技巧揭秘!Cura設(shè)置讓你的模型更堅(jiān)固
想讓你的3D打印模型更堅(jiān)固?不妨嘗試一下Cura參數(shù)設(shè)置和設(shè)計(jì)技巧,讓你輕松掌握!
最新文章
同學(xué)您好!