摘要:因此在完成前面的優化適配后,您只需考慮以下四個關鍵事項最大寬高比支持全屏模式對于確保游戲玩家獲得最佳的沉浸式體驗至關重要。
作者 / Ben Gable, Partner Developer Advocate
讓我們繼續《讓您的應用適配更多屏幕》中的話題,不過今天會更專注于游戲的范疇。在不久前的 GDC 上,我們很高興能和大家分享多樣化的設備為游戲體驗帶來的可能性。這些年我們親歷了諸多移動硬件的演進,如 3D 顯示器和高分辨率屏幕等,也因為這些演進,讓我們在應用商店中看到越來越多新穎的游戲出現,讓玩家們在更沉浸的畫面和游戲體驗中流連忘返。
如果能在更大的屏幕上體驗的話,這些游戲也會擁有更好的視覺效果。這意味著開發者可以通過針對不同的外形和更大的顯示設備優化游戲,來吸引正在快速增長的大量受眾群體。
如果您在應用商店上架了游戲,那它可能已經可以在 Chrome OS 上運行了。Chromebook 在一個容器中運行完整版的 Android 框架,因此游戲的體驗就像在 Android 設備上運行一樣。但這并不是終點,通過進行一些調整,開發者可以進一步針對性地優化游戲,使其在大屏幕設備上擁有最佳的視覺效果和運行性能,并為可折疊設備上的最佳游戲體驗奠定基礎。
GDC 期間我們的很多演講都涉及到了這個話題。這里我們為您系統地整理了一遍,并給出了能讓您立刻上手的代碼示例和開發技巧。
大屏幕游戲的常見問題作為游戲開發者,您當然想要在每臺設備上都提供最佳的游戲體驗——無論用戶是在使用豎屏模式,還是使用鍵鼠,甚至在可折疊設備 (擁有更多可切換的分辨率和寬高比配置) 上進行游戲。通過遵循 Android 最佳實踐,開發者可以在所有這些使用場景中都提供出色的體驗。
在 APK 中,適配的所有操作都是從配置 (configuration) 的變動開始。系統在檢測到設備配置的變動后,會自動重啟您的 Activity 并在這個過程中調用適配新設備配置的游戲資源,從而確保您的游戲在該配置下達到理想的效果。
在默認情況下,系統將在重新啟動 Activity 之前通過調用 onSaveInstanceState 自動處理配置更改。但對于素材量很大的游戲來說,這一過程可能需要更長的時間,尤其是在涉及到狀態數據的序列化和反序列化時,可能會因為大量的內存消耗而出現遲滯現象,因此您可能需要自己對這一步操作進行針對性的改進,比如讓系統在特定的配置變化之后不重啟 Activity,而是調用 onConfigurationChanged 方法讓您自行處理適配細節:
public void onConfigurationChanged(Configuration newConfig) { //Scale UI //Toggle control scheme //Adjust orientation //etc }
進一步了解運行時變更,以及狀態恢復 developer.android.google.cn/guide/topic…
屏幕和窗口管理在 Chromebook 和三星 DeX 等設備上,游戲默認在窗口模式中啟動,用戶可以動態調整畫面大小;在三星 Galaxy Fold 等設備上,當用戶展開設備時,屏幕尺寸和寬高比將會改變。這些設備配置變化的場景都可以觸發 onConfigurationChanged 事件。
您可以在 manifest 中這樣指定需要監聽的配置變動項目:
".MyActivity"
android:configChanges="screenSize|orientation"
android:label="@string/app_name">
正如前文所述,在游戲運行時如果發生配置更改,默認情況下系統會關閉 Activity 然后將其重新啟動,但如果您使用 android:configChanges 屬性聲明了需要監聽的配置,將會阻止 Activity 重新啟動。這時 Activity 反而會保持運行狀態,并且系統會調用其 onConfigurationChanged() 方法。如此一來,您就可以定制化地處理任何變化了。例如,您可以縮放 OpenGL 內容以匹配新的分辨率或寬高比,防止 UI 元素被畫面裁切。
比如當用戶動態調節畫面大小時:
public void onConfigurationChanged(Configuration newConfig) { //Get native surface size //NativeActivity.mLastContent[X/Y/Width/Height]() //findViewById(android.R.id.content).get[Width/Height]() }
有一點需要牢記,那就是每次畫面尺寸發生變化時,輸入區域也會發生變化。如果您的游戲打算保持全屏運行,或者您需要在修 bug 時快速略過配置更改問題,則只需在 manifest 中將 resizableActivity 設置為 false 即可。這一操作將阻止用戶手動調整畫面大小,但它也會阻止分屏模式 (split-screen view),因此請謹慎使用,以避免影響玩家體驗。
".MyActivity"
android:resizeableActivity="false"
android:label="@string/app_name">
△ 將 resizableActivity 設置為 false 可以強制游戲處于全屏模式
設備方向在智能手機上,屏幕方向默認為縱向 (豎屏)。而在其他設備上,默認值則有可能是橫向。請在 manifest 中指定您支持的傳感器方向,讓系統處理它們,從而確保您的游戲不會意外翻轉。
或者,如果您打算在 onConfigurationChanged() 中動態處理方向,請在代碼中使用 Display.getRotation() 獲取當前屏幕方向。
Display.getRotation()
△ 屏幕方向的數值可能會在不同的設備上互換,具體取決于該硬件默認的設備方向值,請一定要在測試中考慮到這一點
設備分辨率在解決了上面兩個問題后,您還需要考慮用戶設備的分辨率。較大的屏幕需要更高分辨率的素材資源,因此您可以使用應用束 (App Bundle) 來為不同的設備配置分割打包游戲的代碼和資源。這樣,Google Play 就會為游戲所在的設備提供正確的資源——例如,為較小屏幕的設備略去超高分辨率素材。這將為用戶節省寶貴的下載空間,同時也免去了為不同像素密度的屏幕維護多個 APK 的麻煩。
另外,更多的屏幕像素也可以為畫面和界面設計賦予更大的靈活性。當用戶在更大的屏幕上玩游戲時,他們可能會坐得離屏幕更遠,這時您需要考慮擴展、添加或更改畫面 / 界面元素,以確保屏幕上的所有內容都清晰可辨。
輸入設備越來越多的手機游戲開始為玩家提供如同臺式機和主機一般的體驗。所以,越來越多的 Android 設備開始支持各種不同的輸入方式,包括鍵鼠和手柄等等。盡管 Android 提供了支持鍵盤、鼠標和手柄的 API,但想要這些額外的輸入方式真正可用,還是需要游戲開發者們更多地理解玩家的游玩訴求。比如玩家可能在沒有觸摸屏的 Chromebook 上用鍵盤玩游戲,或者打算插上鼠標來玩自己最喜歡的第一人稱射擊游戲,這些時候如果玩家發現自己期待的操作方式沒有被游戲支持,失望之情也就不難理解了。
另外,許多新設備也支持在使用時動態切換配置,例如從折疊模式轉換到平板電腦模式。想要支持這些場景,最佳的方法是檢測設備上可用的硬件,以便為玩家提供最佳體驗。
要做到這一點,還是要從 android:configChanges 開始。例如檢測鍵盤的連接:
然后,您可以在啟動時或在配置更改時查詢 InputManager,并根據觸摸屏或者鍵盤的可用與否來切換控制方案。另外,當從觸摸控制方案切換成鍵盤控制方案時,即使 InputManager 說鍵盤可用,您也需要進一步確保鍵盤真的可用 (比如在畫面上提示用戶 "按任意鍵繼續")。畢竟,用戶這時用的可能是一臺平板電腦模式下的 Chromebook。
如果您是在游戲做完后才打算支持鍵盤,請考慮實現下面的功能,這樣可以大幅提高可用性和完成度:
技能鍵綁定
WASD / 方向鍵移動
菜單導航
Enter 鍵輸入
Tab 鍵切換 (依游戲所需)
上下翻頁鍵功能
返回鍵
自定義鍵位映射
還有,別忘記使用鼠標的玩家——特別是在第一人稱射擊游戲或第三人稱游戲里。
public void onClick(View view) {
view.requestPointerCapture();
}
public boolean onCapturedPointerEvent(MotionEvent motionEvent) {
// Get the coordinates required by your app
float verticalOffset = motionEvent.getY();
float horizontalOffset = motionEvent.getX();
return true;
}
//...
view.releasePointerCapture();
最后,考慮加入對手柄的支持,因為標準的 Android 手柄 API 適用于 Chromebook 和三星 DeX 等設備——這些都為使用手柄提供了可能性。
構建現在,讓我們繼續構建和配置您的 APK,以確保它支持各種大屏幕 Android 設備。
第一步是檢查您的游戲所要求的權限,以及確定您是否真的需要這些權限。某些設備 (如 Chrome OS) 就不支持某些權限,例如:
android.hardware.location.gps——?GPS
android.hardware.nfc——近場通信 (NFC)
android.hardware.camera——后置攝像頭
另外,請考慮運行游戲的硬件配置,并考慮調整以下內容:
自動畫質控制: 調整自動畫質控制邏輯或創建新的畫質配置,以便針對特定設備進行最佳優化。
x86 和 ARM: 嘗試提供 x86 版本,以便在 Chromebook 等設備上實現最佳性能。只有 ARM 版本的話游戲仍然可以運行,但是您會因為指令翻譯而產生額外的性能開銷。
對 Vulkan 的支持: 大多數設備現在都支持 Vulkan,它可以大大提高渲染速度和圖形表現。
最后一步是在所有大屏幕設備上測試。添加涵蓋不同設備的、更多樣游玩流程的測試用例,例如最小化最大化、在小屏幕和大屏幕之間切換、變更輸入設備和調整窗口大小。您可以使用 Android 和 Chrome OS 模擬器或 Firebase Test Lab 等工具來讓測試過程變得更加自動化。
您也可以使用在 Android 設備和 Android Studio AVD 上運行的折疊屏模擬器應用,來測試不同窗口大小和像素密度時的運行狀況:
$ adb install FoldableEmulator.apk $ adb shell pm grant com.samsung.android.foldable.emulator android.permission.WRITE_SECURE_SETTINGS $ adb shell pm grant com.samsung.android.foldable.emulator android.permission.SYSTEM_ALERT_WINDOW
了解有關可折疊設備測試的更多信息 developer.samsung.com/galaxy/fold…
可折疊設備可折疊智能手機通過將智能手機和平板電腦合二為一,讓游戲玩家可以魚與熊掌兼得: 可以做到多窗口操作,也可以讓游戲畫面的尺寸倍增。
為 Chromebook 構建的應用在優化原則上和可折疊設備高度相通。因此在完成前面的優化適配后,您只需考慮以下四個關鍵事項:
最大寬高比
支持全屏模式對于確保游戲玩家獲得最佳的沉浸式體驗至關重要??烧郫B設備在折疊起來時畫面將擁有較長的寬高比 (可達 21:9),因此請執行以下步驟,以確保您的游戲可以處理最大寬高比,從而填充整個屏幕:
聲明目標 SDK 版本: 以 Android 8.0 (API 級別 26) 或更高級別為目標的游戲可以填滿整個屏幕。
聲明 resizeableActivity (如果您的游戲支持多窗口,則只聲明為 "true"): android:resizeableActivity=[“true” | “false”]
聲明最大寬高比: 可折疊設備寬高比可達 21:9,這要求您將最大寬高比提高到 2.4。
您可以按照如下示例在 manifest 中聲明最大寬高比:
"android.max_aspect" android:value="2.4" />
△ 設置最大寬高比為 2.4,如果寬高比超過 2.4,則左右兩側會留空
處理屏幕凹口區域
以 Galaxy Fold 為例,在展開狀態時,其屏幕的左上角會有一個凹口,您需要保證游戲畫面中的必要內容不被遮擋。
如果您的游戲在渲染時會覆蓋到凹口區域,可以使用 WindowInsets.getDisplayCutout() 來獲得 DisplayCutout 對象。這里有三個值需要注意:
LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT
LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
MODE_DEFAULT: 內容在豎屏模式時會在凹口區域內渲染,但在橫屏模式下左右會留空。
MODE_SHORT_EDGES: 不論橫豎屏模式,內容都會在凹口區域內渲染。
MODE_NEVER: 內容永遠不會在凹口區域內渲染。
您可以參考如下示例來給您的 Activity 設置凹口渲染模式:
△ 直接將 LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES 應用于 Activity
了解更多針對凹口屏幕開發的技巧 developer.android.google.cn/guide/topic…
游戲連續性
當用戶展開他們的設備時,您需要確保您的游戲無縫過渡到全尺寸狀態。這意味著您的游戲可以適應兩種實體屏幕尺寸,對實體設備折疊機制及其狀態作出正確響應,并且能夠調整畫面大小。
確保您的游戲可以處理兩種屏幕尺寸,這個機制與在 Android 上適配不同屏幕尺寸的方法基本相同。唯一的區別是,這種情況在可折疊設備上會更頻繁地發生。
適配不同屏幕尺寸 developer.android.google.cn/training/mu…
處理折疊和展開,開發者不需要針對 Galaxy Fold 這樣的設備處理特殊事件或 API,因為這個過程就是 Android 平臺標準的屏幕尺寸變化事件。更具體到 Activity 的 configChanges 上,會觸發這么幾個變化: Screensize、smallestScreenSize、ScreenLayout。
了解 configChanges developer.android.google.cn/guide/topic…
讓游戲畫面尺寸實現自適應,以在不同顯示模式之間靈活切換,從而讓用戶在折疊和展開屏幕時都能體驗到無縫的切換過程。
多重恢復
正如我們之前在適配可折疊設備的話題中提到過的,多重恢復 (Multi-resume) 意味著在多窗口模式時讓所有可見的 Activity 處于 resumed 狀態。在 Android 9 Pie 中,游戲和應用都可以選擇打開 Multi-resume 功能,只需將聲明添加到 manifest 中即可:
"android.allow_multiple_resumed_activities"
android:value=”true” />
成功案例: Gameloft Asphalt 9
在了解到玩家們的大屏幕游戲需求后,Gameloft 利用這個契機調整了 Asphalt 9 的游戲設置,以便優化這款游戲在大屏幕設備上的體驗。團隊在構建游戲時考慮了各種輸入方式和顯示器尺寸,并確保了游戲在不同種類的設備上擁有一致的高速性能表現。
Gameloft 在 GDC 2019 上的分享
www.youtube.com/watch);
我們還與 Gameloft 合作,針對Chrome OS 和可折疊設備優化了 Asphalt 9 的前作,Asphalt 8: Revolution。
打造移動游戲的未來針對 Chrome OS 進行適配后,Asphalt 8 的每日活躍用戶數量增加了 6 倍,Chrome 用戶帶來的收入則增長了 9 倍。也正是在看到適配帶來的優勢后,Gameloft 的核心工作就涵蓋了為較大屏幕進行設計的要素。
我們希望您在閱讀完本文后,能認識到 Android 游戲不再是專屬于移動設備的體驗——今天的玩家正在各種外形和尺寸的設備上體驗游戲。通過遵循 Android 最佳實踐并額外投入一些時間思考您的游戲在大屏幕上體驗的可能性,您可以將您的游戲帶到更大的舞臺上,真正做到為每個玩家提供最佳的游戲體驗。
您的游戲有適配更多的屏幕尺寸嗎?歡迎在評論區和我們分享游戲適配中的疑問和心得。
點擊這里即刻開始適配更多屏幕
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/7038.html
摘要:鴻蒙系統鴻蒙系統中的方舟編譯解決了這個問題。鴻蒙并不是安卓的套殼。鴻蒙鴻蒙分布式軟總線以為核心的應用開框架連接設備的對比安卓系統發現配對鏈接組合驗證鴻蒙系統從使用的角度來講,不管多少設備連在一起,鴻蒙都能像使用一臺設備那樣簡單。 1.什么是鴻蒙? 1.移動通訊發展史 ? 1.1G時代(語音...
閱讀 724·2023-04-25 19:43
閱讀 3921·2021-11-30 14:52
閱讀 3794·2021-11-30 14:52
閱讀 3859·2021-11-29 11:00
閱讀 3790·2021-11-29 11:00
閱讀 3882·2021-11-29 11:00
閱讀 3562·2021-11-29 11:00
閱讀 6138·2021-11-29 11:00