簡體   English   中英

jQuery Ajax(json)調用導致內存泄漏

[英]Memory leak with jQuery ajax (json) calls

我正在制作一個基於Web瀏覽器的實時游戲。

我正在使用jQuery ajax調用來調用Web服務方法,以使客戶端通過json數據更新其速度和位置。 返回的是一個字符串列表,其中包含所有其他播放器的位置和速度的數據。

目前,我什至沒有傳遞任何數據,而是返回了示例List條目。

這是每25毫秒由javascript發出的調用:

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

這是Web服務方法:

[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開發了幾周,所以我不知道這是最好的方法)

謝謝

我敢打賭,我們在評論中都想說的(以及@Marcel Korpel在他的回答中說的話)是,您使用了錯誤的技術作為游戲的基礎。

基本上,您正在通過向Web服務器發出異步請求來努力實現20年前便宜的16位處理器可以完成的工作,該Web服務器的主要目的是服務文檔,並在一定程度上高級應用程序。 不用說,您的代碼將在裸機之外運行數百個可互操作且具有安全意識的層。

換句話說,那是行不通的。

諸如TPS之類的實時游戲應主要在客戶端上運行,如果需要網絡交互,則應使用基於UDP而非HTTP的協議進行。

了解有關FlashSilverlight甚至XNA平台的信息,但是AJAX可能不是您問題的答案。

考慮HTML 5和相關功能

關於“ 完全實現我的目標的更好方法 ”,的確是的!

完整的瀏覽器游戲的概念證明已經在Google的HTML 5 Quake實現中成功進行。 您要做的就是調整技術,使其更符合HTML 5的工作方式(或將要工作)。 例如,您可能想使用Web套接字而不是AJAX調用。

另外,請瀏覽Google的代碼博客 ,以概述該游戲的實現以及項目主頁,以獲取示例代碼並從中學習。

替代文字

對各種瀏覽器中的HTML 5實現級別進行一些研究,以預先了解您的游戲現在將在哪里運行。 (例如,考慮HTML標簽支持媒體支持畫布支持等)。 另請參閱WHATWG的 信息Wiki 這是我要演示的漂亮幻燈片演示 但是,這些技術仍處於起步階段,因此請注意。 還有W3C規格和相關信息

如果您在HTML 5的早期階段就開始使用它,而不是稍后再進行,那么您可能會做得很好。 自2010年4月谷歌在瀏覽器中證明Quake以來已經過去了一段時間。 隨着時間的流逝,這項技術只會不斷發展並得到更廣泛的實施,因此我建議您繼續朝着這個方向進行實驗。

Google Chrome實驗功能 (當然是Chrome瀏覽器專用)感到驚訝。 這些示例將為您提供一些很棒的想法。 特別注意那些已經實施的游戲及其功能,以作為衡量您自己作品的標准。

祝好運! 並在增加技能的同時獲得樂趣。

正如其他人已經說過的那樣,您不能每25毫秒執行一次XMLHttpRequest 我認為您感覺到的效果(瀏覽器占用了大量內存而不釋放內存)的可能性也很可能是由於:因為許多函數調用(最多每25毫秒一次),但是JavaScript引擎也很可能無法保持到此為止;請閱讀此好答案,以了解那些計時器的工作原理)不允許垃圾收集器釋放內存了。

將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); }
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM