對不同主流機器(一般來自TOP20配置,覆蓋90%以上的設備)根據不同硬件能力建立高、中、低等多檔性能指標,游戲按照該指標對應多個畫質選項進行適配。
CPU負載:一幀內執行的指令數
GPU負載:一幀內執行的shader指令數
FPS:游戲每秒運行的幀數
① GPU瓶頸
影響因素有:DrawCall數、shader復雜度、紋理采樣、透明物件、OverDraw、RenderState頻繁切換
使用GPA等進行截幀分析
② CPU瓶頸
影響因素有:游戲邏輯、剔除算法、Cache Missing
使用VTune等進行函數耗時分析
③ 傳輸瓶頸
影響因素有:VBO(Vertex Buffer Object)頂點數據量
卡頓:發生瞬間掉幀的次數
內存:包括虛擬內存和物理內存
① 虛擬內存:
Private Bytes // 進程Committed的虛擬內存字節數 對應win7任務管理器中的【提交大小】,資源管理器中的【提交】
Peak Private Bytes // 進程Committed的虛擬內存的最高峰字節數
Virtual Size // 進程Reserved的虛擬地址空間字節數
Page Faults // 發生過的缺頁中斷次數 對應win7任務管理器中的【頁面錯誤】
虛擬內存地址空間碎片 // 不可用的虛擬內存空間,造成的原因有:
a. windows保留虛擬地址空間起始地址必須是系統分配粒度的整數倍(64KB),大小必須是系統頁面大小的整數倍(4KB)
b. windows提交虛擬地址空間起始地址和大小必須是系統頁面大小的整數倍(4KB)
② 物理內存:
Working Set = WS Private + WS Shareable // 進程占用物理內存總字節數 對應win7任務管理器中的【工作設置(內存)】,資源管理器中的【工作集】
WS Private // 進程獨享的物理內存字節數(如:堆內存+棧內存+cow機制創建的內存) 對應win7任務管理器中的【內存(專用工作集)】,資源管理器中的【專用】
WS Shareable // 進程可與其他進程共享的物理內存字節數(如:exe及dll代碼段、數據段等) 對應win7資源管理器中的【可共享】
WS Shared // 進程已與其他進程共享的物理內存字節數,WS Shared<=WS Shareable
// 若只啟動一個exe實例,那么exe的代碼段、數據段等不會被共享,因而就不統計在WS Shared中
Peak Working Set // 物理內存的最高峰字節數 對應win7任務管理器中的【峰值工作設置(內存)】
物理內存碎片:// 不可用的物理內存,包括內部碎片(能明確指出屬於哪個進程)和外部碎片(不屬於任何進程)。
內部碎片 -- 對象內存對齊
外部碎片 -- 與頁面分配算法有關,頻繁的分配與回收內存會導致大量的、連續且小的頁面塊夾雜在已分配的頁面中間
③ 托管內存:
函數級別GC Alloc大小與次數
④ 內存相關的問題
a. 32位系統虛擬內存地址空間不足
b. 內存泄漏
c. 托管內存用完引用不釋放導致無法被gc回收
d. 頻繁的GC Alloc引發性能問題
e. 內存碎片
f. 內存越界(棧溢出、堆破壞等)
資源:
資源管理、資源重復率、資源大小、資源動態下載、資源加載卡頓、資源句柄泄露
顯存:紋理、VBO、shader
包體大小:游戲安裝包大小(初始安裝包、資源包、動態靜默下載)
啟動速度:游戲啟動到可交換界面的時間
載入地圖速度:進入游戲地圖的時間
網絡響應速度:建立連接的速率、網絡傳輸的速率、服務器的性能
手游特有指標:
弱網絡:由於網絡制式(2G/3G/4G/wifi)之間網速差異大,用戶地理位置變動使得網絡發生切換,信號被遮擋后強度減弱,人口密集區網絡擁塞嚴重,從而導致網絡出現抖動、延時、丟包,甚至斷線
具體應對措施:客戶端超時重發(每條消息都帶唯一ID)、心跳包探測、斷線重連(簡化登錄鑒權,不用走完整登錄流程)、客戶端發生crash下次進入提示重回;服務器延遲下線機制
流量:單位時間內通過網卡的數據總量
具體應對措施:a. 緊湊協議結構 b. 去掉本地可以計算得到的數據 c. 協議壓縮 d. 協議合並 e. 按照優先級來設定不同包的發送頻率
電量:單位時間內消耗的電荷數量
溫度:手機發燙程度
