x

Search in
Sort by:

Question Status:

Search help

  • Simple searches use one or more words. Separate the words with spaces (cat dog) to search cat,dog or both. Separate the words with plus signs (cat +dog) to search for items that may contain cat but must contain dog.
  • You can further refine your search on the search results page, where you can search by keywords, author, topic. These can be combined with each other. Examples
    • cat dog --matches anything with cat,dog or both
    • cat +dog --searches for cat +dog where dog is a mandatory term
    • cat -dog -- searches for cat excluding any result containing dog
    • [cats] —will restrict your search to results with topic named "cats"
    • [cats] [dogs] —will restrict your search to results with both topics, "cats", and "dogs"

AnswerHub Maintenance

Background maintenance is scheduled to occur between 9 - 11am EDT on Tuesday, May 21. Site operation may be slower than normal during this time and a brief interruption in operation may be observed

AndroidでのHttpモジュールの通信速度について

AndroidでHttpモジュールを使用してHttpのGETでバイナリファイルをダウンロードしたところ、80M相当で数分かかりました。 こちらHttpモジュールの設定等で高速化が可能でしょうか?

現状はReadバッファサイズとスレッド更新頻度を下記の機能で調整しようとしていますが、期待する速度が現在出ていません。 FHttpModule::SetMaxReadBufferSize(); FHttpModule::SetHttpThreadTickRate();

https://answers.unrealengine.com/questions/456660/http-why-is-http-get-so-slow-it-takes-at-least-10x.html のスレッドも確認したのですが、Androidに関しては有益な情報が見つかりませんでした。

※エディター上では速度的な問題はでていません。

Product Version: UE 4.13
Tags:
more ▼

asked Dec 02 '16 at 10:56 AM in Japanese

avatar image

清水伸彦
1 3 2

avatar image HogeTatu Feb 05 '17 at 04:36 PM

AndroidではWindowsと同様にLibCurlが使用されています。
実装を読んだ限りだと特にcurlオプションの指定等で問題となるような記述は見受けられませんでした。
手元にAndroid実機が無いため検証はできていないのですが、もしかすると受け取ったレスポンスをバッファにコピーする部分がボトルネックになっているのかもしれません。
ボトルネックになりそうな実装は以下の部分です。

1.FCurlHttpRequest::ReceiveResponseBodyCallback にて受け取ったレスポンスを Response->Payload にコピーしているのですが、Payloadのサイズが設定されていないために、大きなデータを受信した場合に何度もメモリの再確保が発生する可能性があります。
  こちらはサイズを設定するAPIが提供されていないため、エンジンコードに手を入れる必要がありますが、FCurlHttpResponse::Payload の初期化タイミングで適切なサイズを確保してあげることで再確保を防ぐことが可能だと思われます。

2.もしも FCurlHttpResponse::GetContentAsString を使用されている場合、文字列変換のためにPayloadと同サイズのテンポラリ配列にコピーする上に、FString形式で戻り値を返す際に更にコピーが発生しています。
  今回はバイナリファイルのダウンロードとのことなので文字列変換は必要無いため、GetContentAsString ではなく GetContent を使用しているかどうかをご確認ください。

avatar image 清水伸彦 Feb 06 '17 at 10:14 AM

HogeTatu さん、回答ありがとうございます。 2.の方はGetContentを使用していますので、問題ないと思います。 1.の方ですが、当方でもソースを確認したところ、Response->Payload.AddUninitialized 処理内の ResizeGrow(Array.h)の実装によってはメモリの再確保に問題がありそうに感じました。 ※ArrayMaxを頻繁に超えるようなAddがあるとパフォーマンスが落ちる? ※実際10K前後のファイルのダウンロードにはそれほど時間がかかっていません。 ※ゲームで使用する場合は、FCurlHttpResponseでの受信データをテンポラリファイルに書き込む方が良いかもしれません。

現状調査を続けていますが、まだ解決には至っていません。

avatar image HogeTatu Feb 06 '17 at 03:53 PM

確かに大きなサイズのレスポンスを扱う場合、テンポラリファイルに書き込んでバッファサイズが大きくならないようにするのは良いかもしれませんね。
ちなみにまだしっかり把握できていないのですが、エンジンのRuntimeモジュールにNetworkFileというものが存在します。
軽く読んだ限りだとネットワーク上に存在するファイルをHTTPもしくはTCPでダウンロードし、ローカルにキャッシュする仕組みのように見受けられます。
レスポンスをメモリに乗せるHTTPモジュールと比較すると用途に合っているかもしれないので、こちらもご確認ください。

avatar image mayonezu Feb 08 '17 at 11:28 AM

HogeTatuさん、1について、Response->PayloadをReceiveResponseHeaderCallbackのContentLengthを取得したタイミングでサイズを確保する処理に変えて検証してみたが、Android実機上の速度は前とほぼ変化なしだったので原因はここではなかったのかもしれません、2についてはGetContentを使用していますので問題ないです。上の返事にご提示いただいたNetworkFileのほうも確認させていただきます。

avatar image HogeTatu Feb 08 '17 at 03:48 PM

なるほど…。それは残念です。こちらでもまた何かわかったら共有させて頂きます。

(comments are locked)
10|2000 characters needed characters left

1 answer: sort voted first

Httpを使用したネットワーク機能自体に既知の不具合があります(UE_33732)。
明確な要因や回避策まで特定できていないため、設定等による高速化を実現することはできかねるかと思われます。 以下のバグレポートを追跡して下さい。
宜しくお願いします。

-similar problem
https://answers.unrealengine.com/questions/320627/varest-http-get-slow.html

-issue
https://issues.unrealengine.com/issue/UE-33732

more ▼

answered Dec 25 '16 at 03:59 AM

avatar image

Pier Pop
2.1k 78 4 27

avatar image 清水伸彦 Dec 26 '16 at 02:44 AM

Pier Poops さん、回答ありがとうございます。 https://issues.unrealengine.com/issue/UE-33732 を確認した限りでは、エンジン側の対応待ちになりますね。

(comments are locked)
10|2000 characters needed characters left
Your answer
toggle preview:

Up to 5 attachments (including images) can be used with a maximum of 5.2 MB each and 5.2 MB total.

Follow this question

Once you sign in you will be able to subscribe for any updates here

Answers to this question