製作3D遊戲時如何避免或減輕玩家的暈3D現象?
最近做了一個小遊戲,結果跑了1分鐘不到就開始頭暈頭疼了,聯想到肯定有一些玩家會有暈3D的癥狀,那麼,在遊戲開發過程中,如何避免或者是減輕這類情況的產生呢?
最近剛在收購中火了一把的Oculus Rift的論壇上有帖子在收集相關的東西,看了一下,主貼貼出來幾個值得3d開發的時候注意的地方:
* 高幀率是必須的(VR、賽車類需要有60幀左右,PC遊戲需要30幀左右)
* 畫面里最好保持有個靜態的參考物(為什麼TPS沒有FPS那麼暈?因為有個主角可以看到。再想想一下在FPS裡面,槍都看不到的時候亂跑是不是最暈?因為有槍的時候,槍相對還是靜態的。)
* 第一人稱下,慢慢的移動
* 變動速度的時候不要變得太快(特別是要避免突然的「剎車」或者是「啟動」)
* 暗一點的場景會比亮的場景會好一點嘛,我也就能說說一般暈遊戲的解決方法了!動態模糊和景深關閉,平滑滑鼠移動,提高幀數其實說來說去貌似就是要保持攝像頭穩定,不要出現快速模糊的影像。
另外就是透視要合理,這個在調節fov的時候就能發覺
(′?ω?`?)業餘玩家
鏡頭不要來回晃,走路不要左右搖擺,如果人物和場景物體或其他角色互動時有視角上的效果,要保持連貫,比如背後刺殺就觸發條件後一次完成,不要中間磕磕碰碰……再有就是光暈,反射和模糊,如果角色移動速度很高,這些效果很酷。如果後面場景一堆石頭反射賊強,一頓眩光,一會兒就暈了。
第三人稱比第一人稱視角要好點,上帝視角比第三人稱好點,場景開闊點比狹窄的山洞房間要好點,幀數不穩定容易暈,攝像機頻繁和地形碰撞容易暈
目前看的「Level up! The guide to great video game design」裡面正好說到這個,翻譯如下:
1、盡量優化遊戲,使其運行在 60 幀以上;2、近景元素不要上下擺動,比如人物武器;3、盡量使當前地圖地形平坦;4、環境里加入大型靜態物體,使玩家擁有焦點;
5、不要過度搖晃當前鏡頭;6、不要使玩家經常(或者快速)上下調整視角。(例如一下要看天空,然後馬上又要看地這類)1、減小鏡頭移動的靈敏度、或者固定鏡頭2、開闊鏡頭視野3、控制渲染和光影4、調整劇烈動作時的機位移動
垂直同步,雖然我一直不知道這到底是什麼,不過我真的開了這個就不暈了。。
給 @孟亮 點了贊,作為一個暈3D的玩家來說一下自己的暈3D體驗。
- 場景切換造成的視野變化(第三人稱),比如從視野寬闊的野外進入山洞/房間/走道時視野突然變窄,鏡頭自動拉近,這個過程非常非常難受。
- 鏡頭轉動,比如人物行走路徑曲折造成的鏡頭變化,或者突然蹦出來的cg動畫(鏡頭轉動,大量特效等)。
- 畫面非常精細的情況下出現大量畫面運動,比如突然出現很多小怪,酷炫的技能效果,很多玩家聚集在一起行動。
暈3D的詳細解釋3d暈眩症_百度百科,不是所有人都能體會這種暈3D的感覺,這是由個體生理差異造成的,類似暈車。所以遊戲設計者除了把鏡頭切換、視野變化做得更流暢以外,能做的實在不多。尤其很多暈3D的人士在精細畫質下更難受而在低畫質的時候會舒服一些,但是3D遊戲不可能為此降低畫質。
轉自: 克服VR眩暈之幀數:提升UE4內容實時渲染效率 |VR第一資訊 VR013
VR已經成為了當今最火熱的一個話題,帶上頭盔之後,從此進入一個奇妙的世界,在這裡你不再是觀眾,你參與這個世界發生的每一件事件。整個世界從此與眾不同。在賽道上飛馳,在戰場上縱橫
但是生理機制讓我們的大腦在身體並沒有移動,而視覺在不斷告訴我正在飛速前行的迷惑中產生了暈眩。如何解決因為VR而產生的眩暈,就成為每一位設計師需要面對的問題。引起VR眩暈有很多原因啦,比如設計上的,技術上的。渲染的幀數高低必定是其中一個最主要的原因之一。關於UE4里對VR內容的優化方法和思路大部分是和傳統的3D遊戲優化是一致的,有部分是VR尤其相關的。接下來就以oculus為平台和大家一起分享一下在UE4里常見內容的一些設置和優化的思路和方法.
首先我們來看一個優化過程的實例,先有個大概的了解。打開一個UE4下載的項目,particle cave, VR preview,帶上眼鏡就能體驗了,對,就這麼簡單,雖然說這個並不是一個針對VR的項目。這裡做了一些簡單的設置
1、發現攝像機是以預設軌道在飛,而且明顯感覺幀率不高,哦,好暈。為了比較方便衡量接下來優化,我做了一些攝像機的設置,讓攝像機開始遊戲後固定在一個我認為幀數最低的畫面。2、確保幀數沒有被限制住,關閉垂直同步,把最高幀數限制上限提高好了,再run一下,固定住了,轉轉頭可以,hmm。。真的挺卡的
再接個命令證實一下,最直接和GPU渲染效率有關的就是解析度嘍
HMD SP 100 54FPS幀數立馬提高不少,果然是GPU渲染瓶頸降低渲染品質Adjust scalability to medium 72FPS成功了? 還沒有哦,這個太暴力了這個肯定不是最優的優化結果了。因為肯定有些可以進一步做大量的優化,有些和視覺相關比較大的調整可以提高質量。而非粗暴的都調低了,那接下來就得找原因了- Base pass: Deferred Decals
- Lighting: ReflectionEnvironment:
- Translucency: Postprocessing:
從最大開銷的幾個點入手
BASEPASS: 敲入幾個渲染選項命令行:r.Earlyzpass 1:增加draw calls和一部分GPU的消耗,但大大降低base pass的消耗關閉了一些不需要的PP效果一套最優POP設置組合:- Postprocessing setting:
- Scene color;
- Fringe intensity 0
- Grain intensity 0
- Color grading intensity 0
- Bloom setting
- LPV 0
- Ambient occlusion 0
- DOF Method Gaussian, 其他參數 全部 0
- Motion blur all 0
- AA FXAA
- SSR 0 MAX roughness 0.01
- Ambient cubemap 0
再VR preview,
嗯,還是75,當然了,DK2上頂格是75,再優化看不出效果13.39ms 75FPS
把品質調高成high Scalability high,還是75,哈哈,沒問題!現在算優化完了吧? 其實還可以再優化,這時候的優化就是以盡量提升畫質但不降低幀數為目標。看看哪些還可以優化的? 當然有 !之前的Translucency花費好高
Viewmode: shade complexity 好紅, 一堆overdrawDecal的花費也很高, Stat scenerendering, decals in view環境反射的花費很高: 選中sphere reflection capture, 看一下總共有幾個,觀察他們影響範圍是否重疊嚴重Vertex intensity: 好密啊。高密度的三角面幾乎看上去就像一個實體了, 一個三角面的大小在屏幕上的面積小於2*2個像素就會極大的增加開銷
還有Particle 。現在基本上已經定位到可執行層面的原因了,一些原因也已經通過可接受的渲染參數調整解決了;另外一些就必須要artist來優化Assets本身了。哪些工作最快,質量損失最小,能夠換其他更能提升品質的選項。啟示他們並不需要這麼多面,assets的優化需要更多的時間。把scaleability有些選項提升到EPIC,當然他們並不是全部一些引起DRAW CALL數量多的原因- 同屏看到的Actor太多,如果材質複雜這個因素還會加成。 合併Actor,尤其是中遠處
- 材質ID太多(or Section; Mesh elements)。重用材質貼圖,盡量把同一材質物體合成為一個物體
- 每個actor上的feature太多。主要是增加投影的屬性,增加custom depth的屬性
- 太多燈光投影(這裡投影的消費來自於需要計算哪些物體需要被投影)
MESH DRAW CALL往往是個大頭,MESH ID 的數量可以在STATISTICS統計可以很方便的查看,從經驗判斷哪些資源製作不合理
關於ACTOR設置feature會增加DRAW CALL數的是投影和custom depth,可以通過一些工具來檢查這些設置。使用property matrix來過濾,檢查,並修改
另外一個經常使用的查找原因的方法排除法通過隱藏各種元素,尋找哪個是導致DRAW CALL數量的大頭記得隱藏HUD,有的時候HUD也是個大頭之一Showflag.slate 1如果是GPU瓶頸,最快速的驗證方式就是改變解析度,降低解析度可以極大提高幀數。為了抵消畸變糾正而產生的圖像模糊,或者解析度的丟失,在渲染的的buff里往往是實際屏幕尺寸的120-130%,這樣增加了圖像的銳利度,但降低了渲染的速度。HMD SP全稱是HMD 的screen percentage, 這個參數就是來修改渲染buff的尺寸的,HMD SP 120是默認值,改成100看看。如果像剛才例子看到的,幀數有大幅度的提高,那就是GPU負擔太大的問題了,如果解析度的改變對於幀數影響不大,很有可能是因為面太多了。對這些內容重點做檢查,看看有沒有超標的現象出現
- 解析度
- HMD SP
- 投影貼圖
- 面數/點數(燈光的多少,陰影的設置,多少物體)
- LOD,關閉shadow,燈光屏幕面積
- 面數密度太高,高到一個三角面小於2*2的像素,這個往往發生在遠處物體
- 點處理,點太多
- 點動畫的shader太複雜
- tessellation太複雜
- 太多UV,太多SG
- 查看staticmesh editor里點和面數的差別是否大
- 點沒有合併等
- view cost(HZB occlusion culling)
- Precumputed visibility volume
- Scene cost GPU particle simulation
- 材質複雜度
- quality switch,sin, pow, cos, divide, Noise很費
- 由於Texture 太多,太大 Texture caching反覆的page in and out of 顯存
- 遮擋的culling計算
- Precumputed visibility volume
- 延遲燈光
當使用lighting function,IES,接受投影,區域光,複雜shading modes的時候會變得更貴
反射ssr有問題,關掉。 後期, AO,很費知道哪裡有問題了,接下來就可以著手行動了,但之前做個目標規劃還是可以事半功倍的。最小化圖像質量妥協,是一種有的放矢的妥協策略。比如高質量的陰影對於高品質的抗鋸齒而言對於最終項目實際的表達效果次要。減小陰影品質來換取高品質AA就是一種有的放矢的妥協策略。因此盡量大的減小不是非常關心的渲染品質部分,增加更可見的渲染品質部分。從容易做起,從開關一些渲染選項,品質參數調整,到直接刪東西,優化一個用到幾百次的物件,這些都是立竿見影的方式,這樣可以做允許的時間計劃內完成目標,如果有更多時間和預算可以對相對低性價比的。目標75幀是必須的,不要說68,70,都不行,必須75,做實際體驗中有很大區別。最常見的問題所在- 測試環境不合適,燈光沒有build
- Actor或者材質ID太多
- 面太多,沒有任何的LOD設置
- 燈光使用沒有節制: 各種動態投影,燈光類型隨意
- 沒有合理的設置CULL的條件
- 透明太多
- Postprocess太高級了
這些原因又互相影響,一方面的增加也會增加另外方面的開銷
其他一些VR的特有行為
- VR 需要畸變色差糾正
- VR需要雙屏
- VR需要更大的渲染解析度
- VR需要傳遞感測器信息
比如對於oculus部分是在驅動層級做掉了,比如如何糾正畸變,如何雙屏,如何傳遞感測器信息。
對於感測器信息和視頻匹配的準確性,以及渲染的屏幕覆蓋率,在UE4里是可以根據需要來修改的,除了這些,其他就和以往的優化思路一致了。創建測試環境。找原因
- Testing in a stable enviroment
- run Standalone game
- use pause or slomo 0.001 to prevent random numbers
- Measuring few times
- 確保幀數不封頂
- s.Vsync 0
- s.MaxFPS
- 了解瓶頸
- GPU瓶頸
- profileGPU(ctol+shift+,)
- 解析度
- HMD SP
- 投影貼圖
- 面數/點數(燈光的多少,陰影的設置,多少物體)
- LOD,關閉shadow,燈光屏幕面積
- 面數密度太高,高到一個三角面小於2*2的像素,這個往往發生在遠處物體
- 點處理,點太多
- 點動畫的shader太複雜
- tessellation太複雜
- 太多UV,太多SG
- 查看staticmesh editor里點和面數的差別是否大
- 點沒有合併等
- view cost(HZB occlusion culling)
- Precumputed visibility volume
- Scene cost GPU particle simulation
- 材質複雜度
- quality switch,sin, pow, cos, divide, Noise很費
- 遮擋的culling計算
- Precumputed visibility volume
- 延遲燈光
- 當使用lighting function,IES,接受投影,區域光,複雜shading modes的時候會變得更貴
- 反射ssr有問題,關掉,後期AO,很費
- cup瓶頸,CUP GAME瓶頸
- stat game
- AI複雜度
- BP
- raycast
- 物理
- 內存分配
- CUP RENDER瓶頸
- stat scenerendering
- 材質ID太多
- 重用材質貼圖,盡量把同一材質物體合成為一個物體
- actor太多,如果材質複雜這個因素還會加成
- 合物體,尤其是中遠處
- 每個actor上的feature太多,比如增加投影的屬性,增加custom depth的屬性
- 太多燈光投影(這裡投影的消費來自於需要計算哪些物體需要被投影)
找到瓶頸的方法
- stat unit
- disable一些stuff,然後看效率上的區別
- 一些可調的show flag
- 開關屏幕反射
- 開關AO
- 開關AA
- 開關bloom
- 開關延遲燈光
- 開關燈光類型
- 開關動態陰影
- 開關GI
- 開關後期
- 開關環境反射
- 開關折射
- 開關貼畫
- 開關半透明
- 開關tessellation
- viemode
- ProfileGPU
- ProfileCPU
- stat game
- stat scenerendering
- Profiler
後期優化首選項:
- Scene color fringe;
- ambient cubemap,
- image based lens flares;
- LPV off;
- Grain intensity,
- DOF off,
- ssr off,
- or roughness 0.01;
- Motion blur off
最後選擇的參數需要應用到DEVICE PROFILES里或者BP里
減小 shader的 instruction的數量減少Texture sample的數量:把經常使用到同一個物體上的Pattern合在一張貼圖上;去掉對質量影響很小的貼圖,比如Specular,AO在實際情況中平衡來使用使用quality switch,sin, pow, cos, divide, Noise,多向量的計算總是大於單向量的計算UE4里由於使用了延遲燈光,所以燈光的優化比前向渲染方便的多。最快速最有效的方法:使用靜態光源。如果使用的事動態光減小 Lighting cull,半徑,衰減,Z INTERSSECTION, cone大小角度。總之盡量減少重疊投影的開銷最大往往不是來自於pixel shader,而是來自於被投影的mesh面數太多,還會被燈光數量,投影物體數量放大關閉投影的燈光;減小範圍或張角;減面,加LODr.Shadow.MaxResolution創造性作假:- 三角面:
- 遠處mattinpaiting
- 投影面片,畫在貼圖上
-------------------------分割符-----------------------
QQ群號:544405366
我在2011年之前從來不知道什麼叫暈3D,直到我完了一款叫《狂怒》(Rage)的遊戲。其搜索搜索一下「狂怒 暈」可以發現不少人都是這樣。說明體質不同暈3D程度也不同。《狂怒》發揮的很好最大限度挖掘了人的暈3D潛力。為什麼《狂怒》會這麼暈還沒有個權威的說法,討論比較多的是視角過窄而遊戲鏡頭焦距設置過短,造成畫面像中間壓縮。眼鏡看到的畫面和大腦的預期畫面衝突造成暈車一樣的感覺。戴近視鏡的同學可以試試把你的眼鏡腿朝前試試看,類似那種感覺。因此怎麼避免暈3D呢?我也不知道,我不會做遊戲,但是我認為合理設置視角焦距,符合人類視覺習慣就好了
說句外行的感受吧。玩《卓越之劍》的時候就會暈,玩其他的3D遊戲不暈,因為前者在旋轉視角的時候,是以景物為圓心轉動,人物在畫面的位置上也會轉,其他的遊戲則是以人物為圓心轉動,除了自身原地旋轉之外沒有位置改變。……這是我對暈3D的唯一體驗實例。
推薦閱讀:
※在你們見過的所有多線文字戀愛AVG遊戲里,你們認為哪位角色的個人線最好,並請試分析其原因/理由?
※《星際爭霸2》有創新嗎?創新在何處?
※有哪些知名的遊戲設計師?
※如果你是設計師你會怎麼修改風暴英雄?
※遊戲,垃圾箱里能撿到道具是一個好設計嗎?