実現したいこと
Javaで開発中のアプリケーションが、
ノートPC(家電量販店等で購入できる一般なもの)で「バッテリー駆動時」も
「電源に接続」時と同等なパフォーマンスを出したい。
発生している問題
ノートPCを「バッテリー駆動」状態でクライアントアプリを稼働させると、
描画処理に遅延が発生してしまう。
※クライアントアプリを目視していると、データが歯抜けに見えてしまうことがある。
現在開発している質問の対象について
JavaFx WebViewを利用したWindowsクライアントアプリ(exeアプリ)
※本件はシステムのバージョンアップ時に発生した現象で、
現在リリースされているアプリは実害はなく動作しています。
Java6 Swingで構築
システムの全体像について
FX(投資)アプリのようなもので、
サーバサイドからクライアントへ対して、リアルタイムに情報を配信し、
クライアントから申込を行います。
クライアントアプリは静的なHTMLをサーバから取得し、
更新される情報はサーバ⇒クライアントへUDP送信しています。
※UDPデータの更新間隔は最短70ms。
UDPの1パケットには、画面へ描画する複数の情報が含まれています。
更新データの画面描画処理はJava⇒Javascriptをコールし、
描画処理を実施しています。
試したこと
①描画する内容を減らす。
⇒あまり効果は見られなかった。
②Java→Javascriptの関数をコールするのではなく、
Java→JavascriptへWebSocket(local内)で転送する。
⇒効果はあったが、完全に解消はできなかった。
そもそも「電源に接続」と「バッテリー駆動時」では
下記の処理を実行した場合に、「バッテリー駆動時」の方が
処理時間がかかることを確認。
「電源に接続」:50679ms
「バッテリー駆動時」:52273ms
※複数回試した結果、下記のような単純な処理でも1.5秒程度の差が発生する。
public class Main { public static void main(String[] args) { long startTime = System.currentTimeMillis(); System.out.println("開始:"+startTime); for(int i=0;i<1000;i++) { try { Thread.sleep(50); } catch (InterruptedException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } } long finTime = System.currentTimeMillis(); System.out.println("終了:"+finTime); System.out.println("処理時間:"+(finTime-startTime)); } }
Javaアプリの設計・コーディング時に考慮するべきこと、
WindowsのOS設定で「×××」を変更すれば良いなど
同様な問題に対応した方法など
解決に向けてお知恵をお借りしたいです。
補足情報(FW/ツールのバージョンなど)
OS:Windows10
言語:Java8
フレームワーク:JavaFx WebView