Firefox 68のWebRender機能をRyzen APUで有効化する
2019年7月にリリースされたFirefox 68.0で、新レンダリングエンジンのWebRenderがAMDのGPUでも有効化されました(リリースノート)。
同じ頃に新APUのRyzen 5 3400gを購入していて、ブラウジングが高速化すると期待していました。しかしよく確認してみると、7月末現在ではRyzen APUの内蔵GPUではWebRenderが有効化されないことが分かりました。
APU内蔵とは言え、Radeon VegaならWebRenderが使えるはずでは?と思ったら有効化されないのはバグで、既にレポートが出ていました。
- Deafult webrender disabled after changing AMD gpu : firefox
- 1566811 - AMD Radeon Vega 8 "too old" for WebRender
WebRenderの強制有効化
将来的にはバグが修正されるでしょう。WebRenderを有効化する設定値があるので、今のところはこれで使用します。 参考:https://www.askvg.com/tip-how-to-enable-or-disable-new-webrender-feature-in-mozilla-firefox/
- アドレスバーに
about:config
と入力 gfx.webrender.all
を検索し、「値」をダブルクリックしてtrue
に変更- Firefoxを再起動
- アドレスバーに
about:support
と入力し、グラフィックの画像処理がWebRenderになっていればOK
自分の場合は上記の変更でDirect 3D 11からWebRenderに切り替わりました。試してみると、ページが描画される瞬間の間が体感できるレベルで短くなっていて、キビキビ動くようになったという感触です。
WebRenderベンチマーク
本当に高速化しているのか、念のためにベンチマークを実行しました。参考:Firefox 67.0 WebRenderを有効にして高速描画 - とある人柱のblog
動作確認環境
- Windows 10 Home 1903
- AMD Ryzen 5 3400g with Radeon Vega Graphics (RX Vega 11)
- Radeon ソフトウェア エディション Adrenalin 2019 19.7.3
物凄く速くなっています。Ryzen APUでも高速化できることが確認できました。
Windows上のVSCode + Code RunnerでWSLのコマンドを実行する
Visual Studio CodeのCode Runner拡張機能でWindows側から WSL(Windows Subsystem for Linux)のコマンドを実行する設定方法です。
実行環境
- Visual Studio Code自体はWindows 10で実行
- Code Runnerでコードを実行する際、WindowsではなくWSL上のコマンドを実行する
- WSLのLinuxはPengwinを使用
設定方法その1 - カレントディレクトリを移動して実行
例としてWSLのperlを実行するようにします。Visual Studio Codeのユーザー設定(settings.json)に以下のように入力します。WSLのコマンドの呼び方は 「Windows 10のコマンドプロンプトからWSL上のLinuxコマンドを呼び出す(バージョン1803対応版):Tech TIPS - @IT」が詳しいです。
{ "code-runner.executorMap": { "perl": "cd $dir && wsl perl $fileName" }, }
試しに実行中のOSを出力するperlスクリプトを実行してみます。Windows版のperlだと「MSWin32」となる所が「linux」になり、WSL上で実行されている事がわかります。
補足
ちなみに単純化して以下のようにしても、パスがWindowsのフォーマットで渡されるため動作しません。これを避けるために上記の設定ではcd $dir
を入れてカレントディレクトリを移動し、ファイルのフルパスを渡さないようにしています。
{ "code-runner.executorMap": { # 動作しない "perl": "wsl perl" }, }
設定方法その2 - wslpathを使用
最初の設定では「wsl.exe
は実行時のカレントディレクトリをそのまま引き継ぐ」ということを利用してcd $dir
を入れていました。もう1つ、wslpath
を使ってきちんとパスを変換する方法もあります。
{ "code-runner.executorMap": { "perl": "bash -c \"perl $(wslpath $fullFileName)\"" }, }
この場合のbash
はLinux上ではなく、WSLをセットアップするとインストールされるbash.exe
が実行されます。-c
オプションのコマンドはWSL上で実行されるので、Code Runnerのパラメータである$fullFileName
をwslpath
でWSLフォーマットに変換すればいいということになります。カレントディレクトリを変更しないという点では、こちらの方が本来の動作に近いと言えます。
ただし、このパスの途中に空白を含むファイルは実行できません。「方法その1」のcd $dir
方式では問題なく実行できます。
設定方法その3 - 自力でWSLのパスに変換
パスに空白文字が含まれていても動作するように改良したバージョンです。sedでバックスラッシュをスラッシュに置換→ドライブレター(C:
など)を/mnt/c
に置換→シングルクオートで囲む、という処理を行っています。エスケープシーケンスが多すぎて分かりづらくなってしまいました。
{ "code-runner.executorMap": { "perl": "bash -c \"perl '$( echo $fullFileName | sed 's%\\\\%/%g' | sed 's%^\\([a-zA-Z]\\):%/mnt/\\L\\1%' )'\"" }, }
ASUSのファンレスマザーボード「PRIME J4005I-C」でゲームリモートプレイ用PCを作ってみた
ASUSのGemini Lake SoC搭載マザーボードPRIME J4005I-Cを購入しました。目的は「寝ながらPCゲームをプレイする」です。ポータブルモニターとタブレットアームを使い、Steamでホームストリーミングすることを狙いました。この記事ではマザーボードの特徴と使用感を紹介していきます。
実はHDMI 2.0対応
PRIME J4005I-Cを使ってみて意外だったのが、HDMI端子が4K 3840 x 2160 60Hzに対応していることでした。
スペックに ”Supports HDMI with max. resolution 4096 x 2304 @ 24 Hz” と記載されているので勝手にHDMI 1.4だと思っていました。
ただし4K 60Hz対応と言ってもヌルヌル動くわけではなく、ブラウザーのスクロールなどは多少カクつきます。
Steamホームストリーミングは1080pで充分快適。Moonlight PCだとさらに綺麗
目的であるゲームのストリーミングプレイは思ったよりラグが少なく、自分の環境では22ms程度の遅延でした。タイミングがシビアなゲームでなければ充分だと思います。ストリーミングはDXVA2のハードウェアデコードが有効になっていました。
NVIDIA SHIELDのゲームストリームがPCでも使えるようになるMoonlight PCも試してみると、さらに綺麗で安定したフレームレートでプレイできました。SteamがH.264でエンコードしているのに対してSHIELDはH.265を使っているので差が出ているのかもしれません。
ケースファンのセミファンレス化が可能
BIOSで呼び出せるQ-Fan controlでは、CPU温度が閾値以下に下がるとケースファンを停止するように設定できます。停止できるのはDC 3ピンコネクターのファンをマニュアル制御で「Fan off」にした場合のみで、PWM 4ピンのファンでは設定できませんでした。
PRIME J4005I-Cその他の特徴
XboxワイヤレスコントローラーがBluetoothで検出できない場合の対処法
PCのシステムを新調し、Windows 10も再インストールしたのでXboxワイヤレスコントローラーをBlutooth接続しようとしたら・・・検出できないぞ?となったので解決法を載せておきます。
BluetoothでXboxコントローラーを接続するときは「マウス、キーボード、ペン、オーディオまたはその他の種類のBluetoothデバイス」を選択します。
下の「その他すべて」という項目に「Xboxコントローラーとワイヤレスアダプター、DLNAなど」と記載されていますが、こちらではコントローラーは検出されません。
久しぶりで忘れていたとは言え、表記が紛らわしいので修正したほうがいいのでは?と思いました。
マイクロソフト ゲームコントローラー Bluetooth/有線接続/xbox one/Windows対応 PC用USBケーブル同梱 4N6-00003
- 出版社/メーカー: マイクロソフト
- 発売日: 2017/02/02
- メディア: Personal Computers
- この商品を含むブログを見る
CPUをCore i7 6700からCore i5 8400に変更したので性能を比較してみた
PCのシステムを更新して、CPUをCore i7 6700(Skylake)からCore i5 8400(Coffee Lake)にしました。
i5 8400の性能はi7 7700Kに匹敵すると言われており、簡易的ですがCPU-Zのベンチマークで確認してみました。
Core i7 6700の場合(4コア8スレッド)
シングルスレッドは407ポイント、マルチスレッドは1833ポイントになりました。
Core i5 8400の場合(6コア6スレッド)
シングルスレッドは460ポイント、マルチスレッドは2539ポイントになりました。確かに7700Kに近いですね。
比較結果
Core i7 6700からCore i5 8400にしたことでシングルスレッドは13%、マルチスレッドは38%向上しました。マザーボードも買い替える必要があるので、結局はCore i7 7700Kを買うのと同じくらいの投資になってしまいますが・・・
[Perl6]Unicodeプロパティを使って半角・全角の文字にマッチする正規表現を書く
Perl6で全角文字にマッチする正規表現を書いたり、特定の文字の「幅」を調べる方法です。具体的にはUnicodeのEast_Asian_Width
というプロパティを調べることで半角・全角を判断します。
Unicodeプロパティを表示するにはuniprop
メソッドを使います。
以下のコードでは文字列を1文字ずつに分解し、East_Asian_Width
プロパティを表示します。
for "aaAÅÆ??++22Ⅱあ漢カ㍍".comb -> $char { say $char => $char.uniprop("East_Asian_Width"); }
以下が実行結果です。半角英数字・記号はNa
、全角英数字・記号はF
、ひらがなや漢字はW
、それ以外はN
やA
、半角カタカナはH
となりました。通常の全角日本語であればF
とW
にマッチさせればよさそうです。
a => Na a => F A => Na Å => N Æ => A ? => Na ? => F + => Na + => F 2 => Na 2 => F Ⅱ => A あ => W 漢 => W カ => H ㍍ => W
Perl6の正規表現でUnicodeプロパティを使うには<:プロパティ名>
という形式を使用します。また、+
で連結することで文字集合を合成できます。
さらに、East_Asian_Width
はea
という省略形があるので以下のように書けます。
my $str = "はいおgふrtjrtw吸うrwぇjおare+JerOwHr歩wえwgweおぐぇいおhio"; # 全角文字にマッチ say $str ~~ m:global/ <:ea('W')+:ea('F')>+ /; # 出力:(「はいおgふ」 「吸う」 「ぇ」 「お」 「+」 「歩」 「え」 「おぐぇいお」) # 半角文字にマッチ say $str ~~ m:global/ <:ea('Na')>+ /; # 出力:(「rtjrtw」 「rw」 「j」 「are」 「JerOwHr」 「w」 「wgwe」 「hio」)
参考情報
[Perl6]HTMLエスケープはtransメソッドを使おう
HTMLやXMLの処理でよくある特殊文字「& < > ' "
」のエスケープをPerl 6でやってみましょう。
Perl 6の文字列には.trans
という便利なメソッドがあります。これは変換前→変換後のペアを受け取って文字の変換を行ってくれます。
my $trans-pair = ( '&', '<', '>', q{"}, q{'} ) => ( '&', '<', '>', '"', ''' ); sub encode-entities(Str $str) { return $str.trans($trans-pair); } my $encoded = encode-entities( q[a & b < c > d " e '] ); say $encoded; # 出力:a & b < c > d " e '
エスケープ済みの文字列を復元するのは簡単で、.trans
メソッドに渡すペアを逆にするだけです。ペアを逆にするには.antipair
メソッドを使います。
my $trans-pair = ( '&', '<', '>', q{"}, q{'} ) => ( '&', '<', '>', '"', ''' ); sub encode-entities(Str $str) { return $str.trans($trans-pair); } sub decode-entities(Str $str) { return $str.trans($trans-pair.antipair); # ペアを逆にして渡す } my $decoded = decode-entities( q[a & b < c > d " e '] ); say $decoded; # 出力:a & b < c > d " e '