Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
unity3d-Android的独立UI线程_Android_Multithreading_User Interface_Unity3d - Fatal编程技术网

unity3d-Android的独立UI线程

unity3d-Android的独立UI线程,android,multithreading,user-interface,unity3d,Android,Multithreading,User Interface,Unity3d,在我的Android智能手机VR应用程序中(我认为它是否是VR应用程序并不重要),我从Street View下载了6幅大图像,并用它构建了一个skybox。在此过程中,整个应用程序(包括环境和用户界面)冻结。约10秒后,程序停止,街景显示在那里 如何将主处理与UI分离?因此,手机可以正常工作,但不应冻结。这是一个常见的网络问题,但如何在Unity for Android中解决这个问题? 谢谢大家! 代码: 您可能希望使用IEnumerator将其与Unity协程进行线程连接。如果你已经在使用这个

在我的Android智能手机VR应用程序中(我认为它是否是VR应用程序并不重要),我从Street View下载了6幅大图像,并用它构建了一个skybox。在此过程中,整个应用程序(包括环境和用户界面)冻结。约10秒后,程序停止,街景显示在那里

如何将主处理与UI分离?因此,手机可以正常工作,但不应冻结。这是一个常见的网络问题,但如何在Unity for Android中解决这个问题?

谢谢大家!

代码:


您可能希望使用IEnumerator将其与Unity协程进行线程连接。如果你已经在使用这个,我假设你真的在使用它-会不会是性能问题导致设备冻结?如果是,请检查和/或。正如评论所说,协同程序不是线程,而是模拟线程行为

基本协同程序代码:

void SomeMethod() {
    StartCoroutine(Threaded());
}

IEnumerator Threaded() {
    // Do something
    yield return new WaitForSeconds(3f);
}
查看以及如何使IEnumerator等待下载完成


更新对OP后续问题的回复:


更新对OPs后续问题的回应: 这是当前逻辑/流程的简化示例注意:这不起作用。不要用这段代码作为例子来说明应该如何做,我只是想说明在处理问题的方式上的不同

void按钮点击(){
SetTexture()
}
void SetTexture(){
纹理纹理=GetTexture()
Object.texture=纹理;
}
纹理GetTexture(){
纹理;
Start例程(下载纹理((textureCallback)=>{
纹理=纹理回调;
}));
返回纹理;
}
IEnumerator下载纹理(动作回调纹理)
{
WWW=新的WWW(URL);
收益率;
回调(www.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;
}
void按钮单击(){
Start例程(下载纹理((回调纹理)=>{
SetTexture(callbackTexture);//将在协同程序下载纹理完成时运行SetTexture。
}));
}
IEnumerator下载纹理(动作回调纹理)
{
WWW=新的WWW(URL);
收益率;
回调(www.texture);
}
void SetTexture(纹理){
object.texture=纹理;
}

请注意,这只是流代码。您的代码将看起来不同,使用byte[]而不是Texture,我不知道您是否正在使用按钮启动纹理设置。这可以是任何类型的触发器/起点。

您当前使用的代码是什么?我将代码放入了post`private byte[]GetStreetviewTexture(字符串url){WWW WWW WWW WWW=new WWW(url);while(!WWW.isDone);if(!string.IsNullOrEmpty(WWW.error)){Debug.LogWarning(“无法DL纹理:”+WWW.error);}else{bytes=www.texture.EncodeToPNG();}返回字节;}`“使用IEnumerator执行线程”协同程序不是线程。WWW正在另一个线程中运行,并提供了一个函数来生成它,但协同路由不是一个线程。“使用IEnumerator等待WWW”本来是合适的,但如果没有OP的代码,我们无法判断发生了什么。是的,但它模拟了一种线程行为——我最初认为OP需要这种行为。我设法不读粗体字…我想我的答案可能适用。。。我不认为这是一个线程性能的提高,你需要的,只是一个略微增强的代码。尝试使用协同程序,如WWW类文档中的示例。如您所见,我需要在此方法中返回byte[]字节。你有没有办法把一些东西和Coroutine一起退回@弗雷德里克瓦是我的答案;合作项目,你在找什么?当然,以下是我通常在协同程序中使用回调的方式:。将
操作
更改为
操作
,您就可以开始了!
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);
}
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;
}