2

我正在制作一个游戏,我需要在其中集成 Facebook 排行榜和 Facebook 好友邀请,就像在地铁冲浪者中一样。我使用了官方的 facebook sdk 并完成了它。但是我遵循的方法效率不高。

我的朋友邀请屏幕有自己的 UI,所以我无法使用 facebook SDK 附带的默认弹出窗口。我从 graph 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;



    }

我正在使用协程,但我不知道如果这些是异步的,为什么我的滚动会挂起滚动?代码取自此处。我已经检查了线程,但www不能在线程中使用。我只想平滑我在图像获取期间使用 NGUI sdk 制作的滚动视图。

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

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

滚动在编辑器上的网络通话期间工作顺利,但在设备 (iOS) 上却没有。为什么 ?

请大家帮我解决我的滚动视图和内存问题。任何帮助将不胜感激。塔克斯 :)

4

2 回答 2

3

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

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

1.存储好友列表数据

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

2.池列表项

在任何给定时间创建的列表项不要超过三倍。滚动时,您只需像这样重用已经创建的那些:

滚动时重用列表项

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

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

3.排队图像请求

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

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

  • 将 N 个最近的头像保存在内存中,避免每次都加载它们
  • 按照 Roberto 的建议,使用LoadFromCacheOrDownload检查图像是否已下载。
  • 在设置纹理之前确保请求的项目仍然可见(否则它将图像保留在内存中)

当然,这是非常高的水平。这里有很多事情要以许多不同的方式实现。但我希望你能明白。

于 2014-03-09T05:27:22.630 回答
2

当我询问同时启动多个协程时,我正在考虑这个问题。好吧,您只是不能同时加载它们并期望应用程序顺利运行,硬件无法处理。

您可以制作一个加载屏幕或类似的东西,用户将不得不等待查看/使用滚动条(尽管我从未见过游戏这样做来加载 Facebook 图片),否则您将不得不放弃在同时创建一个可以同时使用的少量 WWW 连接池,即限制同时加载的图像数量,只有在一个完成后才开始加载新图像。

现在肯定可以加快速度的一件事——不是在你第一次运行它时,而是在随后的运行中——是使用WWW.LoadFromCacheOrDownload()而不是new WWW(). 此方法将存储过去下载的图片并加载它们而不是重新下载。这就是我见过的每个 Unity 游戏与 Facebook 集成的方式。

于 2014-03-05T10:51:59.843 回答