安卓系统:快照和GPU为什么互斥?

29

我尝试同时使用快照和GPU支持来运行模拟器,但模拟器无法启动:

模拟器:错误:此时快照和GPU是相互排斥的。请关闭其中一个,并重新启动模拟器。

我想知道这些限制的原因是什么?对我来说似乎不是逻辑上的冲突。


是的,这似乎是一个奇怪的限制。 - Anders Lindén
2个回答

30

Android模拟器基于QEMU,需要模拟各种硬件设备,就像Android在真实手机上运行时一样。具体地,它模拟了一个名为“goldfish”的虚构手机。

当您保存快照时,设备RAM必须保存在快照中。但这不仅仅意味着主RAM——它还涉及到手机硬件的所有其他琐碎部分——例如CPU寄存器、实时时钟硬件状态以及此虚拟手机中每个其他硬件的所有寄存器。

如果您没有启用GPU,则图形硬件状态相对简单——它将是一个帧缓冲区和表示x维度、y维度和像素格式的少量寄存器。

然而,如果您启用了GPU直通,那么保存该硬件的状态将更加复杂。QEMU需要保存每个纹理的状态,设置了哪些摄像头,几何形状,以及GPU中保留的其他无数内容。流向GPU的命令流水线也必须在任意点被打断,并记录这些命令的执行状态(很难,因为有多级流水线,有些指令可能已经部分执行)。

此外,qemu实际上可能很难获得这些信息,因为qemu只是将它通过到主机GPU。qemu无法询问主机GPU驱动程序已经执行了哪些操作和未执行哪些操作。至少,这需要主机操作系统和GPU驱动程序的支持,甚至可能需要更改GPU流水线以简化事情,使得可以在任意点停止并重新启动流水线。


这很有道理。最终我可以将这个问题标记为已解决。谢谢! - Igor Konoplyanko
2
奇怪的是,iOS模拟器启动非常快,图形速度也很快,而这个安卓系统就显得非常落后了。 - mskw
1
@Adian,我仍然不相信这是不可能的。由于不需要立即关闭模拟器,因此它不需要在“任意点”中断。如果模拟器需要花费10秒或更长时间才能关闭,那么没有人会抱怨,因此它实际上可以等待所有内容(管道等)清理、存储,然后进行关闭。在恢复时,他只需从非常接近关闭时间点的干净保存状态中恢复即可。 - Pacerier
@mskw 不仅仅是它们的实现方式不同。iOS 有模拟器,而 Android 则有模拟器,这实际上会产生很大的差异。https://dev59.com/8nI-5IYBdhLWcg3w-9sK - Igor Konoplyanko

-2

首先检查您的Android模拟器快照是否已启用?(如果已启用,请将其取消选中) 在Eclipse中转到AVD ->选择您的模拟器 ->编辑 ->启用快照 ->取消选中它。 重新启动后将正常运行。 我为同样的问题做了这件事。


谢谢回答。但我知道可以用这种方式解决。但我想了解原因。 - Igor Konoplyanko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接