(57)【要約】  クライアント・マシンは、ディスプレイ上にグラフィックスを描写するプログラム（例えばビデオゲーム）の実行中にシェーダをコンパイルするように構成される。これらのクライアント・マシンは、クライアント・マシンのハードウェア構成、プログラムのアプリケーション識別子（ＩＤ）、及びコンパイルされたシェーダのためのシェーダＩＤのセットを含む情報を、リモート・コンピューティング・システムにアップロードしてもよく、リモート・コンピューティング・システムは、シェーダＩＤをカタログ化し、１つ以上のクライアント・マシンからコンパイルされたシェーダ・コードを選択的に要求し、再配布のためにコンパイルされたシェーダ・コードを選択的に準備する。その後、一致するハードウェア構成を有する要求するクライアント・マシンは、特定のプログラムのためにリモート・システムからコンパイルされたシェーダ・コードを受信してもよく、プログラム実行中に使用するためにコンパイルされたシェーダ・コードをプリキャッシュしてもよい。【選択図】  図１
2021512391.tif 000002
【特許請求の範囲】
【請求項１】
クライアント・マシンであって、
中央処理装置（ＣＰＵ）と、
グラフィックス・プロセッシング・ユニット（ＧＰＵ）と、
コンピュータが実行可能な命令を格納するメモリと、を具備し、前記命令は、前記ＣＰＵにより実行されると、前記クライアント・マシンに以下のことをさせる
前記クライアント・マシンに関連付けられたディスプレイ上でグラフィックスを描写する複数のインストールされたプログラムのうちの１つを実行するように構成されたクライアント・アプリケーションをロードし、
前記複数のインストールされたプログラムのうちの１つのプログラムのためにコンパイルされたシェーダ・コードを求めるため、前記クライアント・マシンのハードウェア構成を含んだ要求をリモート・コンピューティング・システムに送信し、
前記リモート・コンピューティング・システムから、前記コンパイルされたシェーダ・コードが利用できない旨の指示を受信し、
前記プログラムを実行し、
前記クライアント・マシンのグラフィックス・ドライバにより、前記ＧＰＵによって実行可能なマシン・コード内のコンパイルされたシェーダとしてシェーダのセットをコンパイルし、
前記グラフィックス・ドライバによって、前記コンパイルされたシェーダを、予め定義されたメモリ・ロケーションに、前記プログラムのアプリケーション識別子（ＩＤ）と関連づけてキャッシュし、
前記コンパイルされたシェーダのためのシェーダＩＤのセットを生成し、
前記リモート・コンピューティング・システムに情報を送信し、前記情報は、
前記クライアント・マシンの前記ハードウェア構成と、
前記プログラムの前記アプリケーションＩＤと、
前記コンパイルされたシェーダの前記シェーダＩＤのセットと、
を含む、
クライアント・マシン。
【請求項２】
前記プログラムは、ビデオゲームである、請求項１のクライアント・マシン。
【請求項３】
前記ハードウェア構成は、前記グラフィックス・ドライバのバージョンと前記ＧＰＵのモデルを指定する、請求項１のクライアント・マシン。
【請求項４】
前記コンピュータが実行可能な命令は、前記ＣＰＵにより実行されると、前記クライアント・マシンに、前記コンパイルされたシェーダ・コードの前記マシン・コードをハッシュ化してハッシュのセットを生成させ、前記ハッシュのセットが前記リモート・コンピューティング・システムに送信される前記情報に含まれる、請求項１のクライアント・マシン。
【請求項５】
リモート・コンピューティング・システムにより、第１クライアント・マシンから第１情報を受信すること、前記第１情報は
前記第１クライアント・マシンの第１ハードウェア構成と、
クライアント・マシンで前記プログラムの実行中に、前記クライアント・マシンに関連付けられたディスプレイ上にグラフィックスを描写するプログラムのアプリケーション識別子（ＩＤ）と、
第１クライアント・マシンで前記プログラムの実行中に、前記第１クライアント・マシンのグラフィックス・ドライバによってコンパイルされたシェーダのシェーダＩＤのセットと、
を含み、
前記リモート・コンピューティング・システムにより、前記第１ハードウェア構成及び前記アプリケーションＩＤに従ってシェーダＩＤのセットをカタログ化すること、
前記リモート・コンピューティング・システムによって、前記第１クライアント・マシンから、前記シェーダの１つ以上のシェーダに対応するコンパイルされたシェーダ・コードを要求すること、
前記リモート・コンピューティング・システムによって、前記第１クライアント・マシンから前記コンパイルされたシェーダ・コードを受信すること、
コンパイルされたシェーダ・コードを再配布のため、アプリケーションＩＤ及び第１ハードウェア構成と関連付けること、
前記リモート・コンピューティング・システムにより、第２クライアント・マシンから第２情報を受信することと、前記第２情報は、
前記第２クライアント・マシンの第２ハードウェア構成と、
前記プログラムのアプリケーションＩＤと、
を含み、
前記リモート・コンピューティング・システムにより、前記第２ハードウェア構成が前記第１ハードウェア構成と一致することを決定すること、
前記リモート・コンピューティング・システムにより、前記第２クライアント・マシンで前記プログラムの実行中に、前記第２クライアント・マシンのグラフィックス・プロセッシング・ユニット（ＧＰＵ）によって実行されるように、前記コンパイルされたシェーダ・コードを前記第２クライアント・マシンに送信すること、
を含む方法。
【請求項６】
前記プログラムは、ビデオゲームである、請求項５の方法。
【請求項７】
前記シェーダＩＤのセットは、シェーダキーのセットを具備し、前記シェーダキーのセットは、タプルのセット内に前記第１クライアント・マシンから受信され、個々のタプルがシェーダキーと、前記シェーダキーに対応するシェーダのために前記コンパイルされたシェーダ・コードのハッシュとを含む、請求項５の方法。
【請求項８】
前記リモート・コンピューティング・システムにより、コンパイルされたシェーダ・コードの検証用ハッシュを生成するため、前記第１クライアント・マシンから受信したコンパイルされたシェーダ・コードをハッシュ化すること、をさらに具備し、
前記コンパイルされたシェーダ・コードと再配布のための前記アプリケーションＩＤ及び前記第１ハードウェア構成との関連付けは、前記第１クライアント・マシンから受信した前記タプルのセットの１つのタプル内の前記コンパイルされたシェーダ・コードのハッシュと一致する検証ハッシュの少なくとも一部に基づいている、請求項７の方法。
【請求項９】
前記第２ハードウェア構成が前記第１ハードウェア構成と一致することは、前記第１ハードウェア構成と前記第２ハードウェア構成が、共通のグラフィックス・ドライバのバージョンと共通のＧＰＵモデルを指定することを決定することを具備する、請求項５の方法。
【請求項１０】
前記コンパイルされたシェーダ・コードの前記要求は、前記リモート・コンピューティング・システムが、少なくとも所定の数の異なるクライアント・マシンから、前記第１クライアント・マシン及び少なくとも１つの追加のクライアント・マシンを含む異なるクライアント・マシンから、前記１つ又は複数のシェーダの１つ又は複数のシェーダＩＤを受信したことに応答して実行される、請求項５の方法。
【請求項１１】
前記コンパイルされたシェーダ・コードを再配布のための前記アプリケーションＩＤ及び第１ハードウェア構成に関連付ける前に、
リモート・コンピューティング・システムにより、異なるハードウェア構成を持ち、異なるアプリケーションＩＤを提供する複数のクライアント・マシンから、追加のシェーダＩＤを受信すること、
前記リモート・コンピューティング・システムにより、ハードウェア構成とアプリケーションＩＤによる追加のシェーダＩＤをカタログ化すること、
前記リモート・コンピューティング・システムにより、前記１つ又は複数のシェーダの特定のシェーダＩＤについて、前記リモート・コンピューティング・システムに前記特定のシェーダＩＤを送信した複数の異なるクライアント・マシンの数をカウントすること、
前記異なるクライアント・マシンの数が閾値を満たすか、又は超えていると判断すること、
をさらに具備し、
前記コンパイルされたシェーダ・コードと再配布のための前記アプリケーションＩＤ及び前記第１ハードウェア構成との関連付けは、前記異なるクライアント・マシンの数が閾値を満たすか、又は超えると判断することに少なくとも一部で基づいている、請求項５の方法。
【請求項１２】
前記コンパイルされたシェーダ・コードを再配布のための前記アプリケーションＩＤ及び前記第１ハードウェア構成に関連付ける前に、
前記第１クライアント・マシンに関連付けられたユーザアカウントが信頼されたアカウントであるかどうかを判断すること、をさらに具備し、
前記コンパイルされたシェーダ・コードと再配布のための前記アプリケーションＩＤ及び前記第１ハードウェア構成との関連付けは、前記ユーザアカウントが信頼されたアカウントであるとの判断に少なくとも部分的に基づいている、請求項５の方法。
【請求項１３】
前記コンパイルされたシェーダ・コードを再配布のための前記アプリケーションＩＤ及び前記第１ハードウェア構成と関連付ける前に、
前記リモート・コンピューティング・システムにより、前記第１ハードウェア構成と一致するハードウェア構成を有する複数のクライアント・マシンから追加のシェーダＩＤを受信すること、
前記リモート・コンピューティング・システムにより、前記第１クライアント・マシンから前記コンパイルされたシェーダ・コードの受信に加えて、前記複数のクライアント・マシンのうちの少なくとも１つのクライアント・マシンから前記コンパイルされたシェーダ・コードを受信すること、
前記少なくとも１つのクライアント・マシンから受信した前記コンパイルされたシェーダ・コードが、前記第１クライアント・マシンから受信した前記コンパイルされたシェーダ・コードと一致することを判断すること、
をさらに具備し、
前記コンパイルされたシェーダ・コードと再配布のための前記アプリケーションＩＤ及び前記第１ハードウェア構成との関連付けは、前記少なくとも１つのクライアント・マシンから受信した前記コンパイルされたシェーダ・コードが前記第１クライアント・マシンから受信した前記コンパイルされたシェーダ・コードと一致するとの判断に少なくとも部分的に基づいている、請求項５の方法。
【請求項１４】
前記コンパイルされたシェーダ・コードを前記第２クライアント・マシンに送信した後、
リモート・コンピューティング・システムにより、前記第１ハードウェア構成と一致する第３ハードウェア構成を有する第３クライアント・マシンから１つ以上のシェーダＩＤのシェーダＩＤを受信すること、前記第３クライアント・マシンに関連付けられたユーザアカウントは、信頼されたユーザアカウントであり、
前記リモート・コンピューティング・システムにより、前記第１クライアント・マシンからの前記コンパイルされたシェーダ・コードの受信に加えて、前記第３クライアント・マシンから前記コンパイルされたシェーダ・コードを受信すること、
前記第３クライアント・マシンから受信した前記コンパイルされたシェーダ・コードが、前記第１クライアント・マシンから受信した前記コンパイルされたシェーダ・コードと一致しないと判断すること、
前記第３クライアント・マシンから受信した前記コンパイルされたシェーダ・コードが前記第１クライアント・マシンから受信した前記コンパイルされたシェーダ・コードと一致しないとの判断に少なくとも部分的に基づいて、前記コンパイルされたシェーダ・コードを追加のクライアント・マシンに送信することを控えること、
をさらに具備する、請求項５の方法。
【請求項１５】
クライアント・マシンであって、
中央処理装置（ＣＰＵ）と、
グラフィックス・プロセッシング・ユニット（ＧＰＵ）と、
コンピュータが実行可能な命令を格納するメモリと、を具備し、前記命令は、前記ＣＰＵにより実行されると、前記クライアント・マシンに以下のことをさせる
前記クライアント・マシンに関連付けられたディスプレイ上でグラフィックスを描写する複数のインストールされたプログラムのうちの１つを実行するように構成されたクライアント・アプリケーションをロードし、
前記複数のインストールされたプログラムのうちの１つのプログラムのためにコンパイルされたシェーダ・コードを求めるため、前記クライアント・マシンのハードウェア構成を含んだ要求をリモート・コンピューティング・システムに送信し、
前記ハードウェア構成と前記プログラムのアプリケーション識別子（ＩＤ）に対応する前記コンパイルされたシェーダ・コードを受信し、
前記コンパイルされたシェーダ・コードの少なくとも一部を所定のメモリ・ロケーションに格納し、
前記プログラムを実行し、前記プログラムを実行することは、前記クライアント・マシンのグラフィックス・ドライバが前記コンパイルされたシェーダ・コードを作成する代わりに、前記ＧＰＵが前記所定のメモリ・ロケーションから検索された前記コンパイルされたシェーダ・コードの少なくとも一部を実行することを含む、
クライアント・マシン。
【請求項１６】
前記コンピュータが実行可能な命令は、前記ＣＰＵにより実行されると、前記クライアント・マシンに、前記コンパイルされたシェーダ・コードの少なくとも一部を破棄されたシェーダ・コードとして破棄させること、をさらに含み、前記コンパイルされたシェーダ・コードの前記部分は、前記破棄されたシェーダ・コード以外の前記コンパイルされたシェーダ・コードの残りの部分を表す、請求項１５のクライアント・マシン。
【請求項１７】
前記コンピュータが実行可能な命令は、前記ＣＰＵにより実行されると、前記クライアント・マシンに以下のことをさらにさせる
前記グラフィックス・ドライバにより、前記破棄されたシェーダ・コードに対応するシェーダのセットを、前記ＧＰＵによって実行可能なマシン・コードにコンパイルされたシェーダとしてコンパイルし、
グラフィックス・ドライバにより、前記コンパイルされたシェーダを、前記所定のメモリ・ロケーションに、前記プログラムの前記アプリケーションＩＤと関連付けてキャッシュし、
前記コンパイルされたシェーダのためのシェーダＩＤのセットを生成し、
前記リモート・コンピューティング・システムに情報を送信し、
前記情報は、
クライアント・マシンのハードウェア構成と、
前記プログラムのアプリケーションＩＤと、
前記コンパイルされたシェーダの前記シェーダＩＤのセットと、
を含む、請求項１６のクライアント・マシン。
【請求項１８】
前記シェーダＩＤのセットは、シェーダキーのセットを具備し、前記シェーダキーのセットは、タプルのセットに送信され、個々のタプルは、シェーダキーと前記シェーダキーに対応するシェーダのマシン・コードのハッシュを含む、請求項１７のクライアント・マシン。
【請求項１９】
前記プログラムは、ビデオゲームである、請求項１５のクライアント・マシン。
【請求項２０】
前記ハードウェア構成は、前記グラフィックス・ドライバのバージョンと前記ＧＰＵのモデルを指定する、請求項１５のクライアント・マシン。
【発明の詳細な説明】
【関連出願との相互参照】
【０００１】
本出願は、２０１８年１月２６日に出願された米国特許出願第１５/８８１，５５２号の優先権を主張するＰＣＴ出願であり、“DISTRIBUTING SHADERS BETWEEN CLIENT MACHINES FOR PRECACHING”と題され、これは参照によりその全体が本明細書に組み込まれる。
【技術分野】
【０００２】
シェーダとは、ディスプレイ上に様々な視覚効果を作り出すためにグラフィックカード上で実行されるプログラムである。最近のビデオゲームは、ゲームプレイ中に画面上に異なるマテリアルを描写(render)するためにシェーダを使用している（例えば、艶消しのマテリアル、光沢を有するマテリアルなど）。これらのプログラムがグラフィックスパイプラインで実行されると、シェーダはピクセル単位の値（例えば、色の値など）を出力し、それらが組み合わされてディスプレイ上に所望の視覚効果を持つ画像が生成される。
【０００３】
ゲーム開発者は、シェーダのソースコードを、高レベルシェーディング言語（ＨＬＳＬ）、ＯｐｅｎＧＬシェーディング言語（ＧＬＳＬ）、又は類似のプログラミング言語などの高レベルプログラミング言語で記述し、このソースコードはシェーダのバイトコード表現にコンパイルされる。しかし、シェーダをグラフィックスカード上で実行する前に、シェーダはさらに、クライアント・マシンのグラフィックス・プロセッシング・ユニット（ＧＰＵ）によって実行可能なマシン・コードにコンパイルされる。換言すると、顧客がクライアント・マシンで初めてゲームを実行すると、グラフィックス・ドライバは、シェーダに関連付けられたバイトコードをロードし、そのバイトコードをクライアント・マシンの特定のＧＰＵで実行可能なマシン・コードにコンパイルする。この最終的なシェーダコンパイルプロセスの結果、クライアント・マシンのハードウェア構成に固有の（例えば、ＧＰＵモデル及び／又はグラフィックス・ドライバのバージョンに固有の）コンパイルされたシェーダ・コードが得られる。殆どのゲーム開発者は、異なるハードウェア構成のパーソナルコンピュータ（ＰＣ）プラットフォーム上でビデオゲームを実行したいと考えているため、ゲーム開発者は多くの場合、シェーダをバイトコード形式で顧客に配布し、シェーダのコンパイルプロセスをクライアント・マシン上で実行時に行うようにしておき、特定のグラフィックス・ドライバがシェーダを問題のハードウェア構成に合った正しいマシン・コードにコンパイルできるようにしている。対照的に、コンソール・ビデオゲームは、シェーダ用のマシン・コードがバイトコードから既にコンパイルされており、コンソールのＧＰＵで実行できる状態で出荷される。これは、コンソールのハードウェア構成がゲーム開発者に知られているためである。
【０００４】
ＰＣプラットフォームでは、ビデオゲームがクライアント・マシン上でロードされているときにシェーダがコンパイルされると、ゲームの初期ロード画面が望ましくないほど長い時間（例えば、数分）に亘って提示されることがある。これは、ゲームがロードされているときに、グラフィックス・ドライバが、ゲームプレイ中にＧＰＵによって実行可能なマシン・コードを作成するため、ゲームのデータセットの全てのシェーダをコンパイルするからである。あるいは、ゲーム開発者がゲームプレイ中にシェーダをコンパイルするようにゲームを設計した場合、初めて新しいマテリアルに遭遇すると、グラフィックス・ドライバはそのマテリアルのシェーダをマシン・コードにコンパイルするが、これには時間がかかり、ゲーム内のスタッタリング（stuttering）やヒッチング(hitching)（グラフィックス・ドライバがシェーダをマシン・コードにコンパイルするためにとても多くの時間を費やし、十分な速度でフレームを描写することができない状態）を引き起こす可能性がある。このように、クライアント・マシン上でシェーダをローカルにコンパイルすると、ロード時間が長くなり、ゲーム内のスタッタリングが発生する可能性がある。ここでは、これらのシステムやその他のシステムを改善し、強化するための技術的なソリューションを提供する。
【図面の簡単な説明】
【０００５】
添付の図を参照して詳細な説明が記載される。図において、参照番号の左端の桁は、参照番号が最初に現れる図を識別する。異なる図で同じ参照番号を使用することは、類似又は同一の構成要素又は特徴を示す。
【０００６】
【図１】クライアント・マシン間でシェーダを配布してプリキャッシングするシステムを含む環境の一例を示す図である。
【０００７】
【図２】クライアント・マシンの例示的な構成要素を示すブロック図であり、コンパイルされたシェーダをリモート・コンピューティング・システムにアップロード及び／又はダウンロードするための例示的なプロセスのフロー図である。
【０００８】
【図３】リモート・コンピューティング・システムの例示的な構成要素を示すブロック図であり、クライアント・マシンから情報を受信し、受信した情報に含まれるシェーダ識別子（ＩＤ）をカタログ化し、コンパイルされたシェーダ・コードを選択的に要求し、再配布のためにコンパイルされたシェーダ・コードを選択的に準備するための例示的なプロセスのフロー図である。
【０００９】
【図４】クライアント・マシンのハードウェア構成に基づいて、要求するクライアント・マシンにコンパイルされたシェーダ・コードを送信するための例示的なプロセスのフロー図である。
【００１０】
【図５】コンパイルされたシェーダ・コードを選択的に要求するための例示的なプロセスのフロー図である。
【００１１】
【図６】再配布用にコンパイルされたシェーダ・コードを選択的に準備するための例示的なプロセスのフロー図である。
【００１２】
【図７】ダウンロードしたシェーダ・コードの一部を破棄し、破棄したシェーダ・コードに対応するシェーダを再コンパイルし、再コンパイルしたシェーダの情報をアップロードすることによって完全性チェックを実施するための例示的なプロセスのフロー図である。
【００１３】
【図８】図７のプロセスの完全性チェックを使用して、既に配布されているシェーダ・コードの更なる配布を停止するための例示的なプロセスのフロー図である。
【発明を実施するための形態】
【００１４】
ここに記載されているのは、特に、クライアント・マシン上でコンパイルされたシェーダをプリキャッシングする目的で、クライアント・マシン間でシェーダを配布するための技術、装置、及びシステムである。プログラムは、クライアント・マシンにインストールされ、クライアント・アプリケーションによって実行されてもよい。そのようなプログラムは、プログラムの実行の一部として、クライアント・マシンに関連付けられたディスプレイ上にグラフィックスを与えてもよい。このようなプログラムの例は、ビデオゲームである。
【００１５】
新しいビデオゲームが開発されると、ユーザはそれぞれのクライアント・マシンでゲームのプレイ／実行を開始することができ、それらのクライアント・マシンはハードウェア構成により異なることがある。「ハードウェア構成」は、ここで使用されるクライアント・マシンのＧＰＵモデル、及び／又はグラフィック・ドライバのバージョンにより定義される。最初に、新しいビデオゲームがクライアント・マシン上で実行されたことがなく、複数のクライアント・マシンがゲームの実行を開始すると、ゲームのためのシェーダ（バイトコード）は、各クライアント・マシン上のグラフィックス・ドライバによって、各クライアント・マシン上の特定のＧＰＵによって実行可能なマシン・コードにコンパイルされる。ここに記載の技術、装置、及びシステムは、プログラムがクライアント・マシン上で実行される際に、コンパイルされたシェーダに関する情報をリモート・コンピューティング・システムに報告することに関連し、リモート・システムは、それらのマシンのハードウェア構成に基づいて、コンパイルされたシェーダ・コードを他のクライアント・マシンに選択的に再配布することができる。これは、特定のプログラム（例えば、ビデオゲーム）のシェーダを未だコンパイルしていないクライアント・マシンが、リモート・コンピューティング・システムからコンパイルされたシェーダ・コードを、要求してダウンロードすることを可能にし、そのシェーダ・コードに対応するシェーダをローカルにコンパイルする必要があるクライアント・マシンに代わり、それが実行されるように、このコンパイルされたシェーダ・コードが、クライアント・マシンにプリキャッシュされる。
【００１６】
いくつかの実施形態において、クライアント・マシンは、プログラム（例えば、ビデオゲーム）に関連するコンパイルされたシェーダ・コードを求める要求をリモート・コンピューティング・システムに送信するように構成されている。このような要求は、クライアント・マシンがプログラムのためのシェーダをまだコンパイルしていないことに基づいて送信されてもよい（例えば、クライアント・マシンがプログラムをインストールしたが、まだプログラムを実行していない場合）。クライアント・マシンが、コンパイルされたシェーダ・コードが利用できない旨を示す応答をリモート・コンピューティング・システムから受信した場合、クライアント・マシンのグラフィックス・ドライバは、プログラムの実行時に、シェーダをコンパイルして、所定のメモリ・ロケーションに、プログラムのアプリケーション識別子（ＩＤ）と関連付けてキャッシュしてもよい。クライアント・アプリケーションは、コンパイルされたシェーダのためのシェーダＩＤのセットを生成してもよく、リモート・コンピューティング・システムに情報を送信してもよく、その情報は、クライアント・マシンのハードウェア構成、プログラムのアプリケーションＩＤ、及びコンパイルされたシェーダのためのシェーダＩＤのセットを含む。これにより、リモート・システムは、クライアント・マシンから、それらのマシン上でコンパイルされているシェーダに関する情報を収集することができる。
【００１７】
一方、クライアント・マシンが、要求したシェーダ・コードが利用可能であることを示す応答をリモート・システムから受信した場合、クライアント・マシンは、リモート・コンピューティング・システムから要求したコンパイルされたシェーダ・コードを受信してもよい。コンパイルされたシェーダ・コードを受信すると、クライアント・マシンは、コンパイルされたシェーダ・コードの少なくとも一部をプリキャッシュするか、又はその後の使用のために、コンパイルされたシェーダ・コードの少なくとも一部を所定のメモリ・ロケーションに格納してもよい。プログラム（例えば、ビデオゲーム）の実行時に、クライアント・マシンのＧＰＵは、グラフィックス・ドライバがコンパイルされたマシン・コードを独自に作成しなければならない代わりに、所定のメモリ・ロケーションから取得されたコンパイルされたシェーダ・コードの少なくとも一部を実行してもよい。
【００１８】
いくつかの実施形態において、リモート・コンピューティング・システムは、クライアント・マシンがプログラム（例えば、ビデオゲーム）を実行する際に、クライアント・マシンから情報を受信するように構成されている。所与のクライアント・マシンについてリモート・コンピューティング・システムで受信した情報は、クライアント・マシンのハードウェア構成、クライアント・マシンで実行されたプログラムのアプリケーションＩＤ、及びプログラムの実行中にクライアント・マシンのグラフィックス・ドライバによってコンパイルされたシェーダのシェーダＩＤのセットを含んでもよい。リモート・コンピューティング・システムは、ハードウェア構成及びアプリケーションＩＤに従ってシェーダＩＤをカタログ化してもよく、受信したシェーダＩＤに対応するシェーダのうちの１つ又は複数のシェーダのためにコンパイルされたシェーダ・コードを選択的に要求してもよい。コンパイルされたシェーダ・コードは、対応するアプリケーションＩＤとハードウェア構成とをコンパイルされたシェーダ・コードに関連付けることにより、再配布のために準備されてもよい。このようにして、クライアント・マシンのハードウェア構成と特定のプログラムのアプリケーションＩＤとを含むクライアント・マシンからの要求を受信すると、リモート・コンピューティング・システムは、そのアプリケーションＩＤと一致するハードウェア構成に関連付けられたコンパイルされたシェーダ・コードが利用可能であるかどうかを判断することができる。利用可能であれば、コンパイルされたシェーダ・コードをクライアント・マシンのＧＰＵによる後続の実行のため（すなわち、プリキャッシングのために）、要求するクライアント・マシンに送信することができる。
【００１９】
ここに記載された技術及びシステムは、１つ以上の装置が少なくとも処理リソースに関するリソースを節約することが可能である。例えば、コンパイルされたシェーダ・コードのプリキャッシングは、プログラムがクライアント・マシン上にロードされたとき（例えば、初めてロードされたプログラム）に、クライアント・マシンがシェーダ・コードをコンパイルすることを不要にすることによって、ロード時間を短縮することができる。ここに記載された技術及びシステムは、ビデオゲームの実行中のゲーム内スタッタリング又はヒッチングを減少させることによって、コンピュータ自体の機能をさらに向上させることができる。これは、既にコンパイルされているプリキャッシュされたシェーダ・コードをプログラムの実行中にグラフィックス（例えば、マテリアル）を描写するために使用することができるからであり、リアルタイムでそれらのマテリアルのためのシェーダ・コードをコンパイルするのとは対照的である。さらに、ユーザの大規模なコミュニティ間でコンパイルされたシェーダ・コードを収集し、再配布する中央ハブとしてのリモート・システムを使用することにより、単一のクライアント・マシンは、そのクライアント・マシンがそうでなければ独自にキャッシュしていたであろうよりも多くのコンパイルされたマシン・コードを提供される可能性がある。このように、ユーザのコミュニティからコンパイルされたシェーダ・コードを収集することで、ディスプレイ上でグラフィックスを描写するプログラムの実行効率を最適化することが可能になる。
【００２０】
ここに記載された例の多くは、コンパイルされたマシン・コードでクライアント・マシンに配布され、プリキャッシュされる「シェーダ・コード」に言及しているが、シェーダ・コードとは異なる他のタイプのデータ及び／又はコードが、ここに記載された技術及びシステムで使用されてもよいことが認識される。実際には、任意のタイプのプログラムを実行することによる任意の副産物は、（プログラムがグラフィックスを描写するか否かにかかわらず）ユーザコミュニティの間で配布されてもよく、特に、これら副産物（データ及び／又はコード）は、リソースを節約し、及び／又はクライアント・マシン上でのプログラムの実行を最適化する。実際には、計算の最後で小さなペイロードをもたらす計算（複数可）を実行する任意のタイプのプログラムは、本開示の恩恵を受けることができる。このように、「ビデオゲーム」は、ここに記載された様々な実施形態を例示するためのプログラムとして使用されているが、技術、装置、及びシステムは、ビデオゲーム以外の任意のタイプのプログラムで利用することができることが理解されるであろう。このように、本開示は、ビデオゲームで使用するためのシェーダのプリキャッシングに限定されるものではなく、他のプログラムもまた、プログラム実行の任意の副産物（例えば、コンパイルされたシェーダ・コード、コンパイルされたJavaScript（登録商標）コードなど）のプリキャッシングから利益を得ることができる。
【００２１】
図１は、クライアント・マシン間でシェーダを配布し、プリキャッシングするためのシステムを含む例示的な環境１００を示す図である。コミュニティのユーザ１０２（「顧客」と呼ばれることもある）は、１つ以上のクライアント・マシン１０４に関連付けられていてもよい。したがって、図１に示されるクライアント・マシン１０４（１）〜（Ｎ）は、ユーザコミュニティ（又は顧客ベース）によって利用され、その上でプログラムを実行することができるコンピューティング・デバイスを表している。クライアント・マシン１０４は、関連するディスプレイ上でグラフィックスを処理し、描写するように構成された任意の適切なタイプのコンピューティング・デバイスとして実装することができ、ＰＣ、デスクトップコンピュータ、ラップトップコンピュータ、携帯電話（例えば、スマートフォン）、タブレットコンピュータ、ポータブル・デジタル・アシスタント（ＰＤＡ）、ウェアラブルコンピュータ（例えば、仮想現実（ＶＲ）ヘッドセット、拡張現実（ＡＲ）ヘッドセット、スマートグラスなど）、車載（例えば、車内）コンピュータ、テレビ（スマートテレビ）、セットトップボックス（ＳＴＢ）、ゲームコンソール、及び／又は任意の類似のコンピューティング・デバイスを含むが、これらに限定されない。
【００２２】
クライアント・マシン１０４のプラットフォーム（例えば、ハードウェア及びソフトウェア）は、クライアント・マシン１０４のサブセットが共通のハードウェア構成を共有し、クライアント・マシン１０４のこれらのサブセットの間でハードウェア構成が異なっていてもよい。例えば、クライアント・マシン１０４のサブセットは、それぞれ特定のＧＰＵモデル及び特定のバージョンのグラフィックス・ドライバを使用してもよく、一方、クライアント・マシン１０４の別のサブセットは、それぞれ異なるＧＰＵモデル及び／又は異なるバージョンのグラフィックス・ドライバを使用してもよい。グラフィックス・ドライバがソフトウェア（例えば、バイナリ）で実施されているとしても、ここで使用されるように、一対のクライアント・マシン１０４が同じ（又は共通の）「ハードウェア構成」を有すると言われる場合、これは、一対のクライアント・マシン１０４が同じＧＰＵモデル及びグラフィックス・ドライバのバージョンを使用していることを意味する。換言すると、ここで使用されるような「ハードウェア構成」は、ハードウェアに加えてソフトウェアの要素を包含してもよい。
【００２３】
クライアント・マシン１０４は、コンピュータネットワーク１０８を介してリモート・コンピューティング・システム１０６（「リモート・システム１０６」と略称されることもある）と通信してもよい。コンピュータネットワーク１０８は、インターネット、他のタイプのデータ及び／又は音声ネットワーク、有線インフラストラクチャ（例えば、同軸ケーブル、光ファイバケーブルなど）、無線インフラストラクチャ（例えば、無線周波数（ＲＦ）、セルラー、衛星など）、及び／又は他の接続技術を表し、及び／又は含むことができるが、これらに限定されない。リモート・システム１０６は、いくつかの実施形態において、コンピュータネットワーク１０８を介して維持され、アクセス可能なネットワーク・アクセス可能コンピューティング・プラットフォームの一部であってもよい。このようなネットワーク・アクセス可能なコンピューティング・プラットフォームは、「オンデマンド・コンピューティング」、「サービスとしてのソフトウェア（ＳａａａＳ）」、「プラットフォーム・コンピューティング」、「ネットワーク・アクセス可能なプラットフォーム」、「クラウド・サービス」、「データセンタ」などの用語を使用して言及されてもよい。一般に、リモート・システム１０６は、クライアント・マシン１０４から情報とコンパイルされたシェーダ・コードの両方を収集するように構成され、受け取った情報とコンパイルされたシェーダ・コードをカタログ化（例えば、整理、分類(categorize)、類別(classify)など）し、コンパイルされたシェーダ・コードを要求するクライアント・マシン１０４に配布して、それらの要求するクライアント・マシン１０４上でコンパイルされたシェーダ・コードをプリキャッシングするように構成される。
【００２４】
いくつかの実施形態において、リモート・システム１０６は、クライアント・マシン１０４にプログラム（及びコンテンツ）を配布（例えば、ダウンロード）するためのプラットフォームとして機能するか、又はアクセス権を有する。一例において、クライアント・マシン１０４は、クライアント・アプリケーションをそこにインストールしてもよい。クライアント・アプリケーションは、クライアント・マシン１０４に関連付けられたディスプレイ上でグラフィックスを描写するプログラム（例えば、リモート・システム１０６からダウンロードされたプログラム）を実行するように構成されてもよい。ビデオゲーム・プログラムの文脈において、インストールされたクライアント・アプリケーションは、ビデオゲーム・クライアント（例えば、ビデオゲームをプレイするためのゲーミングソフトウェア）であってもよい。クライアント・アプリケーションがインストールされた状態で、クライアント・マシン１０４は、その後、コンピュータネットワーク１０８を介してリモート・システム１０６からプログラム（例えば、ビデオゲーム）をダウンロードする能力を有してもよい。任意のタイプのコンテンツ配布モデルがこの目的のために利用することができ、プログラム（例えば、ビデオゲーム）は、クライアント・マシン１０４上でダウンロード及び実行するために個別に購入可能な直接購入モデル、サブスクリプションベースのモデル、プログラムが一定期間レンタル又はリースされるコンテンツ配布モデルなどのようなものである。したがって、個々のクライアント・マシン１０４は、クライアント・アプリケーションをロードすることによって実行可能な１つ以上のインストールされたプログラムを含んでもよく、これらのプログラムは、実行中にディスプレイ上にグラフィックスを与えてもよい。一例において、ユーザは、クライアント・アプリケーションをロードし、所望のビデオゲームを選択してビデオゲームの実行を開始することにより、リモート・システム１０６から購入してダウンロードした複数のビデオゲームのうちの１つをプレイすることを選択してもよい。
【００２５】
ユーザ１０２の一部が、リモート・システム１０６によって利用可能にされた新しいビデオゲームをプレイする非常に最初のユーザ１０２である図１の例を考える。このユーザ１０２のグループは、発売日に未プレイのゲームを購入する一般ユーザ１０２の最初のユーザ１０２であってもよい。あるいは、このユーザグループ１０２は、「テストユーザ」のグループ、又はゲームのプレリリースコピーへの独占的なアクセスを得ることができるゲームの出版社又は開発者に関連するユーザであってもよい。
【００２６】
図１に示すように、ステップ１において、この第１ユーザグループ１０２がそれぞれのクライアント・マシン１０４上で新しいビデオゲーム（すなわち、ディスプレイ上でグラフィックスを描写するプログラム）の実行を開始すると、クライアント・マシン１０４は（それぞれのグラフィックス・ドライバを使用して）シェーダのセットをコンパイルし、コンパイルされたシェーダ・コードは、プログラムのためのグラフィックスを描写するためにクライアント・マシン１０４のそれぞれのＧＰＵによって使用される。その後、コンパイルされたシェーダ・コードは、プログラム（例えば、ビデオゲーム）を実行するクライアント・アプリケーションにアクセス可能な所定のメモリ・ロケーションにキャッシュされ得る。また、プログラム（例えば、ビデオゲーム）のアプリケーションＩＤは、コンパイルされたシェーダ・コードに関連して、予め定義されたメモリ・ロケーションにキャッシュされてもよい。
【００２７】
ステップ２において、クライアント・マシン１０４は、プログラム（例えば、ビデオゲーム）の実行を停止した後などのある時点で、情報１１０をリモート・システム１０６に送信してもよい。所定のクライアント・マシン１０４について、リモート・システム１０６に送信される情報１１０は、クライアント・マシン１０４のハードウェア構成、クライアント・マシン１０４上で実行されたプログラム（例えば、ビデオゲーム）のアプリケーションＩＤ、及びプログラムの実行中にコンパイルされたシェーダに対応するシェーダＩＤのセットを含んでもよい。クライアント・マシン１０４は、コンパイルされたシェーダ・コードを予め定義されたメモリ・ロケーションから読み出すと、シェーダＩＤのセットを生成してもよい。図１は、クライアント・マシン１０４がプログラム（例えば、ビデオゲーム）の実行を停止した後に、情報１１０がリモート・システム１０６に送信されるシナリオを描いているが、情報１１０は、それらのマシン１０４のグラフィックス・ドライバがシェーダ・コードをコンパイルし、所定のメモリ・ロケーションにシェーダ・コードをキャッシュする際に、クライアント・マシン１０４からリアルタイムで、又は実質的にリアルタイムで、情報１１０をストリーミング又はその他の方法で送信することができることを理解されたい。
【００２８】
情報１１０はリモート・システム１０６によって受信され、ステップ３において、リモート・システム１０６は、情報１１０から抽出されたハードウェア構成及びアプリケーションＩＤに従って、シェーダＩＤのセットをカタログ化してもよい。図１は、カタログ１１２を示し、これはリモート・システム１０６がクライアント・マシン１０４から受信したシェーダＩＤをカタログ化するために、リモート・システム１０６によって維持されるデータリポジトリ（又はデータストア）を表している。したがって、カタログ１１２は、シェーダＩＤを、ハードウェア構成及びアプリケーションＩＤのユニークな組み合わせにそれぞれ関連付けられたグループ（又はバケット）に整理してもよい。換言すると、シェーダＩＤの各バケットは、特定のプログラム（例えば、ビデオゲーム）及び特定のハードウェア構成（例えば、ＧＰＵモデル及びグラフィックス・ドライバのバージョン）に関連付けられていてもよい。
【００２９】
ステップ４において、リモート・システム１０６は、情報１１０をリモート・システム１０６に報告したクライアント・マシン１０４にコンパイルされたシェーダ・コード１１６を選択的に要求し、クライアント・マシン１０４から受信してもよい。任意の適切なアルゴリズムが、以下でより詳細に説明するように、コンパイルされたシェーダ・コード１１６を選択的に要求１１４するために利用され得る。例示において、リモート・システム１０６は、シェーダＩＤの第１セットを有する第１クライアント・マシン１０４（１）から第１情報１１０を受信してもよい。例示的な実施形態において、リモート・システム１０６が、第１クライアント・マシン１０４（１）と同じハードウェア構成を有する第２クライアント・マシン１０４（２）から、第１クライアント・マシン１０４（１）から以前に受信したシェーダＩＤと一致する少なくとも１つのシェーダＩＤを含む第２情報１１０を受信すると直ぐに、リモート・システム１０６は、一致するシェーダＩＤに対応するコンパイルされたシェーダ・コード１１６の要求１１４を第２クライアント・マシン１０４（２）に送信してもよい。換言すると、リモート・システム１０６は、いくつかの実施形態において、同じハードウェア構成を有する所定の数（例えば、２つの）異なるクライアント・マシン１０４から同じシェーダＩＤを受信すると直ぐに、コンパイルされたシェーダ・コードを要求してもよい。
【００３０】
コンパイルされたシェーダ・コード１１６を受信した後、リモート・システム１０６は、ステップ５で、コンパイルされたシェーダ・コード１１６を、その対応するシェーダＩＤと関連づけて（及び対応するハードウェア構成及びアプリケーションＩＤと関連づけて）格納してもよい。さらに、ステップ５において、リモート・システム１０６は、同じハードウェア構成を有する他のクライアント・マシン１０４に再配布するために、コンパイルされたシェーダ・コード１１６をいつ準備するかを決定するアルゴリズムを使用してもよい。詳細なアルゴリズム（例えば、シェーダＩＤの人気度(popularity)に基づくアルゴリズム、ユーザアカウントが信頼されているかどうかの判断など）は、この目的のために以下でより詳細に説明される。リモート・システム１０６がコンパイルされたシェーダ・コード１１６を再配布することを決定すると（例えば、コンパイルされたシェーダ・コード１１６を要求するクライアント・マシン１０４に利用可能にする）、リモート・システム１０６は、再配布のためにコンパイルされたシェーダ・コード１１６を準備してもよい（例えば、コンパイルされたシェーダ・コード１１６を含む再配布可能なデータ構造を構築すること、コンパイルされたシェーダ・コード１１６を圧縮することなどによって）。したがって、ステップ５の後、リモート・システム１０６は、特定のハードウェア構成を有するクライアント・マシン１０４に対して、特定のアプリケーションＩＤに対応するコンパイル済みシェーダ・コード１１６を利用可能にすることを決定してもよい。
【００３１】
ステップ６において、クライアント・マシン１０４（Ｎ）は、特定のプログラム（例えば、ビデオゲーム）のためにコンパイルされたシェーダ・コードを受信するために、要求１１８をリモート・システム１０６に送信してもよい。要求１１８が送信された時点で、クライアント・マシン１０４（Ｎ）は、プログラムをインストールするプロセス中であってもよいし、クライアント・マシン１０４（Ｎ）は、既にプログラムをインストールしており、クライアント・アプリケーションをロードするプロセス中であってもよい。要求１１８は、要求するクライアント・マシン１０４（Ｎ）のハードウェア構成とプログラムのアプリケーションＩＤを含んでもよく、これは、特定のハードウェア構成と特定のプログラム（例えば、ビデオゲーム）のために利用可能であるかもしれないコンパイルされたシェーダ・コード１１６を探すようにリモート・システム１０６に指示する。実行例において、リモート・システム１０６は、クライアント・マシン１０４（Ｎ）からの要求１１８で指定されたアプリケーションＩＤ及びハードウェア構成のためにコンパイルされたシェーダ・コード１１６を予め用意していてもよく、したがって、要求するクライアント・マシン１０４（Ｎ）は、そのハードウェア構成に関連し、かつ問題のアプリケーションＩＤに関連するコンパイルされたシェーダ・コード１１６を受信する。
【００３２】
ステップ７において、クライアント・マシン１０４（Ｎ）は、プログラム（例えば、ビデオゲーム）の実行中に使用するため、コンパイルされたシェーダ・コード１１６を所定のメモリ・ロケーションにプリキャッシュする。このようにすることにより、クライアント・マシン１０４（Ｎ）が、問題となっている特定のプログラム（例えば、ビデオゲーム）のためのコンパイルされたシェーダを以前に有していなかったとしても、クライアント・マシン１０４（Ｎ）は、他のクライアント・マシン１０４上でのプログラムの実行中に、同じハードウェア構成を有する他のクライアント・マシン１０４によって以前にコンパイルされた、リモート・システム１０６から受信したコンパイルされたシェーダ・コード１１６を活用することができるようになる。これにより、クライアント・マシン１０４（Ｎ）上の計算集約的な処理ステップ（すなわち、シェーダをコンパイルするステップ（複数可））が除去され、これにより、クライアント・マシン１０４（Ｎ）上でのプログラム実行中の処理リソースが節約される（例えば、ロード時間の高速化、ゲーム内スタッタリング又はヒッチングの緩和／解消など）。リモート・システム１０６によって使用されるアルゴリズム及び／又は特定のビデオゲームの人気に応じて、新しいビデオゲームのためのコンパイルされたシェーダ・コードは、ゲームのリリースから数時間以内、場合によっては数分以内に、要求するクライアント・マシン１０４に利用可能にされてもよい。これは、多くのユーザがビデオゲームのリリース直後にそのビデオゲームをプレイし始めると、シェーダ・コードの配布がすぐに急増する可能性があるからである。さらに、テストユーザのグループは、ビデオゲームのリリース日の前であっても、コンパイルされたシェーダ・コード１１６の生成を開始してもよく、これにより、少なくともいくつかのコンパイルされたシェーダ・コード１１６は、一般ユーザがゲームのプレイを開始したときに、最初のユーザに利用可能になる可能性がある。
【００３３】
図２は、クライアント・マシン１０４の例示的な構成要素を示すブロック図と、図１のリモート・コンピューティング・システム１０６との間でコンパイルされたシェーダをアップロード及び／又はダウンロードするための例示的なプロセス２００のフロー図を示す。図示された実施形態において、クライアント・マシン１０４は、他の構成要素の中で、中央処理装置（ＣＰＵ）２０２及びグラフィックス・プロセッシング・ユニット（ＧＰＵ）２０４などのプロセッサ、ディスプレイ２０６、メモリ２０８（又は非一時的なコンピュータ読み取り可能媒体２０８）、及び通信インターフェース２１０を含む。図２の例示的なクライアント・マシン１０４は、クライアント・マシン１０４が埋め込まれたディスプレイ２０６を含むことを示唆しているが、クライアント・マシン１０４は、実際にはディスプレイを省略してもよく、その代わりに周辺ディスプレイ２０６に結合されてもよい。したがって、ディスプレイ２０６は、クライアント・マシン１０４に埋め込まれているか、又は（有線プロトコル又は無線プロトコルを介して）そこに接続されているかにかかわらず、関連するディスプレイ２０６を表すことを意味する。
【００３４】
メモリ２０８（又は非一時的なコンピュータ読み取り可能媒体２０８）は、揮発性及び不揮発性メモリ、コンピュータ読み取り可能命令、データ構造、プログラムモジュール、又は他のデータなどの情報を記憶するための任意の方法又は技術で実装されたリムーバブル及び非リムーバブル媒体を含むことができる。このようなメモリは、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、フラッシュメモリ又は他のメモリ技術、ＣＤ-ＲＯＭ、デジタル多目的ディスク（ＤＶＤ）又は他の光学ストレージ、磁気カセット、磁気テープ、磁気ディスクストレージ又は他の磁気ストレージ装置、ＲＡＩＤストレージシステム、又は所望の情報を格納するために使用することができ、コンピューティング装置によってアクセスすることができる任意の他の媒体を含むが、これらに限定されるものではない。コンピュータ読み取り可能媒体２０８は、コンピュータ読み取り可能記憶媒体（「ＣＲＳＭ」）として実装されてもよく、これは、メモリ２０８に格納された命令を実行するためにプロセッサ（複数可）２０２／２０４によってアクセス可能な任意の利用可能な物理媒体であってもよい。一基本的な実装において、ＣＲＳＭは、ランダム・アクセス・メモリ（「ＲＡＭ」）及びフラッシュメモリを含んでもよい。他の実装において、ＣＲＳＭは、リード・オンリー・メモリ（「ＲＯＭ」）、電気的に消去可能なプログラマブル・リード・オンリー・メモリ（「ＥＥＰＲＯＭ」）、又は所望の情報を格納するために使用することができ、プロセッサ（複数可）２０２／２０４によってアクセス可能な任意の他の有形媒体を含んでもよいが、これらに限定されない。
【００３５】
ここで、図２に示されたプロセス２００を参照する。ここに記載されたプロセスは、論理フローグラフ内のブロックの集合として図示されており、これは、ハードウェア、ソフトウェア、又はそれらの組み合わせで実装され得る一連の操作を表している。ソフトウェアの文脈において、ブロックは、１つ又は複数のプロセッサによって実行されたときに、記載された操作を実行するコンピュータ実行可能命令を表している。一般に、コンピュータ実行可能命令には、特定の機能を実行したり、特定の抽象的なデータ型を実装したりするルーチン、プログラム、オブジェクト、コンポーネント、データ構造などが含まれる。操作が記載されている順序は、制限として解釈されることを意図しておらず、記載されているブロックの任意の数は、任意の順序及び／又は並列に組み合わせて処理を実施することができる。
【００３６】
図２は、図１のリモート・コンピューティング・システム１０６にコンパイルされたシェーダをアップロード及び／又はダウンロードするための例示的なプロセス２００のフロー図である。議論の目的のために、プロセス２００を実行するクライアント・マシン１０４は、事前にクライアント・アプリケーション（例えば、ビデオゲーム・クライアント２１２）をインストールしていることが想定され、クライアント・アプリケーションは関連するディスプレイ２０６上でグラフィックスを描写するプログラムを実行するように構成される。そのようなプログラムは、インストールされ（例えば、リモート・システム１０６からダウンロードされ）、メモリ２０８に保持され得る。図２の例において、プログラムはビデオゲームであり、ビデオゲームがクライアント・マシン１０４に最初にインストールされるとき、ビデオゲームは、コンパイルされていないシェーダ２１４（又はゲームプレイ中にシェーダをコンパイルする前のバイトコード表現のシェーダ）を有するビデオゲームとしてメモリ２０８内に保持される。
【００３７】
２２２において、クライアント・マシン１０４のユーザ１０２は、ビデオゲーム・クライアント２１２（すなわち、ディスプレイ２０６上でグラフィックスを描写する複数のインストールされたプログラムのうちの１つを実行するように構成されたクライアント・アプリケーション）をロードしてもよい。ロードされたビデオゲーム・クライアント２１２は、コンパイルされていないシェーダ２１４を有する以前にダウンロードされたビデオゲームを実行する能力、及び／又はコンパイルされていないシェーダ２１４を有するビデオゲームとしての新しいビデオゲームをダウンロードする能力をユーザ１０２に提供する。
【００３８】
ブロック２２４において、クライアント・マシン１０４は、ビデオゲーム（ここでは、ビデオゲームは、プログラム実行中にディスプレイ２０６上にグラフィックスを描写するプログラムを表す）のためのコンパイルされたシェーダ・コードを求める要求１１８をリモート・コンピューティング・システム１０６に送信してもよい。ブロック２２４で送信される要求１１８は、ブロック２２２でユーザ１０２がビデオゲーム・クライアント２１２をロードすること、及び／又はユーザ１０２が新しいビデオゲームをダウンロードすることなど、様々な方法でトリガされてもよい。後者の場合、要求１１８は、新しいビデオゲームのダウンロードの前、途中、又は後に送信されてもよい。ブロック２２４で送信される要求１１８は、クライアント・マシン１０４のハードウェア構成、例えば、ＧＰＵ２０４のモデル、及び／又はグラフィックス・ドライバ２１６のバージョンを含んでもよい（又は指定してもよい）。ブロック２２４で送信される要求１１８は、コンパイルされていないシェーダ２１４を有する１つ以上のビデオゲームに対応する１つ以上のアプリケーションＩＤをさらに含んでもよい（又は指定してもよい）。例えば、ビデオゲーム・クライアント２１２は、ブロック２２４において、コンパイルされていないシェーダ２１４が存在するインストールされたビデオゲームの全てを列挙し、それらのゲームの対応するアプリケーションＩＤをクライアント・マシン１０４のハードウェア構成と共にリモート・システム１０６に送信してもよい。
【００３９】
ブロック２２６において、クライアント・マシン１０４は、リモート・システム１０６からの応答に基づいて、コンパイルされたシェーダ・コードがプログラム（複数可）に対して利用可能であるかどうかを決定してもよい。例えば、リモート・システム１０６は、ブロック２２４で送信された要求１１８に対して、要求されたシェーダ・コードがダウンロード可能ではないという表示を提供することによって応答してもよい。これは、以下でより詳細に説明するように、様々な理由であってもよい。少なくともいくつかの実例において、リモート・システム１０６は、クライアント・マシン１０４によって要求されたコンパイルされたシェーダ・コードを所有していてもよいが、再配布のために利用可能にしないことを決定していてもよい。クライアント・マシン１０４が、要求されたシェーダ・コードが利用可能ではないという指示を受信した場合、プロセス２００は、ブロック２２６からブロック２２８への「ＮＯ」ルートをたどるが、ここで、ユーザの入力に応答して、クライアント・マシン１０４は、コンパイルされていないシェーダ２１４でビデオゲームを開始してもよい（すなわち、クライアント・マシン１０４上でビデオゲーム・プログラムを実行してもよい）。
【００４０】
ブロック２３０において、クライアント・マシン１０４のグラフィックス・ドライバ２１６は、シェーダのセット（コンパイルされたシェーダとして）を、ＧＰＵ２０４によって実行可能なマシン・コードにコンパイルしてもよい。ブロック２３０におけるコンパイルは、シェーダのバイトコード表現を、ＧＰＵ２０４によって実行可能であり、且つＧＰＵ２０４の特定のモデルに固有のシェーダの低レベルのマシン・コード表現にコンパイルすることを含んでもよい。ブロック２３０におけるコンパイルは、ゲームがロードされるとき、及び／又はゲームプレイ中に実行されてもよい。
【００４１】
２３２において、グラフィックス・ドライバ２１６は、コンパイルされたシェーダ（コンパイルされたシェーダ・コード１１６）を、所定のメモリ・ロケーション２１８に、ビデオゲームのアプリケーションＩＤと関連付けてキャッシュしてもよい。これは、「アプリケーションＩＤ２２０を有するコンパイルされたシェーダ・コード」として図２に示されている。いくつかの実施形態において、ビデオゲーム・クライアント２１２は、（アプリケーション・プログラミング・インターフェース（ＡＰＩ）を使用して）グラフィックス・ドライバ２１６に、コンパイルされたシェーダ・コード１１６を事前に定義されたメモリ・ロケーション２１８に格納するように指示してもよいが、これは、一般的なシステムロケーションがディスク上のキャッシュに格納するために一般的に使用するのとは異なるロケーションであってもよい。コンパイルされたシェーダ・コード１１６を定義済みメモリ・ロケーション２１８に格納するためのこの命令は、ブロック２３２でのキャッシュと同時に発生してもよいし、ブロック２３２でのキャッシュに先立つある時点で発生してもよい。グラフィックス・ドライバ２１６がコンパイルされたシェーダ・コード２１６を格納するための所定のメモリ・ロケーション２１８は、問題となっている特定のビデオゲームに関連付けられたディレクトリであってもよい。このようにして、コンパイルされたシェーダ・コード２１６は、異なるビデオゲームに対応するディレクトリ（アプリケーションＩＤでタグ付けされたディレクトリ）に格納されてもよい。
【００４２】
ブロック２３４において、ビデオゲームは、停止又は終了されてもよい（例えば、ユーザ１０２がゲームを終了することに応答して）。このように、ブロック２３４において、クライアント・マシン１０４は、ビデオゲームの実行を停止してもよい。この時点で、ビデオゲームの実行中にコンパイルされた任意のシェーダについては、ビデオゲームのアプリケーションＩＤと関連して、所定のメモリ・ロケーション２１８にキャッシュされた対応するコンパイルされたシェーダ・コード１１６が存在するであろう。
【００４３】
２３６において、ビデオゲーム・クライアント２１２は、ビデオゲームの実行を停止することに応答して、ビデオゲームの実行中にコンパイルされたシェーダのためのシェーダＩＤを生成する（又はそうでなければ取得する）ために、キャッシュされたシェーダ・コード１１６を開いて読み出し／解析してもよい（例えば、所定のメモリ・ロケーション２１８内のフォルダを開いてその内容を読み出し／解析することによって）。いくつかの実施形態において、シェーダＩＤは、シェーダキーの形式であり、それは、グラフィックス・ドライバ２１６のキャッシュによって内部的に生成され、その後、ブロック２３６のキャッシュエントリからビデオゲーム・クライアント２１２によって読み出される。いくつかの実施形態において、シェーダＩＤは、ビデオゲームがダウンロードされたときに、コンパイルされていないシェーダ・コードと共に提供され、これらのシェーダＩＤは、その後、ブロック２３６のキャッシュエントリから読み出される。いくつかの実施形態において、シェーダＩＤは、同じ方法でシェーダをコンパイルする同じハードウェア構成を有する全てのクライアント・マシン１０４が同じシェーダＩＤ（又はシェーダキー）を生成するような決定論的な方法で、コンパイルされたシェーダ・コード１１６に基づいてビデオゲーム・クライアント２１２によって生成される。
【００４４】
サブブロック２３８に示すように、ビデオゲーム・クライアント２１２は、また、キャッシュエントリから読み出されたコンパイルされたシェーダ用のマシン・コードをハッシュ化してもよく、このハッシュは、タプル(tuple)のセット（各タプルは、シェーダＩＤ／キー及びシェーダ用のコンパイルされたマシン・コードのハッシュを具備する）内のシェーダＩＤ（又はシェーダキー）とともにリモート・システム１０６に送信されてもよい。
【００４５】
ブロック２４０において、クライアント・マシン１０４は、情報１１０をリモート・システム１０６に送信（又はアップロード）してもよく、その情報は、クライアント・マシン１０４によってコンパイルされたシェーダのシェーダＩＤの少なくともセットを含む。ブロック２４０で送信される情報１１０は、クライアント・マシン１０４のハードウェア構成、ビデオゲームのアプリケーションＩＤ、及び／又はコンパイルされたシェーダのマシン・コードのハッシュをさらに含んでもよい。この情報１１０のいずれか又は全てが、受信時にリモート・システム１０６によって消費される「シェーダ使用レポート」として送信されてもよい。一例において、単一のクライアント・マシン１０４によって送信される単一のシェーダ使用レポートは、特にビデオゲームがクライアント・マシン１０４上で初めてプレイされる場合、単一のビデオゲームのための数万個を超すシェーダに関する情報（例えば、シェーダＩＤなど）を含んでもよい。ブロック２２６に続く「ＮＯ」ルートに由来するプロセス２００の分岐は、リモート・システム１０６でシェーダ関連情報を収集するための「テレメトリ」アプローチを表す。多数のクライアント・マシン１０４がプロセス２００を実行している可能性があることを考慮すると、リモート・システム１０６は、異なるハードウェア構成を有する膨大な数のクライアント・マシン１０４からブロック２４０でアップロードされる説明された情報１１０を収集してもよい。
【００４６】
図２は、クライアント・マシン１０４がブロック２３４でプログラム（例えば、ビデオゲーム）の実行を停止した後、情報１１０がブロック２４０でリモート・システム１０６に送信される（又はアップロードされる）シナリオを描いているが、情報１１０は、リアルタイムで、又は実質的にリアルタイムで、リモート・システム１０６に送信され得る（例えば、ストリーミングによって）ことが理解されるであろう。例えば、ブロック２４０で情報１１０をアップロードする前にブロック２３４でゲームを終了するのを待つ代わりに、クライアント・マシン１０４は、グラフィックス・ドライバがシェーダ・コードをコンパイルしてキャッシュするように、リアルタイムで情報１１０をストリーミング又はその他の方法で送信してもよい。
【００４７】
ブロック２２６に戻り、リモート・システム１０６が、要求するクライアント・マシン１０４がプリキャッシュするために利用可能なコンパイルされたシェーダ・コードを持っている場合、プロセス２００は、ブロック２２６からブロック２４２までの「ＹＥＳ」ルートを辿ってもよく、ここで、クライアント・マシン１０４は、当該ビデオゲームのハードウェア構成及びアプリケーションＩＤに対応するコンパイルされたシェーダ・コード１１６を受信（又はダウンロード）し、クライアント・マシン１０４は、コンパイルされたシェーダ・コード１１６の少なくとも一部を所定のメモリ・ロケーション２１８にプリキャッシュ（又はその後の使用のために保存）する。コンパイルされたシェーダ・コード１１６をダウンロードするため、リモート・システム１０６は、クライアント・マシン１０４に、コンパイルされたシェーダ・コード１１６をダウンロードするためにどこに行けばよいかをクライアント・マシン１０４に伝えるための情報（例えば、識別子、ユニフォーム・リソース・ロケータ（ＵＲＬ）など）を提供してもよい。クライアント・マシン１０４は、コンパイルされたシェーダ・コード１１６を圧縮された形式（例えば、zipファイル）でダウンロードしてもよい。
【００４８】
２４４において、クライアント・マシン１０４は、ビデオゲームを実行してもよく、ここで、ビデオゲームを実行することは、クライアント・マシン１０４のグラフィックス・ドライバ２１６がコンパイルされたシェーダ・コード自体を作成する代わりに、ＧＰＵ２０４が、所定のメモリ・ロケーション２１８から検索されたコンパイルされたシェーダ・コード１１６の少なくとも一部を実行することを含む。すなわち、ブロック２４２におけるプリキャッシングは、クライアント・マシン１０４がシェーダ自体をコンパイルしなければないことから救済する。その代わりとして、ダウンロードされたシェーダ・コード１１６は、プログラム実行のパフォーマンスを最適化するために、ゲーム実行中に利用することができる。
【００４９】
図３は、リモート・コンピューティング・システム１０６の例示的な構成要素を示すブロック図であり、クライアント・マシン１０４から情報１１０を受信し、受信した情報１１０に含まれるシェーダＩＤをカタログ化し、コンパイルされたシェーダ・コード１１６を選択的に要求し、再配布のためにコンパイルされたシェーダ・コード１１６を選択的に準備するための例示的なプロセス３００のフロー図である。図示された実装において、リモート・システム１０６は、他の構成要素の中で、１つ又は複数のプロセッサ３０２、メモリ３０４（又は非一時的なコンピュータ可読媒体３０４）、及び通信インターフェース（複数可）３０６を含む。メモリ３０４（又は非一時的なコンピュータ読み取り可能媒体３０４）は、コンピュータ読み取り可能命令、データ構造、プログラムモジュール、又は他のデータなどの情報を記憶するための任意の方法又は技術で実装された揮発性及び不揮発性メモリ、取り外し可能及び非取り外し可能な媒体を含むことができる。このようなメモリは、ＲＡＭ、ＲＯＭ、ＥＥＥＰＲＯＭ、フラッシュメモリ又は他のメモリ技術、ＣＤ-ＲＯＭ、デジタル多目的ディスク（ＤＶＤ）又は他の光学ストレージ、磁気カセット、磁気テープ、磁気ディスクストレージ又は他の磁気ストレージ装置、ＲＡＩＤストレージシステム、又は所望の情報を格納するために使用することができ、コンピューティング装置によってアクセスすることができる任意の他の媒体を含むが、これらに限定されるものではない。コンピュータ読み取り可能媒体３０４は、コンピュータ読み取り可能記憶媒体（「ＣＲＳＭ」）として実装されてもよく、これは、メモリ３０４に格納された命令を実行するためにプロセッサ（複数可）３０２によってアクセス可能な任意の利用可能な物理媒体であってもよい。一基本的な実装において、ＣＲＳＭは、ランダム・アクセス・メモリ（「ＲＡＭ」）及びフラッシュメモリを含んでもよい。他の実装において、ＣＲＳＭは、リード・オンリー・メモリ（「ＲＯＭ」）、電気的に消去可能なプログラマブル・リード・オンリー・メモリ（「ＥＥＰＲＯＭ」）、又は所望の情報を格納するために使用することができ、プロセッサ（複数可）３０２によってアクセス可能な任意の他の有形媒体を含んでもよいが、これらに限定されない。シェーダ配布モジュール３０８は、プロセッサ（複数可）３０２によって実行されると、リモート・システム１０６がここに記載された技術及び操作を実行させ、メモリ３０４に格納された命令を表してもよい。
【００５０】
ここで、図３に示されたプロセス３００を参照する。３１４において、リモート・システム１０６は、クライアント・マシン１１４から情報１１０を受信してもよい（例えば、上述したプロセス２００のブロック２２６からの「ＮＯ」ルートに続く「テレメトリ」ブランチの一部として）。特定のクライアント・マシン１０４から送信される受信情報１１０は、クライアント・マシン１０４上でのビデオゲームの実行中にクライアント・マシン１０４のグラフィックス・ドライバ２１６によってコンパイルされたシェーダのシェーダＩＤのセットを少なくとも含んでいてもよい。さらに、ブロック３１４で受信した情報１１０は、クライアント・マシン１０４のハードウェア構成、実行されたビデオゲームのアプリケーションＩＤ、コンパイルされたシェーダのためのマシン・コードのハッシュ、クライアント・マシン１０４のデバイスＩＤなどの「シェーダ使用レポート」の追加情報を含んでもよい。
【００５１】
３１６において、リモート・システム１０６は、ブロック３１４で受信したシェーダＩＤのセットを、ハードウェア構成及びアプリケーションＩＤによって（又はそれに応じて）カタログ化してもよい。例えば、カタログ１１２は、アプリケーションＩＤとハードウェア構成のユニークな組み合わせによって分類された複数のグループ又はバケット３１０（１）〜（Ｍ）を含んでもよい。例えば、ハードウェア構成「１」を有する第１クライアント・マシン１０４（１）を例にとると、ブロック３１４で第１クライアント・マシン１０４（１）からシェーダＩＤの第１セットを受信した場合、ブロック３１４でシェーダＩＤの第１セットが第１バケット３１０（１）（又はグループ）にカタログ化され、このバケット３１０（１）は、ブロック３１４で第１クライアント・マシン１０４（１）から受信した情報１１０より抽出されたアプリケーションＩＤと第１クライアント・マシン１０４（１）のハードウェア構成とでタグ付けされてもよい。同様に、第２クライアント・マシン１０４（２）は、シェーダＩＤの第２セットを送信してもよく、このシェーダＩＤの第２セットは、ブロック３１４で第２バケット３１０（２）にカタログ化されてもよく、これはブロック３１４で第２クライアント・マシン１０４（２）から受信した情報１１０から抽出されたアプリケーションＩＤと第２クライアント・マシン１０４（２）の第２ハードウェア構成「２」とでタグ付けされてもよい。これは、テレメトリ情報を報告するクライアント・マシン１０４の数に応じて、それらのクライアント・マシン１０４が異なるハードウェア構成を有するかどうかに応じて、及び／又はそれらのクライアント・マシン１０４上で実行されているゲームの数に応じて、任意の数の「Ｍ」バケットについて継続することができる。
【００５２】
ブロック３１８において、リモート・システム１０６は、受信したシェーダＩＤのいずれかについてコンパイルされたシェーダ・コードを要求するかどうかを決定してもよい。ブロック３１８でこの決定を行うためのアルゴリズムは、以下でより詳細に説明されるように、様々であってもよい。
【００５３】
リモート・システム１０６が、ブロック３１８において、当面の間、コンパイルされたシェーダ・コードを要求しないと決定した場合、プロセス３００は、ブロック３１８からブロック３１４に戻る「ＮＯ」ルートを辿ってもよく、ここでリモート・システム１０６はクライアント・マシン１０４から情報１１０（例えば、シェーダ使用レポート）を収集／受信し続ける。リモート・システム１０６が受信したシェーダＩＤ（複数可）に対してコンパイルされたシェーダ・コードを要求することを決定する場合、プロセス３００は、ブロック３１８からブロック３２０への「ＹＥＳ」ルートを辿ってもよく、ここでリモート・システム１０６は、リモート・システム１０６が受信したシェーダＩＤに対応する１つ以上のシェーダに対してコンパイルされたシェーダ・コードを要求する要求１１４を送信する。
【００５４】
３２２において、リモート・システム１０６は、特定のクライアント・マシン１０４から要求したコンパイルされたシェーダ・コード１１６を受信してもよく、リモート・システム１０６は、対応するシェーダＩＤ（複数可）に関連して（例えば、カタログ１１２に）コンパイルされたシェーダ・コードを格納してもよい。説明のために、リモート・システム１０６が、第１バケット３１０（１）内のシェーダＩＤの１つ以上についてコンパイルされたシェーダ・コードを要求し、この要求が、第１バケット３１０（１）がタグ付けされたハードウェア構成を有するクライアント・マシン１０４に送信された場合、リモート・システム１０６は、受信したシェーダ・コードを第１バケット３１０（１）内に、対応するシェーダＩＤ（複数可）と関連づけて格納してもよい。
【００５５】
サブブロック３２４によって示されるように、リモート・システム１０６は、受信したシェーダ・コードが有効なコードであることを確認するために、受信したシェーダ・コードを格納する前に検証ハッシュを計算してもよい。すなわち、リモート・システム１０６は、ブロック３２２でクライアント・マシン１０４から受信したコンパイルされたシェーダ・コードをハッシュ化して、コンパイルされたシェーダ・コードの検証ハッシュを生成してもよい。ブロック３１４において、コンパイルされたシェーダ・コードのハッシュが、情報１１０で受信されることを想起されたい。したがって、ブロック３２４で計算された検証ハッシュは、カタログ１１２内の対応するシェーダＩＤを持つタプルに格納されている以前に受信されたハッシュと比較されてもよい。検証ハッシュが、クライアント・マシン１０４から以前に受信されてカタログ化されたコンパイル済みシェーダ・コードのハッシュと一致する場合、そのコードは有効／認証されたものとみなすことができ、コンパイルされたコードは、ブロック３２２においてリモート・システム１０６によって格納されてもよい。
【００５６】
ブロック３２６において、リモート・システム１０６は、コンパイルされたシェーダ・コードを「再配布３１２用に準備されたコンパイルされたシェーダ・コード」として再配布のために準備するかどうかを決定してもよい。ブロック３２６において決定を行うためのアルゴリズムは、以下でより詳細に説明されるように、変形されてもよい。
【００５７】
リモート・システム１０６が、ブロック３２６において、当面の間、再配布のためにコンパイルされたシェーダ・コードを準備しないと決定した場合、プロセス３００は、ブロック３２６からブロック３１４に戻る「ＮＯ」ルートを辿ってもよく、ここでリモート・システム１０６がクライアント・マシン１０４からの情報１１０（例えば、シェーダ使用レポート）の収集／受信を継続する。リモート・システム１０６が再配布のためにコンパイルされたシェーダ・コードを準備することを決定すると、プロセス３００は、ブロック３２６からブロック３２８への「ＹＥＳ」ルートを辿ってもよく、ここで、リモート・システム１０６は、コンパイルされたシェーダ・コードを対応するアプリケーションＩＤ及びハードウェア構成に関連付けることによって、「再配布３１２のために準備されたコンパイルされたシェーダ・コード」を作成してもよい。例において、リモート・システム１０６は、所定のアプリケーションＩＤ及びハードウェア構成（すなわち、所定のバケット３１０に対して）に対してコンパイルされたシェーダ・コードの再分配可能な表現（又はデータ構造）を構築してもよく、このコードは、要求に応じてクライアント・マシン１０４に配布する準備ができている場所にアーカイブされてもよい。いくつかの実施形態において、コンパイルされたシェーダ・コードは、ＺＩＰファイルを作成するなど、コンパイルされたシェーダ・コードを圧縮することによって、再配布３１２のために準備されてもよい。
【００５８】
図４は、クライアント・マシン１０４のハードウェア構成に基づいて、要求するクライアント・マシン１０４にコンパイルされたシェーダ・コードを送信するための例示的なプロセス４００のフロー図である。図３及び図４のページ外参照「Ａ」によって示されるように、プロセス４００は、図３のブロック３２８からの継続であり、コンパイルされたシェーダ・コードがリモート・システム１０６によって準備され、それらの要求クライアント・マシン１０４上でのプリキャッシングのために要求クライアント・マシン１０４に利用可能になった後などである。
【００５９】
ブロック４０２において、リモート・システム１０６は、クライアント・マシン１０４の特定のハードウェア構成に係り、特定のプログラム（例えば、ビデオゲーム）のアプリケーションＩＤに係るコンパイルされたシェーダ・コードに対する要求１１８の一部として、クライアント・マシン１０４から情報を受信してもよい。したがって、ブロック４０２で受信した情報は、要求するクライアント・マシン１０４のハードウェア構成と、クライアント・マシン１０４にインストールされているか、又は現在インストールされている可能性のあるプログラム（例えば、ビデオゲーム）に対応するアプリケーションＩＤとを含んでもよい。
【００６０】
４０４において、リモート・システム１０６は、クライアント・マシン１０４のハードウェア構成に対応するコンパイルされたシェーダ・コードが利用可能であるかどうかと、要求に関連付けられたアプリケーションＩＤとを決定してもよい。一例において、リモート・システム１０６は、準備されたシェーダ・コード３１２を分析し、再配布３１２のために準備されたコンパイルされたシェーダ・コードのいずれかが、一致するハードウェア構成及び一致するアプリケーションＩＤに関連付けられているかどうかを判断してもよい。一致するハードウェア構成と一致するアプリケーションＩＤが見つかった場合、これは、一致するハードウェア構成を有する別のクライアント・マシン１０４が以前に同じプログラム（例えば、ビデオゲーム）を実行し、そのプログラムの実行中にシェーダ・コードをコンパイルしたことを示し、また、リモート・システム１０６がその後、コンパイルされたシェーダ・コードを受信し、再配布のために準備したことを示している。このような場合、プロセス４００は、ブロック４０４からブロック４０６への「ＹＥＳ」ルートを辿ってもよく、ここで、リモート・システム１０６は、そのクライアント・マシン１０４上でアプリケーションＩＤを有するビデオゲームを実行しながら、クライアント・マシン１０４のＧＰＵ２０４によって実行されるように、コンパイルされたシェーダ・コードを要求元のクライアント・マシン１０４に送信してもよい。
【００６１】
一方、ブロック４０４において、リモート・システム１０６が、要求するクライアント・マシン１０４の特定のハードウェア構成及びアプリケーションＩＤに対して利用可能なコンパイルされたシェーダ・コードがないと判断した場合、プロセス４００は、ブロック４０４からブロック４０８への「ＮＯ」ルートを辿ってもよく、ここで、リモート・システム１０６は、要求されたシェーダ・コードが利用できないことをクライアント・マシンに通知してもよい。
【００６２】
図５は、コンパイルされたシェーダ・コードを選択的に要求するための例示的なプロセス５００のフロー図である。示されているように、プロセス５００は、図３のプロセス３００のブロック３１８における操作（複数可）のサブプロセスを表してもよく、プロセス５００は、リモート・システム１０６が少なくとも１つのシェーダＩＤ（又はシェーダキー）を受信した後に実行されてもよい。
【００６３】
５０２において、クライアント・マシン１０４上でビデオゲームを実行した結果、クライアント・マシン１０４からシェーダＩＤ（又はシェーダキー）を含むクライアント情報１１０を受信した後、リモート・システム１０６は、クライアント・マシン１０４から受信した所定のシェーダＩＤについて、リモート・システム１０６が、少なくとも所定の数の異なるクライアント・マシン１０４からそのシェーダＩＤを受信したかどうかを判断してもよい。予め定義された数は、設定変更可能である。リモート・システム１０６が、少なくとも予め定義された数の異なるクライアント・マシン１０４から同じシェーダＩＤを受信した場合、プロセス５００は、ブロック５０２からブロック５０４への「ＹＥＳ」ルートを辿ってもよく、ここで、リモート・システム１０６は、シェーダＩＤをリモート・システム１０６に送信したクライアント・マシン１０４に対して、シェーダＩＤに対応するコンパイルされたシェーダ・コード１１６を要求する要求１１４を送信してもよい。
【００６４】
一方、リモート・システム１０６が、少なくとも所定の数の異なるクライアント・マシン１０４から同じシェーダＩＤを受信していない場合、プロセス５００は、ブロック５０２からブロック５０６への「ＮＯ」ルートを辿ってもよく、ここで、リモート・システム１０６は、追加のクライアント・マシン１０４がシェーダＩＤを送信するのを待ち、新たに受信したシェーダＩＤに続いてプロセス５００を反復することができる。
【００６５】
ブロック５０２における予め定義された数は設定変更可能である。予め定義された数が２つである場合、リモート・システム１０６は、２つの異なるクライアント・マシン１０４から同じシェーダＩＤを受信すると直ぐに、コンパイルされたシェーダ・コード１１６を要求する。所定の数が２より大きい場合、リモート・システム１０６は、コンパイルされたシェーダ・コード１１６を要求する前に、より多くのクライアント・マシン１０４が同じシェーダＩＤを送信するまで待機する。いくつかの実施形態において、ブロック５０４でコンパイルされたシェーダ・コードを要求する前に満たされる追加の基準は、異なるクライアント・マシンが同じハードウェア構成を有することであってもよい。すなわち、「２」に設定された所定の数について、コンパイルされたシェーダ・コード５０４の要求は、リモート・システム１０６が、同じハードウェア構成（例えば、同じＧＰＵモデル及び同じバージョンのグラフィックス・ドライバ）を有する２つの異なるクライアント・マシン１０４から同じシェーダＩＤ（又はシェーダキー）を受信したときにトリガされてもよい。このように、プロセス５００は、対応するシェーダＩＤの受信時に直ちにコンパイルされたシェーダ・コードを要求するのではなく、選択的にコンパイルされたシェーダ・コードを要求する例である。
【００６６】
図６は、再配布のためにコンパイルされたシェーダ・コードを選択的に準備するための例示的なプロセス６００のフロー図である。示されているように、プロセス６００は、図３のプロセス３００のブロック３２６における操作のサブプロセスを表してもよく、プロセス６００は、リモート・システム１０６が１つ以上のクライアント・マシン１０４からコンパイルされたシェーダ・コードを受信した後に実行されてもよい。
【００６７】
６０２において、クライアント・マシン１０４からコンパイルされたシェーダ・コード１１６を要求して受信した後、リモート・システム１０６は、コンパイルされたシェーダ・コード１１６を送信したクライアント・マシン１０４に関連付けられたユーザアカウントが信頼されたアカウントであるかどうかを判断してもよい。例えば、リモート・システム１０６は、ブロック６０２において照合可能な信頼されたユーザアカウントのリストを保持してもよい。これらの信頼されたユーザアカウントは、問題のビデオゲームのライセンスを合法的に取得したユーザ／クライアント・マシンに関連付けられていてもよい。さらに、又は代替的に、信頼されたユーザアカウントは、ゲーム出版社又は開発者（例えば、リリース日に先立ってビデオゲームを実行するユーザ）、及び／又は、信頼されたユーザが一般にリリースされる前にビデオゲームのバグ及び他の問題についてテストを行うことを任務としているテストラボを運営するユーザのアカウントに関連付けられていてもよい。リモート・システム１０６は、そのようなユーザを自動的に信頼するように構成されており、したがって、そこから受信したコンパイルされたシェーダ・コード１１６は、そのように構成されている。
【００６８】
ブロック６０２における決定が、コンパイルされたシェーダ・コード１１６が信頼されたユーザアカウントから受信されたものである場合、プロセス６００は、ブロック６０２からブロック６０４への「ＹＥＳ」ルートを辿ってもよく、ここで、ポピュラリティ閾値が１に設定されてもよい。そうでなければ、リモート・システム６０２が、コンパイルされたシェーダ・コードを送信したユーザ１０２及び／又はマシン１０４を信頼できない場合、プロセス６００は、ブロック６０２からブロック６０６への「ＮＯ」ルートを辿ってもよく、ここで、ポピュラリティ閾値が１よりも大きい数字（例えば、ポピュラリティ閾値１０）に設定されてもよい。
【００６９】
６０８において、リモート・システム１０６は、特定のハードウェア構成及び特定のアプリケーションＩＤを有するグループ（又はバケット３１０）にカタログ化された特定のシェーダＩＤ（又はシェーダキー）について、その特定のシェーダＩＤをリモート・システム１０６に送信した異なるクライアント・マシン１０４の数をカウントしてもよい。換言すると、リモート・システム１０６は、同じシェーダＩＤ（又はシェーダキー）及び同じアプリケーションＩＤを報告している同じハードウェア構成を有する異なるクライアント・マシン１０４の数を監視してもよい。
【００７０】
６１０において、リモート・システム１０６は、その数（又は同じシェーダＩＤを報告する異なるクライアント・マシン１０４の数）がポピュラリティ閾値を満たすか、又は超えるかを判断してもよい。その数がブロック６１０においてポピュラリティ閾値を満たさない場合、プロセス６００は、ブロック６１０からブロック６０８に戻る「ＮＯ」ルートを辿ってもよく、ここでリモート・システム１０６は、シェーダＩＤを報告するクライアント・マシン１０４の数をカウントし続ける（又は他の方法で監視し続ける）。その数（すなわち、同じシェーダＩＤを報告する異なるクライアント・マシン１０４の数）がブロック６１０でポピュラリティ閾値を満たすか、又は超える場合、プロセス６００は、ブロック６１０からブロック６１２への「ＹＥＳ」ルートを辿ってもよく、ここで、受信されたシェーダ・コードが、１つ以上の追加のクライアント・マシン１０４から受信されたコンパイルされたシェーダ・コードと一致するかどうかを決定するために、オプションの検証ステップを実行することができる。換言すると、リモート・システム１０６は、同じシェーダＩＤを報告した複数の異なるクライアント・マシン１０４から同じコンパイルされたシェーダ・コード１１６であると思われるものを要求して受信し、ブロック６１２で異なるクライアント・マシン１０４から受信したコンパイルされたシェーダ・コード１１６を比較してもよい。異なるクライアント・マシン１０４からのコンパイルされたシェーダ・コードの比較に基づいて、ブロック６１２で検出された競合がある場合、プロセス６００は、ブロック６１２からブロック６１４への「ＮＯ」ルートを辿ってもよく、ここで検出された競合に基づき受信されたシェーダ・コードが破棄されてもよい。同じハードウェア構成を有するクライアント・マシン１０４からのシェーダ・コードの不一致は、クライアント・マシン１０４のうちの１つが「フェイク」コードを提供していることを示している可能性があり、このコードは、破損しているか、又はマルウェアを含んでいる可能性がある。
【００７１】
受信されたシェーダ・コードが異なるクライアント・マシンからのものと同じ（一致する）であると判断することによって、ブロック６１２での検証ステップが合格である場合、プロセス６００は、ブロック６１２からブロック６１６への「ＹＥＳ」ルートを辿り、ここでリモート・システム１０６は、再配布可能なデータ構造を構築し、（再配布可能なデータ構造内の）コンパイルされたシェーダ・コードを対応するアプリケーションＩＤ及びハードウェア構成に関連付けることによって、再配布のためにコンパイルされたシェーダ・コードを準備する（図３の３１２参照）。
【００７２】
図６のポピュラリティ閾値は設定変更可能であるため、リモート・システム１０６は、コミュニティの知覚された信頼及び／又は、意図せずに破損したコード又は悪意のあるコードを配布するリスク及び／又は感度に応じて調整することができる。また、ブロック６０４（ユーザアカウントが信頼されたアカウントであると決定されたときに生じる）において、ポピュラリティ閾値を１に設定することは、信頼されたユーザから受信したコンパイルされたシェーダ・コードが自動的に又は直ちに再配布のために準備されるプロセス６００の抜粋版において効果的に結果をもたらすことが理解されよう、なぜならリモート・システム１０６は、そのシェーダ・コードに対応する同じシェーダＩＤを他のクライアント・マシンが送信するのを待たず、リモート・システム１０６は、信頼されたユーザアカウントから受信したシェーダ・コードを検証するために、他のシェーダ・コードを持たない（必要性がない）ためである。
【００７３】
図７は、ダウンロードされたシェーダ・コードの一部を破棄し、破棄されたシェーダ・コードに対応するシェーダを再コンパイルし、再コンパイルされたシェーダのための情報をアップロードすることによって完全性チェックを実施するための例示的なプロセス７００のフロー図である。
【００７４】
７０２において、クライアント・マシン１０４は、ここに記載されるように、リモート・システム１０６からコンパイルされたシェーダ・コードを要求した後に、クライアント・マシン１０４のハードウェア構成のための、及び問題のプログラム（例えば、ビデオゲーム）のアプリケーションＩＤのためのコンパイルされたシェーダ・コード１１６を受信してもよい。 
【００７５】
７０４において、クライアント・マシン１０４は、コンパイルされたシェーダ・コード１１６の少なくとも一部を破棄されたシェーダ・コードとして破棄してもよい。例えば、クライアント・マシン１０４は、クライアント・マシン１０４のランダムなサブセットの一部であってもよく、（例えば、ビデオゲーム・クライアント２１２がリモート・システム１０６から命令を受信することを介して、及び／又はハードコード化された命令などを介して）リモート・システム１０６から受信したコンパイルされたシェーダの一部（例えば、１０％）を、「良好な」シェーダ・コード（すなわち、破損していない、及び／又はマルウェアなどを含まない）であるという前提にかかわらず、破棄するように構成されている。このようにシェーダ・コードを廃棄するクライアント・マシン１０４の数は、リモート・システム１０６によって設定変更可能であってもよく、ビデオゲームを実行しているユーザ人口の小さな部分（例えば、１０％）を表してもよい。
【００７６】
７０６において、クライアント・マシン１０４は、破棄されたシェーダ・コード以外のコンパイルされたシェーダ・コードの残りの部分をプリキャッシュしてもよい。コンパイルされたシェーダ・コードの残りの部分は、所定のメモリ・ロケーション２１８に格納されてもよい。
【００７７】
７０８において、クライアント・マシン１０４は、受信したシェーダ・コードに対応するシェーダを使用するビデオゲームの実行を開始してもよく、そのうちの少なくとも一部は、所定のメモリ・ロケーション２１８にキャッシュされる。
【００７８】
７１０において、クライアント・マシン１０４は、破棄されたシェーダ・コードに対応するシェーダをコンパイルしてキャッシュしてもよい。これは、ローディング画面の間、又はリアルタイムでのゲームの実行中に行うことができる。ブロック７０６においてプリキャッシュされた受信されたシェーダ・コードに対応するシェーダを利用する時が来ると、クライアント・マシン１０４のＧＰＵ２０４は、グラフィックス・ドライバ２１６が対応するシェーダを独自にコンパイルする代わりに、コンパイルされたシェーダ・コードを実行し、これによりクライアント・マシン１０４のリソースが節約される。
【００７９】
７１２において、ビデオゲーム・クライアント２１２は、ユーザ１０２がビデオゲームを終了することに応答して、ゲームの実行を停止してもよい。
【００８０】
７１４において、ビデオゲーム・クライアント２１２は、ビデオゲームの実行の停止に応答して、新たにコンパイルされたシェーダ（ブロック７１０でコンパイルされたシェーダ）のためのキャッシュされたシェーダ・コード１１６を開いて読み出し／解析して、それらの新たにコンパイルされたシェーダのためのシェーダＩＤ（又はシェーダキー）を生成してもよい。
【００８１】
サブブロック７１６で示されるように、ビデオゲーム・クライアント２１２は、新たにコンパイルされたシェーダ用のマシン・コードをハッシュ化してもよく、このハッシュは、シェーダＩＤ（又はシェーダキー）とともに、タプル（シェーダＩＤ／キー及びシェーダ用にコンパイルされたマシン・コードのハッシュを具備する各タプル）のセットでリモート・システム１０６に送信されてもよい。
【００８２】
ブロック７１８において、クライアント・マシン１０４は、情報１１０をリモート・システム１０６に送信（又はアップロード）してもよく、情報１１０は、少なくともクライアント・マシン１０４によってコンパイルされた新たにコンパイルされたシェーダのシェーダＩＤのセットを含む。ブロック７１８で送信される情報１１０は、クライアント・マシン１０４のハードウェア構成、ブロック７０８で実行されたビデオゲームのアプリケーションＩＤ、及び／又はコンパイルされたシェーダのマシン・コードのハッシュをさらに含んでもよい。この情報１１０のいずれか又は全ては、受信時にリモート・システム１０６によって消費される「シェーダ使用レポート」で送信されてもよい。
【００８３】
図８は、図７のプロセス７００の完全性チェックを使用して、既に配布されたシェーダ・コードのさらなる配布を停止するための例示的なプロセス８００のフロー図である。図７及び図８のページ外参照「Ｂ」は、プロセス８００が、図７のプロセス７００のブロック７１８から継続することができることを示している。
【００８４】
８０２において、リモート・システム１０６は、クライアント・マシン１１４から情報１１０を受信してもよい（例えば、上述したプロセス２００の「テレメトリ」分岐の一部として）。プロセス７００から続けて、ブロック８０２で受信したこの情報１１０は、送信しているクライアント・マシン１０４によって（プロセス７００のブロック７０４で）破棄されたシェーダ・コードに対応する新たにコンパイルされたシェーダのシェーダＩＤのセットを少なくとも含んでもよく、このクライアント・マシン１０４は、信頼されたユーザアカウント（例えば、システム上の完全性チェックの一部としてコンパイルされたシェーダを意図的に破棄するように指定された者）に関連付けられてもよい。さらに、ブロック８０２で受信した情報１１０は、クライアント・マシン１０４のハードウェア構成、実行されたビデオゲームのアプリケーションＩＤ、コンパイルされたシェーダの全てのマシン・コードのハッシュ、クライアント・マシン１０４のデバイスＩＤ、及び／又はそのようなものなど、「シェーダ使用レポート」で提供された追加の情報を含んでもよい。
【００８５】
８０４において、リモート・システム１０６は、受信したシェーダＩＤのうちの１つ以上に対応するコンパイルされたシェーダ・コードが、ここに記載されているようなプロセス４００を実行し、送信されたシェーダ・コードに関する情報を記録することによって、１つ以上のクライアント・マシン１０４に既に配布されていることを決定してもよい。
【００８６】
８０６において、リモート・システム１０６は、クライアント・マシン１０４（すなわち、図７のプロセス７００において、他のシェーダ・コードを破棄し、その破棄されたシェーダ・コードに対応するシェーダを再コンパイルしたのと同じクライアント・マシン１０４）からコンパイルされたシェーダ・コードを要求してもよい。
【００８７】
８０８において、リモート・システム１０６は、クライアント・マシン１０４から要求したコンパイルされたシェーダ・コード１１６を受信してもよい。
【００８８】
８１０において、リモート・システム１０６は、受信したシェーダ・コード１１６を、既に配布されたシェーダ・コードと比較してもよい。
【００８９】
８１２において、リモート・システム１０６は、ブロック８１０における比較に基づいて、ブロック８０８においてクライアント・マシン１０４から受信したコンパイルされたシェーダ・コード１１６が、既に配布されたシェーダ・コードと一致するかどうかを決定してもよい。
【００９０】
比較されたシェーダ・コードが一致する場合、プロセス８００は、ブロック８１２からブロック８１４への「ＹＥＳ」ルートを辿ってもよく、ここでリモート・システム１０６は、要求に応じてコンパイルされたシェーダ・コード１１６の配布を継続する。比較されたシェーダ・コードが一致しない場合、プロセス８００は、ブロック８１２からブロック８１６への「ＮＯ」ルートを辿ってもよく、ここで、リモート・システム１０６は、既に配布されたシェーダ・コードの更なる配布を停止してもよく、例えば、既に配布されたシェーダ・コードを追加のクライアント・マシン１０４に送信することを控えることによって、そのようなシェーダ・コードの配布を停止してもよい。
【００９１】
図７及び図８の複合プロセスで説明されているように、そうでなければ「良い」（すなわち、破損していない、マルウェアを含まないなど）と考えられるシェーダ・コードの一部を意図的に破棄することは、システムにより多くの信頼を付加する。例えば、悪質な行為者は、リモート・システム１０６を介して再配布させるために、シェーダ・コード（「良い」シェーダ・コードのシェーダＩＤと一致するシェーダＩＤを有する）として偽装された悪質なコードを生成するクライアント・マシン１０４上のユーザアカウントのセットを作成しようとすることができる。しかしながら、悪意のあるコードは、実際の「良い」シェーダ・コードとは異なるので、リモート・システム１０６は、最終的にブロック８０８でクライアント・マシン１０４から「良い」シェーダ・コードを受け取り、ブロック８１２で不一致をキャッチして、悪意のあるコードのさらなる配布を停止させる。
【００９２】
シェーダ・コードの一部を意図的に破棄することは、ビデオゲームのクラッシュの原因となり得る、又はゲームプレイ中の描画問題の原因となり得るコードの偶発的な破損（例えば、ビットが反転されること）からもガードする。
【００９３】
主題は、構造的特徴に特有の言語で記載されてきたが、添付の特許請求の範囲に定義された主題は、必ずしも記載された特定の特徴に限定されるものではないことが理解されるべきである。むしろ、特定の特徴は、特許請求の範囲の実施形態の例示的な形態として開示されている。
【図１】
2021512391.tif 000003
【図２】
2021512391.tif 000004
【図３】
2021512391.tif 000005
【図４】
2021512391.tif 000006
【図５】
2021512391.tif 000007
【図６】
2021512391.tif 000008
【図７】
2021512391.tif 000009
【図８】
2021512391.tif 000010
【国際調査報告】
2021512391.tif 000011