gpt4 book ai didi

android - 64K 方法下的“方法超出编译器指令限制”消息

转载 作者:行者123 更新时间:2023-11-29 23:18:04 31 4
gpt4 key购买 nike

我经常在日志中看到这样的重复消息:

Method exceeds compiler instruction limit: 29278 in void com.xxxxxxapp.xxxxxx.MyGLRenderer.onDrawFrame(javax.microedition.khronos.opengles.GL10)
Method exceeds compiler instruction limit: 29278 in void com.xxxxxxapp.xxxxxx.MyGLRenderer.onDrawFrame(javax.microedition.khronos.opengles.GL10)
Method exceeds compiler instruction limit: 29278 in void com.xxxxxxapp.xxxxxx.MyGLRenderer.onDrawFrame(javax.microedition.khronos.opengles.GL10)

分解代码通常会给出相同的消息,但数字较小:

Method exceeds compiler instruction limit: 22400 in void com.xxxxxxapp.xxxxxx.MyGLRenderer.onDrawFrame(javax.microedition.khronos.opengles.GL10)

我认为 64000 是保持在此处的神奇数字。尽管有这样烦人的消息,但我的游戏代码似乎总是运行良好,而且不仅仅是在 opengl onDrawFrame 方法中。我在 64K 以下的更新方法中收到了类似的消息,尽管更新代码比绘制代码更容易分解。

“方法超出编译器指令限制”的搜索刚刚让我找到了可怕的“Dalvik 编译器对 64K 方法的限制”错误的链接。我必须一直忽略这个吗?

最佳答案

发生这种情况是因为Compiler::IsPathologicalCase:

Skip compilation for pathologically large methods - either by instruction count or num vregs.

Dalvik uses 16-bit uints for instruction and register counts. We'll limit to a quarter of that, which also guarantees we cannot overflow our 16-bit internal Quick SSA name space.

来源:compiler.cc .

16 位uint 可以表示最大值65535,除以4,等于16383.75

将目标级别从 Dalvik 提高到 ART 可能会规避它;因为 Dalvikjavax.microedition.khronos.opengles.GL10由于指令计数,似乎不兼容。

之后会检查寄存器计数,因此这似乎不是这里的问题。

修补 compiler.cc 也是一种选择,尽管不是一个好选择。

  • 42 时,这将允许双倍的数量。

  • 如果不是返回true,它也应该继续编译。

这是错误的支票:

if (accessor.InsnsSizeInCodeUnits() >= UINT16_MAX / 4) {
LOG(INFO) << "Method exceeds compiler instruction limit: "
<< accessor.InsnsSizeInCodeUnits()
<< " in " << dex_file.PrettyMethod(method_idx);
return true;
}

免责声明:不保证“无副作用”。

关于android - 64K 方法下的“方法超出编译器指令限制”消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54960389/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com