3 回答

TA貢獻1806條經(jīng)驗 獲得超8個贊
我在使用 LibGDX 發(fā)布的游戲中也遇到了這個問題,就像 tscissors 一樣。
經(jīng)過幾個月的調(diào)試,現(xiàn)在我確信我遇到的問題與被破壞的浮點變量有關(guān),就像這篇文章中所描述的那樣。
對我來說,一個簡單的解決方法很有幫助:在AndroidManifest.xml
設置屬性時成功android:vmSafeMode
消除 true
了錯誤,因為它禁用了 JIT 優(yōu)化。
參見安卓說明:
android:vmSafeMode
指示應用程序是否希望虛擬機 (VM) 在安全模式下運行。默認值為“假”。此屬性是在 API 級別 8 中添加的,其中“true”值會禁用 Dalvik 即時 (JIT) 編譯器。
此屬性在 API 級別 22 中進行了調(diào)整,其中“true”值禁用 ART 提前 (AOT) 編譯器。

TA貢獻1834條經(jīng)驗 獲得超8個贊
這是一個非常奇怪的問題,似乎是 ART/JIT 中的錯誤。我可以看到至少 3 個不同的開發(fā)者故事都遇到同樣的問題。我認為可能會有更多,但這個錯誤確實很難重現(xiàn)。
我在使用 LibGDX 框架開發(fā)游戲時遇到了這個問題。該框架中的 UI 是通過大量復雜的計算創(chuàng)建的,并且在那里大量使用了浮點數(shù)。在我的例子中,UI 組件收到了錯誤的坐標,因此布局完全被破壞。
奇怪的是,您無法使用 DEBUG apk 重現(xiàn)此問題,只能使用 RELEASE apk 重現(xiàn)。更改清單的值android:debuggable=true
也不起作用。所以調(diào)試真的很痛苦,你需要監(jiān)控logcat并驗證float變量的值。
解決方法
在我真正需要 UI 相關(guān)方法之前,我強制編譯器對它們執(zhí)行“去優(yōu)化”。我創(chuàng)建了模擬“Table”組件,用其他模擬組件填充它(創(chuàng)建類似于真實組件的布局),并調(diào)用我在日志中看到的方法(當去優(yōu)化發(fā)生時)。我每次在應用程序啟動時都會進行此操作,并且問題似乎對我來說已“修復” - 此后“去優(yōu)化”永遠不會發(fā)生,并且在此之后布局始終正確。
我希望它能幫助那些在這個問題上花費了大量時間的人。

TA貢獻1799條經(jīng)驗 獲得超6個贊
我不知道本地 Java 變量會以這種方式被破壞。
如果某處的某些本機代碼破壞了包含該變量的堆棧幀,則可能會發(fā)生這種情況t_d
。
如果本節(jié)中存在競爭條件或內(nèi)存危險,也可能會發(fā)生這種情況:
float t_d=c_GColour.m_dissolve; bb_std_lang.print("Dissolve pre stack: " + c_GColour.m_dissolve);
如果你仔細觀察,你實際上并沒有打印t_d
。c_GColour.m_dissolve
您正在做的是在將...分配給后打印 ... 的(表觀)值t_d
。它可能已經(jīng)改變了。
(請注意,您正在訪問一個裸變量m_dissolve
,顯然沒有任何同步。即使聲明為 ,這里也存在潛在的競爭條件m_disolve
。volatile
)
添加回答
舉報