我正在制作基于网络浏览器的实时游戏。
我正在使用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开发,我不知道这是最好的方式)
由于
答案 0 :(得分:2)
我敢打赌,我们在评论中都想说的(以及@Marcel Korpel在答案中所说的)是你使用了错误的技术来建立你的游戏。
基本上,您正在努力通过向Web服务器发出异步请求来实现我们可以使用twenty years ago执行cheap 16-bit processor的操作,其主要目的是提供文档,以及相对程度,高级应用程序。毋庸置疑,您的代码将运行数百个可互操作,具有安全意识的层,远离裸机。
换句话说,那是行不通的。
TPS之类的实时游戏应该主要在客户端上运行,如果需要网络交互,则应该使用基于例如的协议来实现。 UDP而不是HTTP。
了解Flash,Silverlight甚至XNA平台,但AJAX可能不是您问题的答案。
答案 1 :(得分:2)
关于“更好地实现我的目标”,确实如此!
成熟的浏览器游戏的概念证明已经在Google的Quake in HTML 5实施中成功实施。您要做的是重新调整您的技术,使其更符合HTML 5工作(或将工作)的方式。例如,您可能希望使用Web Sockets而不是AJAX调用。
另外,请查看Google's code blog以了解此游戏实施的概述,并project homepage获取示例代码并从中学习。
对各种浏览器中的HTML 5实施级别进行一些研究,以提前了解您的游戏将立即在哪里工作。 (例如,考虑HTML tag support,media support,Canvas support等)。另请参阅info中的wiki和WHATWG。这是一个漂亮的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); }
});