使用jQuery ajax(json)调用内存泄漏

时间:2010-11-05 21:28:56

标签: javascript jquery ajax json

我正在制作基于网络浏览器的实时游戏。

我正在使用jQuery ajax调用来调用Web服务方法,以便客户端更新其速度和速度。通过json数据定位。返回的是一个字符串列表,其中包含所有其他玩家的位置和速度数据。

目前我甚至没有传递任何数据并返回示例列表条目。

这是每隔25毫秒从javascript调用的调用:

$.ajax({
    type: "POST",
    url: "Default.aspx/CheckIn",
    data: "{}",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (response) { UpdateEntityList(response); }
});

这是网络服务方法:

[WebMethod]
public static List<String> CheckIn()//(double xPos, double yPos, double heading, double speed)
{
    List<String> Entities = new List<string>();
    Entities.Add("0|0|50|50|5|180");
    return Entities;
}

任何人都可以建议如何解决问题,甚至是更好地实现我的目标的方法吗? (因为我只做了几周的web开发,我不知道这是最好的方式)

由于

4 个答案:

答案 0 :(得分:2)

我敢打赌,我们在评论中都想说的(以及@Marcel Korpel在答案中所说的)是你使用了错误的技术来建立你的游戏。

基本上,您正在努力通过向Web服务器发出异步请求来实现我们可以使用twenty years ago执行cheap 16-bit processor的操作,其主要目的是提供文档,以及相对程度,高级应用程序。毋庸置疑,您的代码将运行数百个可互操作,具有安全意识的层,远离裸机。

换句话说,那是行不通的。

TPS之类的实时游戏应该主要在客户端上运行,如果需要网络交互,则应该使用基于例如的协议来实现。 UDP而不是HTTP。

了解FlashSilverlight甚至XNA平台,但AJAX可能不是您问题的答案。

答案 1 :(得分:2)

考虑HTML 5及相关功能

关于“更好地实现我的目标”,确实如此!

成熟的浏览器游戏的概念证明已经在Google的Quake in HTML 5实施中成功实施。您要做的是重新调整您的技术,使其更符合HTML 5工作(或将工作)的方式。例如,您可能希望使用Web Sockets而不是AJAX调用。

另外,请查看Google's code blog以了解此游戏实施的概述,并project homepage获取示例代码并从中学习。

alt text

对各种浏览器中的HTML 5实施级别进行一些研究,以提前了解您的游戏将立即在哪里工作。 (例如,考虑HTML tag supportmedia supportCanvas support等)。另请参阅info中的wikiWHATWG。这是一个漂亮的slide presentation I like to show for demo。这些技术仍然处于起步阶段,因此请注意。还有W3C specs and related info

如果你在HTML 5的早期阶段将它拉下来而不是稍后跟进,你可能会有一些好的结果。自2010年4月谷歌在浏览器中证明Quake以来已经过去了一段时间。这种技术只会继续发展,并且随着时间的推移会更广泛地实施,所以我建议你继续开始尝试这个方向。

Google Chrome Experiments感到惊讶(当然特定于Chrome浏览器)。这些例子将为您提供一些好主意。特别注意已经实施的游戏及其功能,以作为您自己工作的衡量标准。

祝你好运!并且在提高技能的同时享受乐趣。

答案 2 :(得分:1)

正如其他人已经说过的那样,你不能每25毫秒做一次XMLHttpRequest。我认为很有可能你感知到的效果(浏览器在没有释放它的情况下吃了大量内存)也是由于这个原因:因为很多函数调用(最多每25毫秒,但它也很可能是JavaScript引擎无法容纳的直到那;阅读this nice answer以了解这些计时器是如何工作的)不允许垃圾收集器释放内存。

答案 3 :(得分:0)

将dataType更改为“text”,并使用json_parse.js手动解析生成的json。它避免使用eval导致泄漏。

$.ajax({
    type: "POST",
    url: "Default.aspx/CheckIn",
    data: "{}",
    contentType: "application/json; charset=utf-8",
    dataType: "text",
    success: function (response) { UpdateEntityList(response); }
});