在我的 Android 智能手机 VR 应用程序中(我认为它是否是 VR 应用程序并不重要)我从街景 View 中下载了 6 张大图像并从中构建了一个天空盒。在此过程中,整个应用程序包括。环境和用户界面卡住。大约 10 秒后,进程停止,街景就在那里。
如何将主要处理与 UI 分开?所以电话正在工作,但不应该死机。这是一个常见的网络问题,但如何在 Unity for Android 中解决这个问题?
谢谢!
代码:
private byte[] GetStreetviewTexture(string url) {
WWW www = new WWW(url);
while (!www.isDone) ;
if (!string.IsNullOrEmpty(www.error))
{
Debug.LogWarning("Unable to DL texture: " + www.error);
}
else
{
bytes = www.texture.EncodeToPNG();
}
return bytes;
}
最佳答案
您可能想使用 IEnumerator 将其与 Unity 协程线程化。如果您已经在使用它,我假设您确实在使用它 - 这可能是导致设备卡住的性能问题吗?如果是这样,请检查 Unity profiler和/或 Unity Remote .正如评论所暗示的那样,协程不是线程 - 但模拟线程行为。
基本协程代码:
void SomeMethod() {
StartCoroutine(Threaded());
}
IEnumerator Threaded() {
// Do something
yield return new WaitForSeconds(3f);
}
查看 WWW class以及如何让 IEnumerator 等待下载完成
更新响应 OP 的后续问题:
How to tell when a Coroutine is done and get a value
更新响应OP后续跟进问题: 这是您当前逻辑/流程的简化示例。 注意:这不起作用。 不要将此代码用作说明应该如何完成的示例,我只是想说明您应该如何解决问题的差异。
void ButtonClicked() {
SetTexture()
}
void SetTexture() {
Texture texture = GetTexture()
Object.texture = texture;
}
Texture GetTexture() {
Texture texture;
StartCoroutine(DownloadTexture((textureCallback) => {
texture = textureCallback;
}));
return texture;
}
IEnumerator DownloadTexture(Action<Texture> callbackTexture)
{
WWW www = new WWW(URL);
yield return www;
callback(www.texture);
}
这不仅行不通,因为协程与其余代码异步运行,而且这不是完成此任务的好方法。
而不是做
Button click -> set texture -> start download -> error setting texture -> download finished
你想要:
Button click -> download texture -> wait for it to be done -> set texture
像这样:
void ButtonClick() {
StartCoroutine(DownloadTexture((callbackTexture) => {
SetTexture(callbackTexture); // Will run SetTexture when Coroutine DownloadTexture is completed.
}));
}
IEnumerator DownloadTexture(Action<Texture> callbackTexture)
{
WWW www = new WWW(URL);
yield return www;
callback(www.texture);
}
void SetTexture(Texture texture) {
object.texture = texture;
}
请注意,这只是流程代码。您的代码看起来会有所不同,使用 byte[] 而不是 Texture 并且我不知道您是否使用 Button 来启动纹理设置。这可以是任何类型的触发点/起点。
关于android - unity3d - Android 的独立 UI 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41875185/