我正在寻找一种方法来使Unity3d应用程序在等待用户交互(触摸,鼠标或键盘事件)或定时器(分钟级别)的同时睡眠。
该应用程序比电子书阅读器更接近游戏。 用户交互最好的forms是在99%的时间内读取非animation的文字墙。 有时会有背景声音(最多5%的时间),它是通过交互启用的。 目标平台是android,ios和webplayer。
用普通的FPS渲染即使是单一的纹理也可以消耗相当多的能量(用手测量,字面上 – 设备是温暖的)。
我的主要问题是我不想一直渲染摄像机,但我确实需要尽可能less的延迟来对用户input做出反应 – 所以降低FPS在这里效果不佳(input等待下一帧) 。
那么,如何以节能的方式停止等待用户input的应用程序呢? 只有一个平台(如集成本地API)的提示也是受欢迎的。
Unity内部架构就是一个游戏。 有一个由Update()和Render()组成的无限循环,它的运行速度尽可能快。 也许,你可以改变这个行为与自定义插件,所以有选项№1。
选项№1 。 Unity(仍然)是单线程的。 但它是在多线程管理环境中。 您可以在您的脚本中调用Sleep,并且应用程序将休眠一段时间(没有Update(),也不会调用Render()。 问题是Unity在同一个线程中运行它的输入。 但理论上你可以创建自定义插件并实现在另一个线程中运行的输入。 因此,你可以使用像WaitFor(customInput)这样的东西,把Unity放到条件睡眠中。 当然,您将需要为每个平台单独实施插件。
这不是一个简单的答案,是吧? 还有另一种选择。
选项№2 。 如果你放松工作,你可以减少电力消耗(显然,我知道)。 首先,你的应用不需要每秒60帧。 在质量设置中查找Application.targetFrameRate和vsync (请注意,vsync覆盖targetFrameRate)。 其次,缓存你的结果。 您可以将复杂的场景预先渲染到渲染目标,然后在屏幕上呈现,而不是源场景,直到发生相当大的变化。
您可以使用:
Thread.sleep(noofmillisecs)
即使使用2millisecs Thread.sleep(2)也可以节省能源,因为它被称为每一帧。 如果你有30fps(ios),它会在40%的时间里睡觉的应用程序。 如果你得到了用户输入,你可以降低或停止一段时间的睡眠,并在没有时候恢复。