2017-02-09 17 views
0

今は私はサーバーにHTTPリクエストをしていますが、いくつかのJSONデータとともにGETリクエストを送信する必要があります。私が今やっていることは「うまくいく」とは言いますが、それぞれの要求がほぼ15FPSに低下するのでひどいです。ここに私のコードです。ここでUnityのサーバーにGETリクエストを行う最良の方法

は私のGETクエリである:ここで

{ 
"query": { 
    "match_all": {} 
}, 
"size": 1, 
"sort": [{ 
    "@timestamp": { 
     "order": "desc" 
    } 
}] 
} 

は私のstartメソッドである:ここで

void Start() 
{ 
     queryString = File.ReadAllText(Application.streamingAssetsPath +"/gimmeData.json"); 

     StartCoroutine(SetJsonData()); 
} 

は、私が実際に要求を行うように設定している共同coutineです:

private IEnumerator SetJsonData() 
{ 
    // Make a new web request with the .net WebRequest 
    request = WebRequest.Create(elk_url); 
    yield return null; 

    request.ContentType = "application/json"; 
    request.Method = "POST"; 
    buffer = Encoding.GetEncoding("UTF-8").GetBytes(queryString); 

    // Put this yield here so that I get higher FPS 
    yield return null; 

    requestStream = request.GetRequestStream(); 
    requestStream.Write(buffer, 0, buffer.Length); 
    requestStream.Close(); 
    // Again this is about getting higher FPS 
    yield return null; 

    response = (HttpWebResponse)request.GetResponse(); 
    // Wait until we have all of the data we need from the response to continue 
    yield return requestStream = response.GetResponseStream(); 

    // Open the stream using a StreamReader for easy access. 
    reader = new StreamReader(requestStream); 
    // Set my string to the response from the website 
    JSON_String = reader.ReadToEnd(); 

    yield return null; 

    // Cleanup the streams and the response. 
    reader.Close(); 
    requestStream.Close(); 
    response.Close(); 
    yield return null; 

    // As long as we are not null, put this in as real C# data 
    if (JSON_String != null) 
    { 
     // Wait until we finish converting the string to JSON data to continue 
     yield return StartCoroutine(StringToJson()); 
    } 

    if(dataObject != null) 
    { 
     // Send the data to the game controller for all of our hits 
     for(int i = 0; i < dataObject.hits.hits.Length; i++) 
     { 
      StartCoroutine(
       gameControllerObj.CheckIpEnum(dataObject.hits.hits[i]._source)); 
     } 
    } 

    // As long as we didn't say to stop yet 
    if (keepGoing) 
    { 
     yield return null; 

     // Start this again 
     StartCoroutine(SetJsonData()); 
    } 
} 

FPSがすでに改善されているため、私はそれらの "yield return null"をすべて持っています。

これをどのように最適化できますか?そこにGETデータを送ることができるWebリクエストを作る良い方法はありますか?私はUnityWebRequestが事であることを知っていますが、それは私が持っているJSONデータを送ることを許しません。

答えて

2

注:ご質問のコードはGETではなくPOSTを実行しています。 「データを取得する」というようなことはありません。

以下の提案は、サーバーの観点からと同等です。

実際にGETリクエストが必要な場合、つまりコードとはまったく異なるものについては、この回答の最後をご覧ください。

コルーチンはスレッド

Wait until we have all of the dataではありません - あなたのフレームレートが死ぬことを出番です。これは、Unityメインスレッド(本質的にゲーム全体)が、サーバがすべてのデータで応答するのを待つためです。

これは、コルーチンがどのように機能するかという理由からです。つまり、スレッドとは非常に異なっています。

Unityの一般的なアプローチは、代わりにコルーチンにWWWを使用することです。内部Unityは別のスレッドで、実際の要求を実行し、そのコルーチンはただしょっちゅう進行上でのチェック:

POST、あなたの質問のコードをマッチング:あなたの質問に一致する

// Build up the headers: 
Dictionary<string,string> headers = new Dictionary<string,string>(); 

// Add in content type: 
headers["Content-Type"] = "application/json"; 

// Get the post data: 
byte[] postData = Encoding.GetEncoding("UTF-8").GetBytes(queryString); 

// Start up the reqest: 
WWW myRequest = new WWW(elk_url, postData, headers); 

// Yield until it's done: 
yield return myRequest; 

// Get the response (into your JSON_String field like above) 
// Don't forget to also check myRequest.error too. 
JSON_String = myRequest.text; 

// Load the JSON as an object and do magical things next. 
// There's no need to add extra yields because 
// your JSON parser probably doesn't support chunked json anyway.   
// They can cover a few hundred kb of JSON in an unnoticeable amount of time. 
.... 

GET、:

// Start up the reqest (Total guess based on your variable names): 
// E.g. mysite.com/hello?id=2&test=hi 
WWW myRequest = new WWW(elk_url + "?"+queryString); 

// Yield until it's done: 
yield return myRequest; 

// Get the response 
JSON_String = myRequest.text; 
.... 
関連する問題