一接口的物理層封裝與邊界)
開場(chǎng)去年做跨平臺(tái)項(xiàng)目時(shí)遇到一個(gè)真實(shí)翻車現(xiàn)場(chǎng):同一套角色跳躍代碼,iOS 上手感完美,安卓上卻像踩在棉花上。排查三天,最后的根因出人意料地平淡——不是"兩個(gè)平臺(tái)用了不同物理引擎",而是兩臺(tái)設(shè)備的渲染幀率不同:低端機(jī)掉幀時(shí) Unity 的 FixedUpdate 追趕機(jī)制(Maximum Allowed Timestep)介入,物理步進(jìn)次數(shù)被悄悄壓縮,AddForce 的實(shí)際沖量累積變了,手感自然不一樣。物理引擎明明是同一個(gè) PhysX,表現(xiàn)卻分叉了。這就是游戲引擎存在的第一理由,也是它的第一個(gè)謊言:引擎把跨平臺(tái)差異封裝成統(tǒng)一接口,但"寫法統(tǒng)一"不等于"行為統(tǒng)一",更不等于"能力封頂"。這篇文章以物理層為切片,講清楚三件事:統(tǒng)一接口到底封裝了什么、封裝在哪些地方必然漏水、工程上怎么在漏水點(diǎn)自救。一、統(tǒng)一接口的核心:抽象與適配引擎的抽象層本質(zhì)是設(shè)計(jì)模式里的Adapter Pattern:把平臺(tái)差異藏在實(shí)現(xiàn)細(xì)節(jié)里,對(duì)上層暴露一致的 API。1.1 渲染與輸入的封裝以 Unity 為例,Input.GetAxis("Horizontal")這行代碼,在 PC 上讀鍵盤 A/D,在主機(jī)上讀手柄左搖桿,在手機(jī)上讀觸屏虛擬搖桿。開發(fā)者不用關(guān)心底層是 Win32 的 Raw Input、XInput 還是 UIKit 的觸摸事件。public class PlayerController : MonoBehaviour { public float moveSpeed = 5f;