首先,這個遊戲是在XNA的遊戲平台基礎上建立起來的,那麼,什麼是XNA?
XNA中的X表示能夠在WindowsXbox和合作夥伴之間達到跨平台的強大的軟件工具。N表示“下一代(Next-generation)”,A表示“架構(Architecture)”。
XNA是基於DirectX的遊戲開發環境,是微軟對於 Managed DirectX 的修正及擴充版本。
假設你有一個人物,在遊戲中會根據輸入有各種運動,在XNA開發中,這一點用遊戲循環的形式整合進了應用程序框架。所有這些任務都在遊戲循環的Update方法中被處理,接著場景繪製在遊戲循環的Draw方法中完成。在Update方法中改變遊戲狀態然後在Draw方法中使用這些狀態來繪製不同的圖像,場景或其他和特定狀態相關的信息。
下圖展示了一個XNA遊戲的生命周期,包括Update和Draw方法形成一個遊戲循環。
什麼是幀?默認情況下XNA會在每次Draw調用的時候清除屏幕並且重繪場景。這樣一次Draw調用所產生的場景就稱為一幀。您可以把XNA中的2D遊戲想象成活頁卡通書,您在一頁中繪製一個角色,在下一頁稍稍移動一點的位置繪製同樣的角色,以此類推,當您快速翻動書頁的時候,您就有角色在動的假象。XNA也做了同樣的事情。每16微秒(或60次/秒),屏幕被清除然後新場景被繪製,當新場景中角色的位置和之前稍有不同的時候,就會產生角色活動的假象。
多幀就形成了遊戲中的動畫,每秒繪製的幀數就被稱為遊戲的幀速率(例如,60fps=60幀/秒。)
因此,在魔能的遊戲中也是這樣,可能你想像不到,默認的情況下每一秒遊戲為你的下一個魔法動作會重新畫60次圖,並且每畫一次就就全部擦除重畫,於是由於聯機時的網絡延遲造成的數據丟包或者怪多遊戲激烈的場景下都會使遊戲反應不過來,而造成圖層的缺失,進而造成位置的錯亂,簡單的說就是你掉進了無底洞。
如何解決:
一般的遊戲引擎對於畫像的繪製除了上述活頁卡通書的辦法之外,還有一種方法,那就是試圖追蹤場景中所有的東西,在新位置畫出它們,然後畫出之前被它們擋住的物體。這樣即使出現數據丟包頂多會卡住畫麵也不會出現無底洞等問題。可惜這樣就要改寫遊戲內核了。
但是目前,你可以通過降低遊戲的分辯率或者優化運行環境等手段來減少無底洞的出現。
以下來自官方的說明:
Characters can in rare cases fall through the level collision mesh, this is due to lag or poor framerate. Many general network improvements and general optimization will reduce this risk.
穀歌翻譯道:角色可以在極少數情況下(喂喂真的是極少數麼!),通過一級網絡碰撞下降(額其實就是指掉入“無形地洞”),這是由於落後或貧窮幀率(由於網絡延時或者幀數過低= =)。許多一般網絡的改善和一般的優化將減少這種風險