3 回答
![?](http://img1.sycdn.imooc.com/533e52b90001456f02000200-100-100.jpg)
TA贡献1806条经验 获得超8个赞
我在使用 LibGDX 发布的游戏中也遇到了这个问题,就像 tscissors 一样。
经过几个月的调试,现在我确信我遇到的问题与被破坏的浮点变量有关,就像这篇文章中所描述的那样。
对我来说,一个简单的解决方法很有帮助:在AndroidManifest.xml
设置属性时成功android:vmSafeMode
消除 true
了错误,因为它禁用了 JIT 优化。
参见安卓说明:
android:vmSafeMode
指示应用程序是否希望虚拟机 (VM) 在安全模式下运行。默认值为“假”。此属性是在 API 级别 8 中添加的,其中“true”值会禁用 Dalvik 即时 (JIT) 编译器。
此属性在 API 级别 22 中进行了调整,其中“true”值禁用 ART 提前 (AOT) 编译器。
![?](http://img1.sycdn.imooc.com/54584ed2000152a202200220-100-100.jpg)
TA贡献1834条经验 获得超8个赞
这是一个非常奇怪的问题,似乎是 ART/JIT 中的错误。我可以看到至少 3 个不同的开发者故事都遇到同样的问题。我认为可能会有更多,但这个错误确实很难重现。
我在使用 LibGDX 框架开发游戏时遇到了这个问题。该框架中的 UI 是通过大量复杂的计算创建的,并且在那里大量使用了浮点数。在我的例子中,UI 组件收到了错误的坐标,因此布局完全被破坏。
奇怪的是,您无法使用 DEBUG apk 重现此问题,只能使用 RELEASE apk 重现。更改清单的值android:debuggable=true
也不起作用。所以调试真的很痛苦,你需要监控logcat并验证float变量的值。
解决方法
在我真正需要 UI 相关方法之前,我强制编译器对它们执行“去优化”。我创建了模拟“Table”组件,用其他模拟组件填充它(创建类似于真实组件的布局),并调用我在日志中看到的方法(当去优化发生时)。我每次在应用程序启动时都会进行此操作,并且问题似乎对我来说已“修复” - 此后“去优化”永远不会发生,并且在此之后布局始终正确。
我希望它能帮助那些在这个问题上花费了大量时间的人。
![?](http://img1.sycdn.imooc.com/5458692c00014e9b02200220-100-100.jpg)
TA贡献1799条经验 获得超6个赞
我不知道本地 Java 变量会以这种方式被破坏。
如果某处的某些本机代码破坏了包含该变量的堆栈帧,则可能会发生这种情况t_d
。
如果本节中存在竞争条件或内存危险,也可能会发生这种情况:
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
。它可能已经改变了。
(请注意,您正在访问一个裸变量m_dissolve
,显然没有任何同步。即使声明为 ,这里也存在潜在的竞争条件m_disolve
。volatile
)
添加回答
举报