一個困擾我一個多星期的Nebula3的BUG

來源:互聯網
上載者:User

最近看了一些PhysX的東西, 本想寫個demo練練手, 結果遇到一個非常詭異的問題

當我興沖沖的用Wizard建了一個工程, 編譯, 運行, 竟然一片黑?

奇怪啊, 這個Wizard程式應該沒問題才對, 要不然我怎麼敢發布出來?

換成Release, 編譯...結果正常!

用PIX跟蹤了一下發現, 兩個版本的變換矩陣不一樣!

當時就茫然了...拿SDK內建的testviewer編譯運行了一下, debug版竟然是這樣的:

 

只能看到兩隻腳, 滑鼠操作沒有反應!

太崩潰了~

代碼肯定沒修改, 因為我本機是架設了SVN的, 一切修改都有記錄

重新安裝一個Arip2009, 結果仍然一樣!

然後QQ詢問同樣研究Nebula的朋友, 他們的結果是對的!

我就把我編譯的testviewer.debug.exe發過去, 結果在他們那邊也是正常的...

然後我就理所當然的排除了代碼錯誤的可能性

首先懷疑自己的軟體環境是不是有衝突, 因為我習慣裝一大堆軟體.....

正好趕上Win7出RTM, 還正好在超頻論壇發現了我主板的啟用BIOS(當初花錢弄了個超頻專用的, 結果買回來也沒超-_-), 於是就升級了...

雖說身為一個軟體開發人員, 用盜版是可恥的, 但為瞭解決眼下的問題, 我等不到Win7開始賣了

Xp->Win7, DX SDK March 2008->March 2009, VS2005->VS2008, 9800GT driver, SVN, etc,  updated, too......

然後我就滿懷希望地在全新的環境下又編譯了一遍......結果仍然不對

我當時就鬱悶了, 難道是硬體出了問題? 不對啊, release是正常的-_-

翻出N3 SDK的上個版本, 編譯之, 正常...

難道是編譯選項的問題? 全部改回去, 編譯, 仍然不行

又找了個跟我軟體硬體環境都幾乎一樣的哥們測試了一下, 他那兒也正常!

又找了個哥們, 終於他那裡出現一樣的癥狀了, 不過他不搞3D, 沒法一起查了-_-

跟倒數第二個哥們辯論了一番, 他說了句: 為什麼不能操作呢?

一句話驚醒夢中人: 一直以來我都是把注意力放到變換矩陣為什麼不正確了, 以為矩陣不正確所以才沒法操作

於找到操作的處理代碼, 看到了這樣一段:

// process gamepad input<br /> float zoomIn = 0.0f;<br /> float zoomOut = 0.0f;<br /> float2 panning(0.0f, 0.0f);<br /> float2 orbiting(0.0f, 0.0f);<br /> if (gamePad->IsConnected())<br /> {<br /> const float gamePadZoomSpeed = 50.0f;<br /> const float gamePadOrbitSpeed = 10.0f;<br /> const float gamePadPanSpeed = 10.0f;<br /> if (gamePad->ButtonDown(GamePad::AButton))<br /> {<br /> this->mayaCameraUtil.Reset();<br /> }<br /> if (gamePad->ButtonDown(GamePad::StartButton) ||<br /> gamePad->ButtonDown(GamePad::BackButton))<br /> {<br /> this->SetQuitRequested(true);<br /> }<br /> float frameTime = (float) this->GetFrameTime();<br /> zoomIn += gamePad->GetAxisValue(GamePad::RightTriggerAxis) * frameTime * gamePadZoomSpeed;<br /> zoomOut += gamePad->GetAxisValue(GamePad::LeftTriggerAxis) * frameTime * gamePadZoomSpeed;<br /> panning.x() += gamePad->GetAxisValue(GamePad::RightThumbXAxis) * frameTime * gamePadPanSpeed;<br /> panning.y() += gamePad->GetAxisValue(GamePad::RightThumbYAxis) * frameTime * gamePadPanSpeed;<br /> orbiting.x() += gamePad->GetAxisValue(GamePad::LeftThumbXAxis) * frameTime * gamePadOrbitSpeed;<br /> orbiting.y() += gamePad->GetAxisValue(GamePad::LeftThumbYAxis) * frameTime * gamePadOrbitSpeed;<br /> }<br />

嗯, 我是燒的插了個360的手柄, 不會放那兒不動也會影響操作吧? 注釋掉, 編譯, debug結果終於正常了!

下斷點觀察, 發現        float frameTime = (float) this->GetFrameTime();返回的是一個無效值.....汗

轉到frameTime的老窩, 發現了這樣一件事:

//------------------------------------------------------------------------------<br />/**<br />*/<br />RenderApplication::RenderApplication() :<br /> //time(0.0),<br /> //frameTime(0.0),<br /> quitRequested(false)<br />{<br /> // empty<br />}

這倆變數竟然沒初始化? 瘋掉了...當初也想過變數未初始化的原因, 因為這是導致debug/release不一樣結果最常見的原因.

但是在別人機器上運行正常讓我排除了代碼錯誤的可能性, 一直在找運行環境的問題

問了下那個同命相連的哥們, 他也插了個360的手柄玩MGS來著, 崩潰

最後解決辦法, 把上面那兩個變數的注釋符去掉, 編譯, OK.........

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.