第701章 時空幽靈,能夠穿越現實時間的BUG(中秋快樂!!!)
你相信這個世界上有幽靈存在嗎?
一個能夠穿越時間,穿越空間,甚至穿梭在半導體的數字世界裡的幽靈。
它能悄無聲息地破壞那些原本正常的代碼。
即便這個代碼從頭到尾都沒有任何人動過。
在代碼倉庫里,近一年都沒有任何提交。
連字節碼哈希值都完全一致。
但它就是壞了。
因為開發組在一個完全無關的新版本里加入了物理引擎。
想獲取本書最新更新,請訪問sto9.𝘤𝘰𝘮
這……
簡直就是一個存在於數碼世界的鬼故事。
不過任何一個科學無法解釋的現象,或許都只是水平暫時達不到罷了。
有的時候,真相或許並不會滿足大家的期待。 或許……真相其實非常簡單,也非常蠢。
「是……是開著的!」
幾人圍在電腦前,看著那扇成功打開了的門,嘖嘖稱奇。
「原來是這樣……」
林立新坐在跟前,面露異色。
作為一名現代人,其實在上手代碼的第一時間,他的腦海中就已經有了大致的猜測。
遊戲圈有這樣一個潛規則。
如果說遊戲裡最容易踩坑的是哪兩樣東西。
那莫過於門和浮點數了。
qake2時期,這扇門是完全可以正常打開的。
即便是門後有npc站著。
這扇門在打開時,碰撞箱會恰好擠到npc的腳,製造一個非常微小的偏移,恰好容納門正常通過。 但在完全沒有修改源碼里任何一點東西的時候,為什麼這個門突然打不開了?
即便是把硬體回退到nx而不是nf上,仍然是打不開?
其實答案非常簡單。
源碼一樣跟機器碼一樣完全是兩個概念。
amenva上下全體工程師,在開發過程中的主要語言往往就兩樣。
一個是完全自舉,從始至終都是amenva堅實地基的n語言。
一個徹頭徹尾的高級語言,大量易用的、現代化的語法,將它武裝成了一個專為遊戲而生的超級語言。
另一個則是nvascript,為網絡世界而生的jit即時編譯語言。
而問題就出在n語言這傢伙身上。
從《雷神之錘2》到現在這段時間,除了源碼外,到底還發生了哪些事呢?
n語言的編譯器更新了。
為了適應越來越現代化的硬體,和更多更新鮮的語法糖以及高級語法。 n語言幾乎每隔一段時間都會推送一次更新。
一台計算機(不管是遊戲機還是pc還是掌機),想要運行代碼,是不可能直接跑n語言這種高級語言的。
它必須要被編譯成機器碼,編譯成電腦能理解的版本才行。
編譯器在處理編譯的過程中,本身就會對代碼進行一次初步的優化。
把一些不必要的循環解除,不必要的變量改成常量,降低性能的寫法改成更高效的寫法……
也就是說,最終交給電腦運行的,其實跟程式設計師編寫的根本不是同一個東西。
《雷神之錘2》的源碼的確從來沒有動過。
但編譯器更新了。
而這,連鎖引發了一個極度不起眼,甚至根本沒有人當回事的問題。
浮點數精度變化。
簡單來說,就是現在的數字比以前更精確了。
計算機為了性能,或者是為了實現某些必要的數學計算,往往在數字的處理上其實非常鬼畜。 就像典中典之《我的世界minecraft》里的邊境之地,其實就是一個典型的浮點數誤差。
由於整個世界坐標都是用的浮點數的問題,java在這個數字極大的時候,細微的誤差會被不斷積累放大。
最終便導致了出現各種詭異的扭曲偏移。
在這兒也是同理。
小數點後的幾位發生了變化。
所以門打不開了,此案告破。
當眾人終於是把這個『穿越時空的幽靈』抓到時,直接被氣笑了。
就這樣?
真相就這樣嗎?
人群之中,被臨時喊來加班的前地球頭號黑客,現役amenva首席安全顧問凱文·米特尼克腦門直冒黑線。
他本期待著展開一場緊張刺激的黑客攻防戰。
他們本以為是有一位比林立新還要恐怖的世外高人侵入到了amenva伺服器內,神不知鬼不覺地破壞了源碼。 「呃……好吧,不管怎麼說,把這次的經驗記在員工手冊里,不然浮點數的坑以後還不知道要踩多少次。」
哪怕是林立新,此刻也有些無語。
起碼還算是一場頗具奇幻色彩的eb之旅。
隨著以後物理引擎越來越發達,3化越來越先進,不可避免地一定會頻繁跟這些問題打交道。
提前踩踩坑也算是好事。
「欸?說起浮點數誤差,我們之前測試的時候還發現了一個問題。」
卡馬克一拍腦門,趕快來到工作站前,
「我們做了完整的剛體物理和重力擬真,現在玩家可以拿起場景里的一些物品了,就比如這些桶子,或者這幾塊板子……」
他說著,將地圖裡的瓶瓶罐罐撿起,然後丟出去。
儘管整個物理系統的流暢度還有待提升,精度和細節程度也還不算完美。
但對比過去來說,簡直就是驚為天人。
一個可以交互的物理世界,那可真的太誇張了。 「然後我發現了一個好玩的,你看,我把板子先放在這兒……完事我跳上來,再舉起板子,卡好一個視角……」
卡馬克操作著角色踩在木板上,按下交互鍵,將鏡頭略微微調了一番。
隨後……
他狂按跳躍鍵,整個人居然是左腳踩右腳,直接御板飛上了天。
整個場景的真相頓時便盡收眼底。
除了中間的小房子,其他地方清一色的都是什麼都沒有的一片空白。
卡馬克倒是玩得很開心。
一旁的項目主管克里斯多福臉上可就掛不住了。
當著林立新的面跟他爆了這麼多b出來,簡直就是丟人丟到姥姥家了。
「還沒完呢,你看好,我在這個位置把板子和桶稍微堆一下,我試試……上次我直接擠到了地圖外面……」
卡馬克倒是沒心沒肺,那叫一個歡騰。
克里斯多福眼瞧卡馬克沒有停下的意思,繼續下去還不知道要整出啥事兒呢,趕忙主動開口道: 「目前還是個測試階段的em,這幾天我們的主要目標就是提升精度,這些問題後面肯定都能得到改善的,b很快就能修好。」
「修?你說這個板子飛天啥的嗎?為什麼要修?」
林立新不解地偏過頭來看向他。
「啊?b不修嗎?」
這反問反倒是給克里斯多福整不會了。
不修那不成屎山了?
到時候發出去玩家要罵娘的好嗎?
「惡性的b當然要修,但這個……我覺得其實無所謂。」
林立新聳了聳肩,望著玩得正開心的卡馬克,
「不要把玩家有趣的舉動當做是作弊,如果大家都覺得有意思,那就鼓勵他們去胡鬧就好了。」
有的設計師,技術不咋地,代碼也寫得一塌糊塗。
花了大量時間打磨出來了一個堪堪過及格線的作品。 然後玩家找到了很多他沒有發現的有趣套路,迅速找到了破局之法,把原本艱難的挑戰攻克了。
於是他便急了眼。
我這麼用心的設計,你們也必須用心地去玩,不允許逃課。
為了不讓玩家玩得這麼開心,浪費了他的藝術才華,他便迅速推出熱補丁修復了這個捷徑。
本以為這樣玩家們就會去體驗他那些『精妙的設計』了。
但沒想到,玩家們迅速找到了新的套路。
於是他又補,玩家又攻克。
更好用的模組從民間長了出來,修改器成了人手一份的工具。
直到最後,他也會覺得是自己沒堵好所有的縫隙,讓這些該死的蟲子鑽了過去。
但他似乎從來都沒有意識到一點。
會不會……他所引以為傲的那些東西,本來就不好玩呢?
「如果你對內容有足夠的信心,你就沒有必要擔心玩家們會逃課,因為他們一定會回來的。」 「即便他們真的靠著物理引擎的特性逃了課,那也是玩家們自己的自由。」
「永遠都不要教玩家玩遊戲。」
這也算是林立新的肺腑之言了。
當初《像素戰》的時候,就是因為他急於求成,指望引進率土like玩法快速破圈,搞得最後不好收場。
也就是玩家們願意支持amenva,不然指不定要被罵成啥樣呢。
這件事也算是amenva發展史上少有的黑歷史了。
事實證明,設計師最大的原罪就是傲慢。
「我們應該做個封閉測試,找一些玩家來體驗,如果他們覺得這不影響體驗,反而很有意思,那它就不是b,而是……『特性』。」
你說是吧,bjmp?
不管是基於《半條命(半衰期)》、《傳送門》、《m》誕生的圍繞起源引擎的整個社區。
還是日後《minecraft我的世界》那種真正完全自由的超級沙盒世界。
它們都保留了大量的b。 這其中,不得不承認或許的確有不少是因為技術問題沒有來得及修復。
但也有很大一部分,的的確確就是為了遊戲體驗而刻意保留的。
就像mc里,如果修復了tnt複製,那一大票紅石生電機械就會原地報廢,大量的生電玩家都會放棄更新版本,成為一代遺老。
《m》也會失去它那種肆意妄為的暢快感。
(還有更新耶)