✦ラボ · エンジニアリングログ

ピクセルパイプラインからの ノート。

Remioは、小さなチームが、公開の場で作っています。これは、その作業ログです。私たちが分解したキャプチャの経路、驚かされたエンコーダーの設定、壊しては作り直した遅延の予算。新しいエントリーが上にあり、古いものは、のちに考えが変わった場合でも、書いたままで残します。

最終更新 2026-05-197エントリー時系列、新しい順

✦研究ノート

エンジニアリングログを、順番に。

各エントリーには、日付と状態が付き、それだけで完結しています。提供中は、その変更が最新のビルドで有効なこと、実験は、まだ測定中であること、アーカイブは、すでに先に進んだことを意味します。

提供中

仮想ディスプレイが、クライアントのウインドウに追従するようになりました。

数週間、macOSのホストは、仮想ディスプレイをクライアントの画面解像度に固定していました。そのため、どちらかが変わった瞬間に、ホストのカーソルとクライアントのカーソルで、大きさが食い違いました。私たちは、ホストのワークスペースがクライアントのウインドウのキャンバスにリアルタイムで追従するよう、仮想ディスプレイの管理部分を書き直しました。今では、どんなウインドウサイズでも、境界をまたいでカーソルの大きさが一致します。Apple Screen Sharingが、ずっとそうしてきたのと同じです。

仮想ディスプレイの論理ポイント ≡ クライアントのウインドウのキャンバスのポイント  ·  ピクセルの上限 3840  ·  Retinaの1×か2×を、ウインドウのネイティブなピクセルの範囲ごとに選択

実験

仮想ディスプレイの範囲を、3840ピクセルに制限した理由。

仮想ディスプレイ用のディスプレイモードを作る、macOSの内部フレームワークには、知らないうちに破壊的な挙動があります。最大の寸法に4096以上を与えると、最大の位置に幻の2×のRetinaモードを作り出し、アクティブのフラグを奪うのです。要求したピクセル数は、倍になります。私たちは、4晩にわたる、探って記録する作業で、それを経験的に確認しました。3840なら、すべてのRetina MacBookの全画面と、4Kの外付けモニターに収まり、フレームワークは合成をやめます。私たちは、長い裾野を、まだ見守っています。

経験的に壊れる条件 ≥ 4096  ·  上限 = 3840  ·  16インチMacBook ProのRetina(3456 × 2234)と4Kの外付けモニター(3840 × 2160)をカバー

提供中

1週間の実験のあと、以前のストリーミングエンジンのビルドに戻しました。

私たちは、より新しいブランチでストリーミングエンジンを作り直しました。更新されたペーシングのロジックが、ローカルネットワークの経路で数ミリ秒を引き出してくれることを期待して。けれど結果は、測定したすべてのリモートセッションで、受信バッファが悪化しました。中央値のエンドツーエンドは18 ms増え、ばらつきも広がりました。私たちは、iOS、macOS、Android、Windowsのすべてで、安定したビルドに戻しました。新しいブランチのパッチは、上流の挙動が変わったときのために、アーカイブしてあります。

新しいビルドの遅延の中央値 · リモートで64 ms  ·  以前のビルドの中央値 · リモートで46 ms  ·  調整のフラグは変更なし

提供中

最初のラウンドトリップのサンプルから、ローカルネットワークとリモートのビットレートを適応的に判別。

ホストは、接続が確立されたあと、最初のラウンドトリップ時間の測定を待ってから、2つのビットレートの範囲のどちらかを選びます。15 ms未満なら、ローカルネットワークの直接接続として扱い、開始8 Mbps、最小8 Mbps、最大30 Mbpsにします。15 msを超えると、中継または遠隔として扱い、開始2 Mbps、最小300 Kbps、最大15 Mbpsにします。このしきい値は、同じネットワークのWiFiと、考えられるあらゆるモバイル回線や地域をまたぐ中継の間にあるので、ベータのテレメトリでは、誤検出はまれでした。

ローカルの直接 · 1〜5 ms  ·  同じネットワークのWiFi · 5〜10 ms  ·  地域内の中継 · 30〜80 ms  ·  4G · 40〜100 ms

提供中

WindowsホストのプライマリのエンコーダーとしてのAMDのハードウェアH.265。

競合するエンコーダーとの、長い比較のあと、AMDのハードウェアH.265が、私たちが気にしたWindowsホストのすべてのベンチマークで勝ちました。エンコード時間の中央値が低く、キーフレームのスパイクが低く、超低遅延の固定ビットレートのプリセットは、バッファに圧力がかかっても、予測どおりに動きます。GPUが合わないときのフォールバックは、H.264です。Bフレームはオフ。低遅延のフラグはオン。エンコーダーは、キャプチャのティックごとに、必ずちょうど1フレームを出力します。

ビットレート · 8 Mbpsの固定  ·  fps · 60  ·  バッファ · 1フレーム  ·  Bフレーム · 0  ·  プリセット · 超低遅延

アーカイブ

フレームのバッファリングを、完全にやめた理由。

リモートデスクトップは、ビデオ通話ではありません。すべてのフレームは、最新の画面の状態です。古いフレームは、定義上、嘘です。私たちは、再生バッファがない形に、受信の経路を作り直しました。フレームが届き、デコードされ、描画される。その順番で、同じフレーム間隔のうちに。失われたフレームは、古いものの再送ではなく、新しいキーフレームを要求します。私たちは、たまに短く固まることは受け入れます。待ち行列が毎回かけるミリ秒の税は、受け入れません。

強制した再生遅延 · 最小0 / 最大0  ·  最小の再生遅延 · 0  ·  損失時はキーフレームを要求  ·  パケットの再送なし

アーカイブ

遅延の予算を、初めて書き出しました。

私たちは、ひとつの部屋に座って、ユーザーに感じてほしい数字から逆算しました。一般的なローカルネットワークのセッションで、ガラスからガラスまで、20ミリ秒未満。キャプチャ、エンコード、ペーシング、送信、受信バッファ、デコード、描画。それぞれを書き出して、測定して照らし合わせられるミリ秒の予算を与えました。このログのエントリーの多くは、本番のトラフィックの中で、その数字を守ることから生まれています。

キャプチャ · 1 ms  ·  エンコード · 3 ms  ·  ペーシングのバースト · ≤ 10 ms  ·  受信バッファ · 0 ms  ·  デコード · 2 ms  ·  描画 · 1 ms

✦シグナルの範囲

セッションごとに、測っていること。

この4つの数値は、すべてのリリースノートに載せています。仕様書に書かれていることではなく、接続が実際にどう感じられるかを表しているからです。

ストリームの解像度
最大6Kネイティブなピクセルの範囲。Retinaの1×か2×を、ウインドウごとに選択
フレームレート
最大120 fps固定のリズム、Bフレームなし、フレームごとにキャプチャのティック1回
処理遅延、ローカルネットワーク
~8 msデバイスどうしの直接接続で、社内測定。残りは、ディスプレイ自体の60 Hzのリフレッシュ周期
通信の暗号化
エンドツーエンド毎回新しいセッション鍵で、エンドツーエンドに暗号化
Remioのアプリアイコン

パンフレットではなく、開発を追ってください。

ラボは、何かが提供されたとき、あるいは何かが壊れたときに更新されます。四半期ごとのニュースレターより役に立ちそうなら、ダウンロードのリンクはワンクリック先にあります。長いバージョンを読みたければ、セキュリティホワイトペーパーも同じです。

アカウント不要追跡ピクセルなし公開で開発