Memory 从unity3d中的url异步获取图像

Memory 从unity3d中的url异步获取图像,memory,asynchronous,unity3d,imagedownload,Memory,Asynchronous,Unity3d,Imagedownload,我正在制作一个游戏,在这个游戏中,我需要像在地铁冲浪者中一样,集成Facebook leader board和Facebook好友邀请。我使用了官方的facebook sdk并完成了它。但我所遵循的方法并不有效 我的好友邀请屏幕有自己的UI,因此我无法使用facebook SDK附带的默认弹出窗口。 我从graph api获取所有好友列表,它为我提供了所有用户ID的列表。但我需要在滚动列表中显示朋友的姓名和图片。我正在从url异步获取图像,但每当我尝试获取图像时,我的滚动列表就会挂起。这是我的密

我正在制作一个游戏,在这个游戏中,我需要像在地铁冲浪者中一样,集成Facebook leader board和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;



    }
IEnumerator启动()
{
url=”http://profile.ak.fbcdn.net/hprofile-ak-prn2/t5/1116929_100003613987476_290892640_q.jpg";
WWW=新的WWW(url);
收益率;
var-texture=www.texture;
this.gameObject.GetComponent().mainTexture=texture;
}
我正在使用协同程序,但我不知道如果这些是异步的,为什么我的滚动会挂起?代码已形成。我已检查线程,但
www
不能在线程中使用。我只是想平滑我的scrollview,这是我在图像获取期间使用NGUI sdk创建的

问题1-如何通过同步异步图像下载实现平滑滚动

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

在编辑器上进行web调用时,滚动运行正常,但在设备(iOS)上运行不正常。为什么?


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

当我问起同时启动多个合作项目时,我正在考虑这个问题。 好吧,你不能同时加载它们并期望应用程序能够顺利运行,硬件无法处理这个问题

你可以制作一个加载屏幕或类似的东西,用户必须等待才能看到/使用滚动条(尽管我从未见过一个游戏这样加载Facebook图片)您将不得不放弃同时显示它们,而是创建一个可同时使用的少量WWW连接池,也就是说,限制同时加载的图像数量,只有在一个图像完成后才开始加载新图像


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

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

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

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

2.池列表项 在任何给定时间,创建的列表项不要超过可显示列表项的三倍。滚动时,您只需重复使用已创建的内容,如下所示:

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

在移动列表项的末尾或开头(取决于滚动方向)时,应加载朋友的数据。在这一步中,您仍然不加载配置文件图片

3.排队映像请求 您可以使用Unity的方法确定某个项当前何时可见。但一般来说,你需要一个经理来跟踪在任何给定时刻哪些项目是可见的

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

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


当然,这是非常高的水平。这里有很多东西需要实现,而且有很多不同的方式。但是我希望你能理解。

你是如何调用这个方法的?我只需单击一个按钮就可以调用这个方法。通过start例程(start());如果在未下载实际纹理的情况下尝试使用占位符纹理,行为是否会发生任何变化?就像使用相同宽度和高度的轮廓一样。我的意思是,你确定这不是平滑的,因为在下载图片时图片集的大小(宽度或高度)会发生变化吗?我使用的是剪影,我的scrollview会平滑地滚动,但当我对图片进行web调用时,它会挂断。你是否同时启动多张图片的协作程序?