在 Android 游戲開發(fā)工具大升級中,我們介紹了 Android 游戲開發(fā)套件的豐富功能和多項 API 改進,并針對大屏幕設備的游戲開發(fā)提供了一些建議,同時介紹了處理、分發(fā)大型游戲素材的最佳實踐。本文我們將提供幾則在游戲性能優(yōu)化方面的技巧,同時向您介紹 Android 在游戲方面引入的新特性。讓我們一起打造卓越的 Android 游戲體驗吧!
如果您更喜歡通過視頻了解此內(nèi)容,請在此處查看:
△Android 游戲開發(fā)工具大升級
Bilibili 視頻鏈接
https://www.bilibili.com/video/BV1B34y1Y7SR/
游戲性能調(diào)優(yōu)
在上一篇文章中,我們了解了如何通過合理的 DPI 選擇、紋理優(yōu)化等方式讓游戲在更多的硬件上運行。然而僅僅能運行還不夠,或許您也非常希望能了解這些選擇和配置是否為玩家提供了足夠優(yōu)秀的用戶體驗,以及接下來有哪些方法能幫助您不斷優(yōu)化應用,并逐漸將應用推廣至更大的用戶群中。
配置 APT 庫
Android 性能調(diào)優(yōu)工具 (Android Performance Tuner,APT) 是專門用于開發(fā)者了解游戲性能數(shù)據(jù)的工具。它可以在 Android Vitals 中幫助您洞察游戲性能表現(xiàn),使您能夠在整個 Android 設備生態(tài)中衡量和優(yōu)化自己的游戲保真度、加載時間、幀率。并且所有的數(shù)據(jù)都是來自真實的設備和真實的玩家,具有極高的參考價值。
void InitAPI(JNIEnv* env, jobject activity) { SwappyGL_init(env, activity); swappy_enabled = SwappyGL_isEnabled(); TFSettings settings {}; if (swappy_enabled) { settings.swappy_tracer_fn = &SwappyGL_injectTracer; } // ...}
△ 使用 Swappy_injectTracer 自動記錄幀信息
要使用 APT 庫,您需要在每一幀中調(diào)用一個 tick 函數(shù)。不過如果您已經(jīng)使用了 Android FramePacing 庫,則通過 FramePacing API 初始化時傳入 Swappy_injectTracer 函數(shù)就可以自動記錄幀時間了。
如果您用到了 Unity 游戲引擎,則可以導入我們的自定義軟件包 (插件),然后從 Window --> Android Performance Tuner --> Setup 菜單進入設置界面來啟用和配置它。此外您還可以使用設置腳本來初始化 APT 工具。如果您希望了解關于 Unity 游戲引擎的更多信息和使用幫助,請參閱 Unity Codelab 將 Android 性能調(diào)優(yōu)工具整合進您的 Unity 游戲:
https://developer.android.google.cn/codelabs/android-performance-tuner-unity#0 △?Android 性能調(diào)優(yōu)工具與 Unity 結(jié)合使用 下一步是定義注解參數(shù),并將它們與游戲中的質(zhì)量級別、場景或其他值得關注的信息關聯(lián)起來。隨后,您需要在適當?shù)纳舷挛恼{(diào)用 APT 的 API。
△?Unity 的 APT 插件中設置注解參數(shù)
如果您使用了 Unity 的 Android 性能調(diào)優(yōu)工具插件,那么可以在配置面板的注解參數(shù)中看到幾個默認的注解:
場景 (Scene) 注解映射到當前處于前臺的游戲場景;
加載狀態(tài) (LoadingState);
當然,您也可以在上圖的界面里添加更多自定義注解參數(shù)。如果您集成了 C/C++ 的引擎,那么需要您用 Protocol Buffers 來定義這些注解:
import "tuningfork.proto"enum LoadingState { INVALID_LS = 0; LOADING = 1; NOT_LOADING = 2;}enum Level { INVALID_LEVEL = 0; Level_1 = 1; Level_2 = 2; Level_3 = 3;}message Annotation { optional LoadingState loading_state = 1; optional Level level = 2;}
△定義注解參數(shù)
您還可以在 Codelab: 使用 Proto DataStore 中了解到更多關于使用 Protocol Buffers 的內(nèi)容: https://developer.android.google.cn/codelabs/android-proto-datastore#0
extern "C"void SetAnnotations() { Annotation a; a.set_loading( sLoading ? proto_tf::LOADING : proto_tf::NOT_LOADING ); a.set_level((proto_tf::Level) sLevel) auto ser = tf::TuningFork_CProtobufSerialization_Alloc(a); TuningFork_setCurrentAnnotation(&ser); TuningFork_CProtobufSerialization_free(&ser);}
△設置注解參數(shù)的值
隨后,您需要調(diào)用 APT 的 API 告知上下文發(fā)生了變化,參見上面的代碼。
完成 APT 庫的集成和注解參數(shù)配置后,您需要在 Google Cloud Console 中啟用 Android Performance Parameters API,這樣才能開始收集玩家數(shù)據(jù)。參照下圖找到該 API 并啟用:
△?在 Google Cloud Console 中啟用 APT
游戲加載時間調(diào)優(yōu)
對于玩家來說,游戲的加載時間很大程度影響了他們在閑暇時間打開游戲的意愿。有了 APT,您可以清楚地看到在不同設備、不同啟動類型下游戲加載時間的統(tǒng)計圖表: △?Android 性能調(diào)優(yōu)工具顯示的加載時間 如下圖所示,startRecordingLoadingTime 方法可以使用給定的事件元數(shù)據(jù)和注釋創(chuàng)建一個加載時間事件,并且將參數(shù)中的句柄 (handle) 設置為剛才創(chuàng)建的加載事件,便于后面使用 stopRecordingLoadingTime 方法結(jié)束時間記錄過程。
△?Android 性能調(diào)優(yōu)工具記錄加載時間的兩個函數(shù) 您一定要記得調(diào)用 stopRecordingLoadingTime 方法,它會結(jié)束此前啟動的加載時間事件,暫存剛才記錄的結(jié)果,并于下一次會話清理時將事件記錄上傳到 Google Cloud 進行統(tǒng)計分析。加載時間事件中包含了許多元數(shù)據(jù),可以幫助我們正確地區(qū)分不同場景下的加載時間,比如應用首次冷啟動、后臺轉(zhuǎn)前臺運行、加載新關卡等。如果涉及到網(wǎng)絡加載,還會顯示加載的數(shù)據(jù)源和網(wǎng)絡類型信息。參見圖中的結(jié)構(gòu)體定義:?
△Android 性能調(diào)優(yōu)工具中加載時間事件包含的元數(shù)據(jù)
除了提供上面的幾個注解,您還可以添加一些自定義的注解來幫助鎖定引起性能問題的源頭。創(chuàng)建資源加載組也是一種不錯的方法,比如,當您的游戲從 CDN 下載資源時,會形成大量可以單獨追蹤的下載任務和解壓任務,為它們創(chuàng)建資源加載組可以很方便地分析這些任務執(zhí)行的性能表現(xiàn)。
這些組也可以添加注解,這樣您就可以看到造成特定場景加載緩慢的原因了。此時需要使用另一組方法,圖中給出的是啟動記錄的方法 startLoadingGroup 的函數(shù)簽名:
△startLoadingGroup 函數(shù)簽名 當您完成這些集成和調(diào)用后,耐心等待一段時間,Google Play 控制臺的 Android Vitals 中就將顯示這些加載時間的統(tǒng)計信息,比如:首次加載、冷加載、熱加載、關卡加載時間等等。您可以很方便地了解到用戶是否因為加載時間過長,而失去耐心退出游戲,還可以深入了解哪些設備或者關卡可能遇到了問題。
△在 Android Vitals 查看游戲加載時間統(tǒng)計信息
Android Vitals 也可以顯示幀率的統(tǒng)計信息,呈現(xiàn)方式非常類似: △?在 Android Vitals 查看游戲幀率統(tǒng)計信息 您可以從中了解到哪些設備的性能不足以支撐游戲流暢運行,哪些場景造成的幀率下降問題最嚴重。有了這些信息,您就可以優(yōu)先針對那些最需要調(diào)整優(yōu)化的用戶群進行改進,讓您的游戲能在盡可能多的設備上暢玩。
覆蓋面和設備
最近我們在 Google Play 控制臺提供了 "覆蓋面和設備 (Reach and devices)" 功能,它可以幫助您更好地了解游戲覆蓋的設備、國家區(qū)域以及在游戲生命周期內(nèi)的測試和優(yōu)化。您可以看到游戲的分布情況、安裝趨勢、崩潰率等統(tǒng)計信息,便于深入了解玩家和他們遇到的問題。
△安裝分布和趨勢統(tǒng)計信息 您還可以從多個維度分析這些數(shù)據(jù),比如 SoC (System-on-Chip)、圖形 API (如 OpenGL 和 Vulkan) 等:
△從多種維度分析數(shù)據(jù) 您還可以用自己的游戲數(shù)據(jù)與同類游戲的公開數(shù)據(jù)進行比較,從而發(fā)現(xiàn)新的開發(fā)方向,在著手開發(fā)下一版本之前做好充分的準備。另外,針對國家/地區(qū)的過濾條件能幫助您精確制定發(fā)布和擴張的計劃。最后,您還可以選擇導出這些統(tǒng)計數(shù)據(jù),點擊如圖所示的 "Export report" 即可:
△導出統(tǒng)計數(shù)據(jù)報告
Android GPU 檢查器
剛才我們從統(tǒng)計報告中基本確定了需要針對優(yōu)化的方面,那么該怎樣做呢?Android GPU 檢查器不僅能提供游戲運行期間系統(tǒng)活動、高頻硬件計數(shù)器的事件跟蹤記錄,還可以用類似 systrace 的工具在時間軸上繪制出時間占用圖像。
Android GPU 檢查器在兩年前新增了對 GPU 顯存信息的支持、使用 ANGLE 提供了 OpenGL ES 支持。在兼容了更多設備的同時,也增加了幀檢查器 (Frame Profiler),它可以幫助您深入檢查單個渲染幀,查看分解后的渲染通道級別的時間信息。另外,幀檢查器還能幫您檢查分析包括紋理、幾何體、著色器、渲染管線在內(nèi)的多種 GPU 信息,從而分析某一幀內(nèi)進行的各種 GPU 活動。
△?Android GPU 檢查器的新功能
我們也正在與更多的設備制造商合作,希望能盡快為您提供更多的現(xiàn)有設備支持。
跨設備暢玩
截至目前,我們已經(jīng)實現(xiàn)了在更多的屏幕類型上運行您的游戲,試想這樣一個場景:您的玩家在下班路上掏出手機玩了一會兒游戲,到家后一陣忙碌,終于躺在沙發(fā)上,想要打開平板接著玩。那么如何保證玩家可以在平板上繼續(xù)剛才手機上的游戲進度呢?
Google Play 游戲 SDK 為您提供了便捷的方法實現(xiàn)剛才的場景。它可以讓玩家登錄,并保存和同步游戲進度。這樣一來,當同一賬號在另一臺設備登錄時,您的游戲就可以檢索并且取回服務器上的玩家數(shù)據(jù),讓他們可以直接從最后保存的時間點繼續(xù)進行。同時,您還可以集成一些熱門功能,比如游戲的成就系統(tǒng)、玩家排行榜等。
我們正在持續(xù)完善 Google Play 游戲服務,它提供了一個更加簡化的登錄 API,您可以在先行體驗版的 SDK 中用一行代碼實現(xiàn)登錄功能,如下所示:
GamesSignInClient signInCli = PlayGames.getGamesSignInClient(this);signInCli.isAuthenticated().addOnCompleteListener(task -> { boolean isAuthenticated = task.isSuccessful() && task.getResult().isAuthenticated(); if (isAuthenticated) { // 繼續(xù)使用 Google Play 游戲服務 }});△ 更新后的登錄 API (預覽版)
我們還計劃簡化用戶賬戶的創(chuàng)建過程,當他們安裝 Google Play 游戲應用時就會順便創(chuàng)建個人資料了。這樣一來,即使用戶還沒有安裝好 Google Play 游戲應用,也能很快完成賬戶創(chuàng)建,然后回到游戲暢玩了。
△簡化后的用戶賬戶設置過程
另外,我們正著力于進一步簡化自動登錄流程,注冊過的用戶重新登錄會變得更加簡單。從 2022 年開始,用戶就不再需要先安裝 Google Play 游戲應用才能使用 Play 游戲服務了。
△ 2022 年 Google Play 游戲的新變化
有了這些更新,全球的 20 億 Google Play 游戲用戶就可以零點擊登錄 Play 游戲服務了。
游戲模式
隨著越來越多玩家青睞移動游戲,我們也致力于讓 Android 系統(tǒng)給游戲玩家和開發(fā)者提供更多的便利。從 Android 12 開始,部分設備將提供游戲模式 (Game Mode) API。這些 API 能讓設備按照用戶的需求提供極致的整機性能、平衡的性能或是最佳電池續(xù)航。而您前期為了適配各種設備對游戲所做的各項工作,剛好也可以用于響應這些性能相關的用戶偏好。
另外,Pixel 6 之類的設備還集成了新的游戲中心面板,它能以懸浮窗的方式為用戶提供游戲模式開關,以及幀率計數(shù)器和 YouTube 直播助手等游戲?qū)嵱霉ぞ摺?/p>
△ 邊下載邊玩功能
從 Android 12 開始提供的 "邊下載邊玩" 功能可以減少玩家的等待時間,讓他們更快開始游戲。為了支持這項功能,您需要使用 App Bundle 來提交游戲,并且需要避免使用一些舊版本的 Ads SDK。這是因為舊版本的 Ads SDK 會在使用資源之前對其進行分析,這類行為會妨礙邊下載邊玩功能的實現(xiàn)。
總結(jié)
我們一起走過的漫漫長路因為有您的參與而生機勃勃。我們非常感謝您對 Android 游戲開發(fā)事業(yè)的支持,同時希望能給您提供更好的支持。在這篇文章中,我們向您分享了 Android 游戲性能調(diào)優(yōu)的一些技巧,以及 Google Play 游戲服務的多項服務開發(fā)者和玩家的改進、基于性能調(diào)優(yōu)工具的 Android Vitals 分析面板。我們也希望這些新特性和改進,能讓玩家享受到更優(yōu)秀的游戲體驗,也能助力您更高效更輕松地開發(fā)游戲作品!
-
Android
+關注
關注
12文章
3949瀏覽量
128496 -
API
+關注
關注
2文章
1531瀏覽量
62798 -
開發(fā)套件
+關注
關注
2文章
160瀏覽量
24394
原文標題:打造卓越的 Android 游戲體驗
文章出處:【微信號:Google_Developers,微信公眾號:谷歌開發(fā)者】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論