从unity3d中的url异步获取图像

时间:2014-03-03 14:08:20

标签: memory asynchronous unity3d imagedownload

我正在制作一款游戏,我需要在地铁冲浪中整合Facebook领队和Facebook朋友的邀请。我使用官方facebook sdk并完成了它。但我所遵循的方法效率不高。

我的朋友邀请屏幕有自己的用户界面,所以我无法使用facebook SDK附带的默认弹出窗口。 我从图api中获取所有朋友列表它为我提供了所有用户ID的列表。但我需要在滚动列表中显示朋友的姓名和图像。我异步地从url中获取图像,但每当我尝试获取图像时,我的滚动列表就会挂起。这是我的代码

IEnumerator start ()
    {

        url ="http://profile.ak.fbcdn.net/hprofile-ak-prn2/t5/1116929_100003613987476_290892640_q.jpg";
        WWW www = new WWW(url);
        yield return www;

        var texture = www.texture;
        this.gameObject.GetComponent<UITexture>().mainTexture = texture;



    }

我正在使用协同程序,但我不知道为什么我的滚动挂起滚动如果它们是异步的?代码来自here。我已经检查了线程,但www不能在线程中使用。我只想平滑我在图像提取过程中使用NGUI sdk制作的滚动视图。

问题1 - 如何通过异步图像下载同时进行平滑滚动。

问题2 - 我将每个图像加载到NGUI的UITexture中,我在运行时实例化。但是,如果一个人有200或以上的朋友,那么我的应用程序的内存达到顶点,最终应用程序崩溃。有没有其他方法来加载大量的图像,以便他们采取合理的记忆。

Scroll在编辑器上进行Web调用时工作正常但在设备(iOS)上没有。为什么?

请大家帮我平滑滚动视图和内存问题。任何帮助都将受到高度赞赏。 Thakks:)

2 个答案:

答案 0 :(得分:3)

对于任何包含超过50个包含图像的项目的列表,这是设备上的常见问题。您需要控制两件事:初始化列表项和下载资产。

您不需要一次加载所有内容并显示它们。我建议将其分为三部分:

1。存储好友列表数据

获取所有用户的Facebook好友并将其存储在列表中。 包括下载个人资料图片,仅包含基本信息和个人资料图片的网址。我们将在稍后的步骤下载图片。

2。池列表项

不要创建超过您在任何给定时间可以显示的列表项的三倍。滚动时,您只需重复使用已创建的那些:

Reusing list items when scrolling

只有当用户抬起手指并且列表有足够的动力继续滚动时,您才需要在该图片中执行第三步。否则,当用户只是拖动列表时,您应该在内存中加载足够的项目以不需要此项。

在结尾或开头移动列表项时(取决于滚动的方向),您应该加载好友的数据。您仍然可以在此步骤加载个人资料照片。

3。排队图像请求

您可以使用Unity的OnBecameVisible方法来确定项目当前何时可见。但通常你需要一个能够跟踪任何特定时刻可见项目的经理。

每次滚动列表没有动量并且用户没有拖动它时,您排队请求以获取当前可见项目的图像。这应由执行以下操作的其他经理处理:

  • 将N个最新的个人资料图片保留在内存中,以避免每次都加载它们
  • 检查是否已使用LoadFromCacheOrDownload已按罗伯托建议的方式下载图像。
  • 确保在设置纹理之前仍然可以看到请求所针对的项目(否则它会将图像保留在内存中)

当然,这是非常高的水平。这里有很多东西可以用很多不同的方式来实现。但我希望你明白这一点。

答案 1 :(得分:2)

当我问起同时启动多个协同程序时,我正在考虑这个问题。 那么你就是无法同时加载它们并期望应用程序顺利运行,硬件无法处理这个问题。

您可以制作加载屏幕或其他类似用户必须等待查看/使用滚动条的内容(尽管我从未见过用于加载Facebook图片的游戏)您将不得不放弃同时显示它们并创建一个可以同时使用的少量WWW连接池,即限制同时加载的图像数量,并且仅限一个人完成后开始加载新图像。

现在有一件事可以加快速度 - 不是第一次运行它,而是后续运行 - 是使用WWW.LoadFromCacheOrDownload()而不是new WWW()。此方法将存储过去下载的图片并加载它们而不是重新下载。这就是我见过的每一款Unity游戏都与Facebook融合的方式。