android - unity3d - Android 的独立 UI 线程

标签 android multithreading user-interface unity3d

在我的 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/

相关文章:

android - 如何打开 Facebook 粉丝页面并检查用户是否喜欢它

android图像上传,文件在服务器中损坏

java - 它是一种线程安全机制吗?

c++ - 如何使用 C++ 为 Windows 应用程序创建 GUI?

java - JTable 在 GUI 中为空,控制台显示已填充的 DefaultTableModel

c - 下载 conio.h 并在 Virtualbox 上使用 GUI

android - 从 Activity 向服务发送 "share intent"(ACTION_SEND)

java - 当我从不在 ExecutorService 上调用 shutdown 时会发生什么?

java - 在给定机器上控制 Java 线程创建的最佳方法是什么?

java - 为什么这个程序创建的线程比可能的多?