(57)【要約】  本出願のいくつかの実現例はサーバシステムに向けられており、このサーバシステムは、１つ以上のＣＰＵと、複数のＧＰＵと、プログラムの実行中にＣＰＵおよび／またはＧＰＵによる使用のためのプログラムおよびデータを格納するメインダイナミックメモリと、不揮発性メモリに格納されたスタティックメモリプールと、スタティックメモリプールを管理するように構成されたメモリコントローラとを備える。ＧＰＵの各々は、ローカルキャッシュを含み、メモリコントローラを介してスタティックメモリプールにアクセスするように構成される。サーバシステムは、１つ以上のＣＰＵ上でゲームタイトルについて複数のゲームセッションを並行して実行する。複数のゲームセッションの各々は、スタティックメモリプールに格納されたスタティックデータ項目と関連付けられ、スタティックデータ項目を用いてそれぞれのＧＰＵによって実行可能なグラフィックス処理を必要とする。
2021517997.tif 000002
【特許請求の範囲】
【請求項１】
方法であって、
サーバシステムは、１つ以上のＣＰＵと、複数のＧＰＵと、プログラムの実行中に前記１つ以上のＣＰＵおよび／または前記複数のＧＰＵによる使用のためのプログラムおよびデータを格納するメインダイナミックメモリと、不揮発性メモリに格納されたスタティックメモリプールと、前記スタティックメモリプールを管理するように構成されたメモリコントローラとを含み、前記複数のＧＰＵの各々は、ローカルキャッシュを含み、前記メモリコントローラを介して前記スタティックメモリプールにアクセスするように構成され、前記方法は前記サーバシステムにおいて、
前記１つ以上のＣＰＵ上でゲームタイトルについて複数のゲームセッションを並行して実行することを含み、前記複数のゲームセッションの各々は、スタティックデータ項目と関連付けられ、前記スタティックデータ項目を用いてそれぞれのＧＰＵによって実行可能なグラフィックス処理を必要とし、前記スタティックデータ項目は前記スタティックメモリプールに格納され、前記方法は、
前記１つ以上のＣＰＵ上で実行される前記複数のゲームセッションのうち第１のゲームセッションについて、
前記グラフィックス処理を第１のＧＰＵに割当てることと、
前記第１のＧＰＵが、前記スタティックデータ項目の第１のコピーを前記メモリコントローラにリクエストすることと、
前記スタティックメモリプールから読出された前記スタティックデータ項目の前記第１のコピーを前記メモリコントローラから受信することと、
前記第１のＧＰＵが、前記スタティックデータ項目の前記第１のコピーを用いて前記グラフィックス処理を実行することと、
前記複数のゲームセッションのうち前記第１のゲームセッションと関連して、前記グラフィックス処理の第１の結果をローカルに格納することとを含み、
前記１つ以上のＣＰＵ上で実行される前記複数のゲームセッションのうち第２のゲームセッションについて、
前記グラフィックス処理を第２のＧＰＵに割当てることと、
前記第２のＧＰＵが、前記スタティックデータ項目の第２のコピーを前記メモリコントローラにリクエストすることと、
前記スタティックメモリプールから読出された前記スタティックデータ項目の前記第２のコピーを前記メモリコントローラから受信することと、
前記第２のＧＰＵが、前記スタティックデータ項目の前記第２のコピーを用いて前記グラフィックス処理を実行することと、
前記複数のゲームセッションのうち前記第２のゲームセッションと関連して、前記グラフィックス処理の第２の結果をローカルに格納することとを含む、方法。
【請求項２】
前記スタティックメモリプールは、前記サーバシステムの前記１つ以上のＣＰＵおよび前記複数のＧＰＵに近接して配設されている、および／または、これらによって共有される、請求項１に記載の方法。
【請求項３】
前記メインダイナミックメモリは、前記サーバシステムの前記１つ以上のＣＰＵおよび前記複数のＧＰＵに近接して配設されている、および／または、これらによって共有される、請求項２に記載の方法。
【請求項４】
前記スタティックメモリプールは、前記サーバシステムの前記１つ以上のＣＰＵおよび前記複数のＧＰＵの各々から距離を有し、前記距離は所定の距離閾値よりも小さい、請求項２に記載の方法。
【請求項５】
前記スタティックメモリプールは、前記サーバシステムの前記１つ以上のＣＰＵおよび前記複数のＧＰＵがその上に配設されているサーバラックに物理的に位置する、請求項４に記載の方法。
【請求項６】
前記メインダイナミックメモリはダイナミックランダムアクセスメモリを含み、
前記複数のＧＰＵの前記ローカルキャッシュおよび前記１つ以上のＣＰＵのローカルキャッシュの各々は、スタティックランダムアクセスメモリを含み、
前記スタティックメモリプールは、ソリッドステートドライブ、フラッシュメモリおよび相変化ランダムアクセスメモリのうち１つを含む、前記請求項のいずれか１項に記載の方法。
【請求項７】
前記第１のＧＰＵは複数のＧＰＵコアおよび前記複数のＧＰＵコアによって共有される共通キャッシュを有し、各ＧＰＵコアは、前記それぞれのＧＰＵコアによって使用される命令及びデータを格納するそれぞれのキャッシュメモリを含む、前記請求項のいずれか１項に記載の方法。
【請求項８】
前記サーバシステムは、前記グラフィックス処理を実行するために前記複数のＧＰＵによって使用される１つ以上のコンパイルされたシェーダを格納するシェーダキャッシュを含む、前記請求項のいずれか１項に記載の方法。
【請求項９】
前記サーバシステムは、複数のコンパイルされたシェーダを格納するシェーダキャッシュを含み、前記方法はさらに、
前記複数のゲームセッションのうち前記第１のゲームセッションについて性能基準を識別することと、
前記性能基準に従って、前記複数のコンパイルされたシェーダのうち１つのシェーダを選択することとを含み、前記複数のコンパイルされたシェーダのうち選択された前記１つのシェーダは、前記グラフィックス処理を実行するために前記第１のＧＰＵによって使用される、前記請求項のいずれか１項に記載の方法。
【請求項１０】
前記メモリコントローラは、前記メインダイナミックメモリと前記スタティックメモリプールとの両方を管理するように構成される、前記請求項のいずれか１項に記載の方法。
【請求項１１】
前記メモリコントローラは第１のメモリコントローラを含み、前記サーバシステムはさらに、前記第１のメモリコントローラとは別の、前記メインダイナミックメモリを管理するように構成された第２のメモリコントローラを含む、前記請求項のいずれか１項に記載の方法。
【請求項１２】
前記グラフィックス処理は、ＯｐｅｎＧＬレンダリングパイプラインの一部であり、頂点処理、テッセレーション、幾何学処理、プリミティブアセンブリ、ラスタ化、フラグメンテーションおよびプリサンプリングのうち１つを含む、前記請求項のいずれか１項に記載の方法。
【請求項１３】
前記グラフィックス処理の前記第１の結果をローカルに格納することはさらに、前記複数のゲームセッションのうち前記第１のゲームセッションと関連して前記グラフィックス処理の前記第１の結果を前記ローカルキャッシュに格納することを含み、前記グラフィックス処理は第１のグラフィックス処理を含み、前記方法はさらに、
前記第１のグラフィックス処理の前記第１の結果を前記ローカルキャッシュから取得することと、
前記第１のＧＰＵが、前記第１のグラフィックス処理の前記第１の結果を用いて、前記第１のグラフィックス処理に続く第２のグラフィックス処理を実行することとを含む、前記請求項のいずれか１項に記載の方法。
【請求項１４】
前記第１および第２のグラフィックス処理の両方は、前記複数のゲームセッションのうち前記第１のゲームセッションに関与するクライアントデバイスから受信されたユーザリクエストに応答して、ゲームコンテンツストリームを生成する画像レンダリングプロセスの一部である、請求項１３に記載の方法。
【請求項１５】
前記グラフィックス処理の前記第１の結果をローカルに格納することはさらに、前記複数のゲームセッションのうち前記第１のゲームセッションと関連して前記グラフィックス処理の前記第１の結果を前記メインダイナミックメモリに格納することを含み、前記グラフィックス処理は第１のグラフィックス処理を含み、前記方法はさらに、
前記グラフィックス処理の前記第１の結果を前記メインダイナミックメモリから取得することと、
前記第１のグラフィックス処理の前記第１の結果を用いて、前記第１のグラフィックス処理に続く第２のグラフィックス処理を実行することとを含む、前記請求項のいずれか１項に記載の方法。
【請求項１６】
前記サーバシステムはさらにエンコーダを含み、前記方法はさらに、
前記エンコーダが、前記複数のゲームセッションのうち前記第１のゲームセッションと関連付けられた画像フレームに、前記第１の結果を符号化することを含み、前記画像フレームは、前記複数のゲームセッションのうち前記第１のゲームセッションに関与するクライアントデバイスに提供される、前記請求項のいずれか１項に記載の方法。
【請求項１７】
前記スタティックデータ項目は、特に前記ゲームタイトルの開発者によって事前に定義され、前記ゲームタイトルが前記サーバシステムに最初にロードされると前記スタティックメモリプールにロードされる、前記請求項のいずれか１項に記載の方法。
【請求項１８】
前記スタティックデータ項目は、前記グラフィックス処理を実行するために前記複数のＧＰＵによって使用される１つ以上のコンパイルされたシェーダを含む、前記請求項のいずれか１項に記載の方法。
【請求項１９】
前記スタティックデータ項目は複数のコンパイルされたシェーダを含み、前記方法はさらに、
前記複数のゲームセッションのうち前記第１のゲームセッションについて性能基準を識別することと、
前記性能基準に従って、前記複数のコンパイルされたシェーダのうち１つのシェーダを選択することとを含み、前記複数のコンパイルされたシェーダのうち選択された前記１つのシェーダは、前記グラフィックス処理を実行するために前記第１のＧＰＵによって用いられる、前記請求項のいずれか１項に記載の方法。
【請求項２０】
前記スタティックデータ項目は、ＯｐｅｎＧＬレンダリングパイプラインで使用される１つ以上の標準パラメータを含む、前記請求項のいずれか１項に記載の方法。
【請求項２１】
前記スタティックデータ項目は、前記複数のゲームセッションの間で共有される、前記請求項のいずれか１項に記載の方法。
【請求項２２】
前記複数のゲームセッションの各々は優先順位と関連付けられ、前記第１および第２のＧＰＵの各々は、前記メモリコントローラから、前記第１および第２のゲームセッションの前記優先順位と関連して前記スタティックメモリプールから読出された前記スタティックデータ項目の前記それぞれのコピーを受信する、前記請求項のいずれか１項に記載の方法。
【請求項２３】
前記第１のゲームセッションは、前記第２のゲームセッションより高い優先順位を有し、前記第１のＧＰＵは、前記第２のＧＰＵが前記第２のコピーをリクエストした後に閾値時間と同時にまたは該閾値時間内に前記第１のコピーをリクエストし、前記第２のＧＰＵは、前記第１のＧＰＵが前記メモリコントローラから前記第１のコピーを受信するまで前記第２のコピーの受信を中断される、請求項２２に記載の方法。
【請求項２４】
前記スタティックメモリプールはハッシュテーブルを含み、複数のスタティックデータ項目が、前記ハッシュテーブルに従って前記ゲームタイトルと関連して前記スタティックメモリプールに格納される、前記請求項のいずれか１項に記載の方法。
【請求項２５】
前記スタティックデータ項目は、前記スタティックデータ項目がリードオンリーであると示すタグと関連付けられる、前記請求項のいずれか１項に記載の方法。
【請求項２６】
前記スタティックデータ項目を解放するリクエストを受信することと、
前記スタティックメモリプールが一杯であるかどうかを判断することと、
前記スタティックメモリプールが一杯であることに従って、最低使用頻度（ＬＲＵ）ページ置換方法に基づいて前記スタティックデータ項目を解放することと、
前記スタティックメモリプールが一杯でないという判断に従って、前記スタティックデータ項目の解放を中止することとをさらに含む、前記請求項のいずれか１項に記載の方法。
【請求項２７】
前記スタティックメモリプールは、複数のページに区分された相変化ランダムアクセスメモリ（ＰＲＡＭ）を含み、前記複数のページの各々は、前記それぞれのページに格納されたデータについて位置を識別するページハッシュを有し、前記方法はさらに、
前記メモリコントローラが、各ページの前記ハッシュに従って前記ＰＲＡＭに対する読み書きを行うことを含む、前記請求項のいずれか１項に記載の方法。
【請求項２８】
前記スタティックメモリプールから読出された前記スタティックデータ項目の前記第１のコピーを前記メモリコントローラから読み出した後で、前記第１のＧＰＵが、前記第１のコピーを前記ローカルキャッシュまたは前記メインダイナミックメモリに一時的に格納することをさらに含む、前記請求項のいずれか１項に記載の方法。
【請求項２９】
１つ以上のＣＰＵと、
複数のＧＰＵと、
前記１つ以上のＣＰＵおよび／または前記複数のＧＰＵによる使用のための１つ以上のプログラムを格納するメモリとを備え、前記メモリは少なくとも、メモリコントローラによって管理されるスタティックメモリプールとメインダイナミックメモリとを含み、前記１つ以上のプログラムは、請求項１〜２８のいずれか１項に記載の方法を実現するための命令を含む、サーバシステム。
【請求項３０】
サーバシステムの１つ以上のプロセッサによる実行のために構成された１つ以上のプログラムを格納する非一時的なコンピュータ可読記憶媒体であって、前記サーバシステムは、１つ以上のＣＰＵと複数のＧＰＵとを含み、前記非一時的なコンピュータ可読記憶媒体は少なくとも、メモリコントローラによって管理されるスタティックメモリプールとメインダイナミックメモリとを含み、前記１つ以上のプログラムは、請求項１〜２８のいずれか１項に記載の方法を実現するための命令を含む、非一時的なコンピュータ可読記憶媒体。
【請求項３１】
ゲームタイトルをロードするための方法であって、
サーバシステムは、１つ以上のＣＰＵと、複数のＧＰＵと、プログラムの実行中に前記１つ以上のＣＰＵおよび／または前記複数のＧＰＵによる使用のためのプログラムおよびデータを格納するメインダイナミックメモリと、不揮発性メモリに格納されたスタティックメモリプールと、前記スタティックメモリプールを管理するように構成されたメモリコントローラとを含み、前記複数のＧＰＵの各々は、前記メモリコントローラを介して前記スタティックメモリプールにアクセスするように構成され、前記方法は前記サーバシステムにおいて、
前記１つ以上のＣＰＵが、ゲームタイトルに対応する実行可能なゲームプログラムを前記メインダイナミックメモリにロードすることを含み、前記１つ以上のＣＰＵは複数のオンラインゲームセッションを並行して実行するように構成され、前記複数のオンラインゲームセッションの各々は、前記実行可能なゲームプログラムに対応し、前記複数のオンラインゲームセッションの各々は、前記それぞれのオンラインゲームセッションをレンダリングするように割当てられたそれぞれのＧＰＵによって実行可能なグラフィックス処理を必要とし、前記方法はさらに、
前記１つ以上のＣＰＵが、前記複数のゲームセッションの前記グラフィックス処理で使用されるスタティックデータ項目を識別することと、
前記メモリコントローラが、前記スタティックデータ項目を前記スタティックメモリプールに格納することと、
前記メモリコントローラが、前記複数のオンラインゲームセッションを実行している前記複数のＧＰＵが前記グラフィックス処理を実行しつつ前記スタティックデータ項目にアクセスすることを可能にする、方法。
【請求項３２】
前記スタティックデータ項目は第１のスタティックデータ項目を含み、前記第１のスタティックデータ項目は、所定のスタティックデータ項目のリスト内の前記１つ以上のＣＰＵによって識別され、前記所定のスタティックデータ項目のリストは、スタティックデータ項目の第１のサブセットとスタティックデータ項目の第２のサブセットとを含み、前記方法はさらに、
前記メモリコントローラが、前記第１のスタティックデータ項目を含む前記スタティックデータ項目の前記第１のサブセットを前記スタティックメモリプールに格納することと、
前記メモリコントローラが、前記スタティックデータ項目の前記第２のサブセットを前記メインダイナミックメモリに格納することとを含む、請求項３１に記載の方法。
【請求項３３】
前記スタティックデータ項目は、前記ゲームタイトルのレンダリングにおいて使用される標準スタティックデータ項目であり、前記方法はさらに、
前記スタティックデータ項目の前記スタティックメモリプールへの格納の前に、前記スタティックデータ項目を前記サーバシステムのハードドライブまたはリモートライブラリサーバから取出すことを含む、請求項３１または３２に記載の方法。
【請求項３４】
前記スタティックデータ項目は、特に前記ゲームタイトルの開発者によって事前に定義され、前記サーバシステムのハードドライブに格納されたカスタムスタティックデータ項目であり、前記方法はさらに、
前記スタティックデータ項目の前記スタティックメモリプールへの格納の前に、前記スタティックデータ項目を前記サーバシステムの前記ハードドライブから取出すことをさらに含む、請求項３１または３２に記載の方法。
【請求項３５】
前記実行可能なゲームプログラムに従って、前記１つ以上のＣＰＵが、前記複数のＧＰＵの各々を、その上で実行されるべき前記複数のオンラインゲームセッションのサブセットに割当てることと、
前記複数のゲームセッションの各々について、それぞれのＧＰＵによる前記グラフィックス処理の実行中に、前記それぞれのＧＰＵが、前記メモリコントローラを介して前記スタティックメモリプールから前記スタティックデータ項目のコピーを取得することと、前記スタティックデータ項目の前記コピーを用いて前記グラフィックス処理を実行することとをさらに含む、請求項３１〜３４のいずれか１項に記載の方法。
【請求項３６】
前記複数のゲームセッションの各々について、前記それぞれのＧＰＵによる前記グラフィックス処理の実行中に、前記それぞれのオンラインゲームセッションと関連して、ダイナミックデータ項目およびユーザ情報を前記メインダイナミックメモリに格納することをさらに含む、請求項３５に記載の方法。
【請求項３７】
前記複数のゲームセッションの各々について、前記それぞれのＧＰＵによる前記グラフィックス処理の実行中に、前記スタティックデータ項目の前記コピーを前記それぞれのＧＰＵのそれぞれのローカルキャッシュにロードすることをさらに含む、請求項３５に記載の方法。
【請求項３８】
前記それぞれのＧＰＵが前記スタティックデータ項目のコピーを前記スタティックメモリプールから取得することはさらに、前記複数のゲームセッションのサブセットについて、前記スタティックデータ項目の前記コピーを前記複数のＧＰＵのローカルキャッシュに一度ロードすることと、前記複数のゲームセッションの前記サブセットに対応する前記複数のＧＰＵのサブセットが、前記スタティックデータ項目の前記コピーを共有することとを含む、請求項３５に記載の方法。
【請求項３９】
１つ以上のＣＰＵと、
複数のＧＰＵと、
前記１つ以上のＣＰＵおよび／または前記複数のＧＰＵによって実行されるための１つ以上のプログラムを格納するメモリとを備え、前記メモリは少なくとも、メモリコントローラによって管理されるスタティックメモリプールとメインダイナミックメモリとを含み、前記１つ以上のプログラムは、請求項３１〜３８のいずれか１項に記載の方法を実現するための命令を含む、サーバシステム。
【請求項４０】
サーバシステムの１つ以上のプロセッサによる実行のために構成された１つ以上のプログラムを格納する非一時的コンピュータ可読記憶媒体であって、前記サーバシステムは、１つ以上のＣＰＵと複数のＧＰＵとを含み、前記非一時的コンピュータ可読記憶媒体は少なくとも、メモリコントローラによって管理されるスタティックメモリプールとメインダイナミックメモリとを含み、前記１つ以上のプログラムは、請求項３１〜３８のいずれか１項に記載の方法を実現するための命令を含む、非一時的コンピュータ可読記憶媒体。
【請求項４１】
オンラインゲームセッションのために画像フレームをレンダリングする方法であって、
サーバシステムは、１つ以上のＣＰＵと、１つ以上のＧＰＵと、プログラムの実行中に前記１つ以上のＣＰＵおよび／または前記１つ以上のＧＰＵによる使用のためのプログラムおよびデータを格納するメインダイナミックメモリと、シェーダキャッシュとを含み、前記方法は前記サーバシステムにおいて、
前記１つ以上のＣＰＵ上で、ゲームタイトルについて複数のオンラインゲームセッションを並行して実行することと、
前記１つ以上のＧＰＵが、コンパイルされたシェーダの第１のシーケンスを用いて、前記複数のオンラインゲームセッションの各々について複数の画像フレームをレンダリングすることとを含み、前記方法はさらに、
前記複数のオンラインゲームセッションを実行しつつ、
前記ゲームタイトルと関連付けられた前記複数のオンラインゲームセッションについて性能基準を識別することと、
前記複数のオンラインゲームセッションの各々の実行を特徴付ける使用統計を収集することと、
前記コンパイルされたシェーダの第１のシーケンスの性能を前記性能基準に関して改良するために前記コンパイルされたシェーダの第１のシーケンス内の第１のシェーダを修正して、コンパイルされたシェーダの修正された第１のシーケンスを生成することとを含む、方法。
【請求項４２】
前記シェーダキャッシュ内の前記コンパイルされたシェーダの第１のシーケンスを前記コンパイルされたシェーダの修正された第１のシーケンスと置換えることをさらに含む、請求項４１に記載の方法。
【請求項４３】
前記コンパイルされたシェーダの第１のシーケンスの第１のバージョンとして、前記コンパイルされたシェーダの第１のシーケンスを前記シェーダキャッシュに格納することと、
前記コンパイルされたシェーダの第１のシーケンスの第２のバージョンとして、前記コンパイルされたシェーダの修正された第１のシーケンスを前記シェーダキャッシュに格納することと、
前記複数のオンラインゲームセッションの各々の実行を特徴付ける次の使用統計を収集することと、
前記次の使用統計に従って、前記コンパイルされたシェーダの第１のシーケンスの前記第１および第２のバージョンのうち１つを選択して、前記複数のオンラインゲームセッションの各々について前記複数の画像フレームをレンダリングすることとを含む、請求項４１または４２に記載の方法。
【請求項４４】
前記コンパイルされたシェーダの第１のシーケンス内の前記第１のシェーダを修正することはさらに、前記複数のオンラインゲームセッションの性能が前記性能基準を満たすように、代替的なシェーダオプションのグループから代替的なシェーダを選択して、前記コンパイルされたシェーダの第１のシーケンス内の前記第１のシェーダを置換えることを含み、前記コンパイルされたシェーダの修正された第１のシーケンスは、前記代替的なシェーダを含む、請求項４１〜４３のいずれか１項に記載の方法。
【請求項４５】
前記コンパイルされたシェーダの第１のシーケンス内の前記第１のシェーダを修正するユーザ命令を受信することをさらに含み、前記第１のシェーダは、前記ユーザ命令に応答して、前記にコンパイルされたシェーダの第１のシーケンスで修正される、請求項４１〜４４のいずれか１項に記載の方法。
【請求項４６】
前記コンパイルされたシェーダの第１のシーケンスの性能を前記性能基準に関して改良するために前記コンパイルされたシェーダの第１のシーケンス内の前記第１のシェーダは自動的にユーザの介入なしで修正される、請求項４１〜４５のいずれか１項に記載の方法。
【請求項４７】
前記コンパイルされたシェーダの修正された第１のシーケンスを生成することはさらに、前記コンパイルされたシェーダの第１のシーケンスの性能を前記性能基準に関して改良するために前記コンパイルされたシェーダの第１のシーケンス内の第２のシェーダを修正することを含む、請求項４１〜４６のいずれか１項に記載の方法。
【請求項４８】
前記複数のゲームセッションは前記性能基準に従ってレンダリングされる必要があると判断することと、
前記複数のオンラインゲームセッションの各々について、前記複数の画像フレームをレンダリングするために前記コンパイルされたシェーダの第１のシーケンスを識別することとをさらに含む、請求項４１〜４７のいずれか１項に記載の方法。
【請求項４９】
前記性能基準は第１の性能基準を含み、前記複数のオンラインゲームセッションは、前記第１の性能基準とは異なる第２の性能基準に従ってレンダリングおよび実行され、前記方法はさらに、
前記第１の性能基準を、前記コンパイルされたシェーダの修正された第１のシーケンスと関連付けることと、
前記第２の性能基準を、前記コンパイルされたシェーダの第１のシーケンスと関連付けることとを含む、請求項４１〜４８のいずれか１項に記載の方法。
【請求項５０】
前記性能基準は第１の性能基準を含み、前記方法はさらに、
前記コンパイルされたシェーダの修正された第１のシーケンスを前記第１の性能基準と関連して前記シェーダキャッシュに格納することを含む、請求項４１〜４９のいずれか１項に記載の方法。
【請求項５１】
前記複数のオンラインゲームセッションを実行しつつ、
前記ゲームタイトルと関連付けられた前記複数のオンラインゲームセッションについて第２の性能基準を識別することと、
前記コンパイルされたシェーダの第１のシーケンスの性能を前記第２の性能基準に関して改良するためにコンパイルされたシェーダの第２のシーケンスを判断することと、
前記第２の性能基準と関連して、前記コンパイルされたシェーダの第２のシーケンスを前記シェーダキャッシュに格納することとをさらに含む、請求項５０に記載の方法。
【請求項５２】
前記使用統計は前記複数のオンラインゲームセッションの全消費電力を含み、前記第１の性能基準および前記第２の性能基準はそれぞれ、前記複数のオンラインゲームセッションの応答時間および電力使用量を最適化し、前記方法はさらに、
前記複数のオンラインゲームセッションの前記全消費電力が事前に定義された電力閾値を超えているという判断に従って、前記コンパイルされたシェーダの第２のシーケンスを選択し、前記コンパイルされたシェーダの第２のシーケンスを用いて、前記複数のオンラインゲームセッションの各々について前記複数の画像フレームをレンダリングすることを含む、請求項５１に記載の方法。
【請求項５３】
複数の性能基準の各々をコンパイルされたシェーダのそれぞれのシーケンスと関連付けるシェーダハッシュテーブルを確立することをさらに含み、前記確立することは、前記シェーダハッシュテーブルにおいて前記性能基準と前記コンパイルされたシェーダの第１のシーケンスとを関連付けることを含み、前記方法はさらに、
前記シェーダハッシュテーブルを前記シェーダキャッシュに格納することを含む、請求項４１〜５２のいずれか１項に記載の方法。
【請求項５４】
前記使用統計はユーザ入力情報を含み、前記方法はさらに、
前記シェーダハッシュテーブルにおいて、前記コンパイルされたシェーダの第１のシーケンスの複数のバージョンを前記ユーザ入力情報と関連付けることを含む、請求項５３に記載の方法。
【請求項５５】
前記使用統計に従って前記シェーダハッシュテーブルをダイナミックにアップデートすることをさらに含み、前記アップデートすることは、前記シェーダキャッシュ内の前記コンパイルされたシェーダの第１のシーケンスを、前記コンパイルされたシェーダの修正された第１のシーケンスと置換えることを含む、請求項５３に記載の方法。
【請求項５６】
前記使用統計は、前記複数のオンラインゲームセッションの各々に対応する前記コンパイルされたシェーダの第１のシーケンスのユーザ入力、消費電力、１つ以上のゲームレイテンシ、コードサイズ、メモリ使用量およびキャッシュ使用量のうち少なくとも１つまたは全てを含む、請求項４１〜５５のいずれか１項に記載の方法。
【請求項５７】
前記性能基準は、前記複数のオンラインゲームセッションを実行する過程における前記コンパイルされたシェーダの第１のシーケンスの全消費電力、コードサイズ、平均レイテンシ、全キャシュ使用量、および全メモリ使用量のうち１つ以上に対応する、請求項４１〜５６のいずれか１項に記載の方法。
【請求項５８】
前記複数のオンラインゲームセッションは、前記ゲームタイトルについて、前記１つ以上のＣＰＵおよび前記１つ以上のＧＰＵによって処理されるオンラインゲームセッションの全てからサンプリングされる、請求項４１〜５７のいずれか１項に記載の方法。
【請求項５９】
１つ以上のＣＰＵと、
複数のＧＰＵと、
前記１つ以上のＣＰＵおよび／または前記複数のＧＰＵによる実行のための１つ以上のプログラムを格納するメモリとを備え、前記メモリは少なくとも、メインダイナミックメモリおよびシェーダキャッシュを含み、前記１つ以上のプログラムは、請求項４１〜５８のいずれか１項に記載の方法を実現するための命令を含む、サーバシステム。
【請求項６０】
サーバシステムの１つ以上のプロセッサによる実行のために構成された１つ以上のプログラムを格納する非一時的なコンピュータ可読記憶媒体であって、前記１つ以上のプログラムは、請求項４１〜５８のいずれか１項に記載の方法を実現するための命令を含む、非一時的なコンピュータ可読記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本出願は一般に、１つ以上のリアルタイムユーザインタラクティブアプリケーションに対応する複数のオンラインインタラクティブセッションをサポートするようにサーバシステムを管理するための方法およびシステムを含むがこれらに限定されない、コンピュータ技術に関する。
【背景技術】
【０００２】
背景
インターネット接続された電子デバイスは、さまざまなクラウドベースのメディアおよびエンターテインメントアプリケーションをサポート可能である。これらのアプリケーションは、サーバがコンテンツをユーザデバイスにストリームするメディアストリーミングアプリケーション、ユーザがサーバで実行されるゲームとユーザデバイスからインタラクトするゲームアプリケーション、ならびに、多数のユーザに互いに同時に、およびにインターネット接続されたデバイスを介してクラウドホスト型コンテンツおよびアプリケーションとインタラクトさせることが可能な、さまざまなソーシャルメディアおよび通信アプリケーションを含む。クラウドベースのアプリケーションのうち、クラウドゲーミングは、ゲームタイトルのハードウェアデマンドが大きく異なること、（たとえば、一人のプレーヤによって、１つの場所で複数のプレーヤによって、または複数の場所で複数のプレーヤによって）クラウドベースのベームをプレー可能なトポロジが多岐にわたること、ゲームセッションを実行するゲームサーバへのユーザ入力、およびゲームサーバからプレーヤのデバイス／ディスプレーへのゲームセッション出力を、レイテンシなく確実に送信する必要があること、ゲームプレーの速度および応答性についてプレーヤの期待が大きく異なること、ならびに、状況によってはリアルタイムゲームコンテンツを観客に提供したいという要望があることによって、特有の難題を提起することがある。クラウドベースのゲームの他の難題は、プレーヤの位置（たとえば、サーバに対して近いか遠いか）、プレーヤのゲームサービスに対する接続態様（たとえば、早いインターネット接続を介するか遅いインターネット接続を介するか）、および、プレーヤがゲームをプレーし（たとえば、一般的なパーソナルデバイスまたは専用ゲームコントローラ）ゲームプレー出力を視聴するのに用いるデバイス（たとえば、メディアストリーミングデバイスに接続されたパーソナルデバイスまたはメディアデバイス）の種類にかかわらず、プレーヤにとって矛盾のないゲームプレー体験を提供することに関する。
【０００３】
具体的には、許容可能なレイテンシおよび応答性でゲームを同時に実行可能な、複数のゲームタイトルについて、たとえば、同じまたは異なる場所から同じゲームタイトルをプレーしている複数のプレーヤについて、多種多様の入力デバイスおよび出力デバイスならびにネットワーク接続によって、複数のゲームセッションをサポートするクラウドゲームシステムが必要とされている。さらに、ゲームセッションにおいてプレーヤの入力（たとえば、エンドユースゲームデバイス／コントローラ上で入力されるゲーム入力）を受信すると、ユーザ入力を即座に処理し、同時に許容可能なレイテンシで全てのゲームプレーヤのためにプレーヤ入力アクションの結果を反映した高解像度画像を出力するクラウドゲームシステムが必要とされている。また、状況によっては、観客がそれぞれの表示デバイスでリアルタイムにゲームプレーを追えるように、ゲームプレーアクティビティの高解像度ビデオストリームを提供するゲームシステムが必要とされている。したがって、同じ場所に集まっているユーザによる自発的なゲームプレーから異なる場所からの複数のユーザによるオンラインインタラクティブゲームプレーまでの広範囲のゲーム設定でゲーム体験を拡張するために、効率のよいゲーム処理および出力メカニズムを有するクラウドゲームシステムを提供することが有益である。
【発明の概要】
【課題を解決するための手段】
【０００４】
概要
本明細書で説明される実現例は、許容可能なレイテンシおよび応答性で複数のオンラインゲームセッションの同時実行を容易にするように、サーバシステムの計算およびストレージリソースを構成することに向けられている。たとえば、不揮発性メモリに格納されたスタティックメモリプールは、常にリフレッシュを必要とするメインダイナミックメモリに一般的に格納されるスタティックデータ項目を記憶するように提供され得る。このスタティックメモリプールは、サーバシステムの複数のプロセッサによって共有され、メインダイナミックメモリが必要とするのと同じだけの電力を要求することなく、合理的に早い速度でアクセス可能である。スタティックデータ項目を格納するようにメインダイナミックメモリの一部はスタティックメモリプールによって置換えられるため、メインダイナミックメモリのサイズを減らすことが可能である。さらに、シェーダキャッシュは、確実に複数のゲームセッションが望ましい電力とレイテンシ性能でレンダリングされるように、コンパイルされたシェーダの２つ以上のシーケンスを格納する。複数のオンラインゲームセッションはシェーダキャッシュに既に存在するコンパイルされたシェーダのシーケンスのうち１つを用いて処理される一方で、シェーダキャッシュに格納されたコンパイルされたシェーダの異なるシーケンスは、リアルタイム使用統計に基づいて、異なる性能基準を満たすようにダイナミックに生成される。コンパイルされたシェーダのこれらの異なるシーケンスは、複数のオンラインゲームセッションをレンダリングする次のゲームコンテンツのために使用可能である。
【０００５】
本出願のある態様は、サーバシステムの記憶能力を管理する方法であって、サーバシステムは、１つ以上の中央処理装置（ＣＰＵ）と、複数のグラフィックス処理ユニット（ＧＰＵ）と、プログラムの実行中に１つ以上のＣＰＵおよび／または複数のＧＰＵによる使用のためのプログラムおよびデータを格納するメインダイナミックメモリと、不揮発性メモリに格納されたスタティックメモリプールと、スタティックメモリプールを管理するように構成されたメモリコントローラとを含む。複数のＧＰＵの各々は、ローカルキャッシュを含み、メモリコントローラを介してスタティックメモリプールにアクセスするように構成される。方法は、１つ以上のＣＰＵ上でゲームタイトルについて複数のゲームセッションを並行して実行することを含む。複数のゲームセッションの各々は、スタティックデータ項目と関連付けられ、スタティックデータ項目を用いてそれぞれのＧＰＵによって実行可能なグラフィックス処理を必要とする。スタティックデータ項目はスタティックメモリプールに格納される。方法はさらに、１つ以上のＣＰＵ上で実行される複数のゲームセッションのうち第１のゲームセッションについて、グラフィックス処理を第１のＧＰＵに割当てることと、第１のＧＰＵが、スタティックデータ項目の第１のコピーをメモリコントローラにリクエストすることと、スタティックメモリプールから読出されたスタティックデータ項目の第１のコピーをメモリコントローラから受信することと、第１のＧＰＵが、スタティックデータ項目の第１のコピーを用いてグラフィックス処理を実行することと、複数のゲームセッションのうち第１のゲームセッションと関連して、グラフィックス処理の第１の結果をローカルに（たとえば、ローカルキャッシュに、特に第１のＧＰＵのローカルキャッシュに）格納することとを含む。方法はさらに、１つ以上のＣＰＵ上で実行される複数のゲームセッションのうち第２のゲームセッションについて、グラフィックス処理を第２のＧＰＵに割当てることと、第１のＧＰＵが、スタティックデータ項目の第２のコピーをメモリコントローラにリクエストすることと、スタティックメモリプールから読出されたスタティックデータ項目の第２のコピーをメモリコントロールから受信することと、第２のＧＰＵが、スタティックデータ項目の第２のコピーを用いてグラフィックス処理を実行することと、複数のゲームセッションのうち第２のゲームセッションと関連して、グラフィックス処理の第２の結果をローカルに（たとえば、ローカルキャッシュに、特に第２のＧＰＵのローカルキャッシュに）格納することとを含む。
【０００６】
他の態様は、ゲームタイトルをサーバシステムにロードする方法であって、サーバシステムは、１つ以上のＣＰＵと、複数のＧＰＵと、プログラムの実行中に１つ以上のＣＰＵおよび／または複数のＧＰＵによる使用のためのプログラムおよびデータを格納するメインダイナミックメモリと、不揮発性メモリプールに格納されたスタティックメモリプールと、スタティックメモリプールを管理するように構成されたメモリコントローラとを含む。ＧＰＵの各々は、メモリコントローラを介してスタティックメモリプールにアクセスするように構成される。方法は、１つ以上のＣＰＵが、ゲームタイトルに対応する実行可能なゲームプログラムをメインダイナミックメモリにロードすることを含む。１つ以上のＣＰＵは、複数のオンラインゲームセッションを並行して実行するように構成される。複数のゲームセッションの各々は、実行可能なゲームプログラムに対応し、それぞれのオンラインゲームセッションをレンダリングするように割当てられたそれぞれのＧＰＵによって実行可能なグラフィックス処理を必要とする。方法はさらに、１つ以上のＣＰＵが、複数のゲームセッションのグラフィックス処理において使用されるスタティックデータ項目を識別することと、メモリコントローラが、スタティックデータ項目をスタティックメモリプールに格納することと、メモリコントローラが、複数のオンラインゲームセッションを実行している複数のＧＰＵがグラフィックス処理を実行しつつスタティックデータ項目にアクセスすることを可能にすることとを含む。
【０００７】
さらに他の態様では、オンラインゲームセッションのために画像フレームをレンダリングする方法がサーバシステムで実現され、サーバシステムは、１つ以上のＣＰＵと、１つ以上のＧＰＵと、プログラムの実行中に１つ以上のＣＰＵおよび／または１つ以上のＧＰＵによる使用のためのプログラムおよびデータを格納するメインダイナミックメモリと、シェーダキャッシュとを含む。方法は、１つ以上のＣＰＵ上でゲームタイトルについて複数のオンラインゲームセッションを並行して実行することと、１つ以上のＧＰＵが、コンパイルされたシェーダの第１のシーケンスを用いて、複数のオンラインゲームセッションの各々について複数の画像フレームをレンダリングすることとを含む。方法はさらに、複数のオンラインゲームセッションを実行しつつ、ゲームタイトルと関連付けられた複数のオンラインゲームセッションについて性能基準を識別することと、複数のオンラインゲームセッションの各々の実行を特徴付ける使用統計を収集することと、コンパイルされたシェーダの第１のシーケンスの性能を性能基準に関して改良するためにコンパイルされたシェーダの第１のシーケンス内の第１のシェーダを修正して、コンパイルされたシェーダの修正された第１のシーケンスを生成することとを含む。
【０００８】
本出願のいくつかの態様によると、サーバシステムは、サーバシステムに上述の方法のいずれかを実行させるための命令を格納するメモリを含む。
【０００９】
さらに、本出願のいくつかの態様によると、サーバシステムによる実行のために構成された１つ以上のアプリケーションを格納する非一時的なコンピュータ可読記憶媒体は、サーバシステムに上述の方法のいずれかを実行させるための命令を含む。
【００１０】
他の実施形態および利点は、本明細書の説明および図面を考慮して、当業者によって明らかであろう。
【００１１】
さまざまな説明される実現例をより十分理解するために、以下の図面に関連して以下の実現例の説明を参照する必要がある。図面中、同様の参照番号は、図を通して対応する部分を表す。
【００１２】
図面を通じて、同様の参照番号は対応する部分を指す。
【図面の簡単な説明】
【００１３】
【図１】いくつかの実現例に係る、サーバシステムおよび複数のクライアントデバイスを含むオンラインインタラクティブゲーム環境の例を示す図である。
【図２】いくつかの実現例に係る、複数のゲームサーバがサーバシステムのスタティックメモリプールを共有するオンラインインタラクティブゲーム環境の例を示す図である。
【図３Ａ】いくつかの実現例に係る、データをサーバシステムに格納するように構成されたメモリシステムの例を示す図である。
【図３Ｂ】いくつかの実現例に係る、複数のレベルのキャッシュを有する中央処理装置（ＣＰＵ）の例を示す図である。
【図３Ｃ】いくつかの実現例に係る、複数のレベルのキャッシュを有するグラフィックス処理ユニット（ＧＰＵ）の例を示す図である。
【図３Ｄ】いくつかの実現例に係る、サーバシステム内の複数のプロセッサによって共有されるスタティックメモリプールに対する読み書きアクセスを制御するメモリコントローラの例を示す図である。
【図４Ａ】いくつかの実現例に係る、サーバシステム上でゲームタイトルをロードするプロセス中のデータフローの例を示す図である。
【図４Ｂ】いくつかの実現例に係る、サーバシステム上でオンラインゲームセッションを実行するプロセス中のデータフローの例を示す図である。
【図４Ｃ】いくつかの実現例に係る、シェーダ最適化プロセス中のデータフローの例を示す図である。
【図４Ｄ】いくつかの実現例に係る、複数のオンラインゲームセッションが実行されているときのスタティックデータ項目のデータフローの例を示す図である。
【図５Ａ】いくつかの実現例に係る、サーバシステムの例を示すブロック図である。
【図５Ｂ】いくつかの実現例に係る、サーバシステムに格納されたデータを示すブロック図である。
【図６】いくつかの実現例に係る、クライアントデバイス（たとえば、携帯電話、タブレットコンピュータ、ラップトップコンピュータまたはゲームコントローラ）の例を示すブロック図である。
【図７】いくつかの実現例に係る、メディアデバイスの例を示すブロック図である。
【図８Ａ】いくつかの実現例に係る、１つ以上のゲームタイトルをホストするサーバシステムの記憶能力を管理するための方法の例を示すフローチャートである。
【図８Ｂ】いくつかの実現例に係る、１つ以上のゲームタイトルをホストするサーバシステムの記憶能力を管理するための方法の例を示すフローチャートである。
【図９】いくつかの実現例に係る、ゲームタイトルをサーバシステムにロードするための方法の例を示すフローチャートである。
【図１０】いくつかの実現例に係る、サーバシステムでゲームレンダリングと同時にパイプラインされたシェーダを最適化するプロセスの例を示す図である。
【図１１Ａ】いくつかの実現例に係る、コンパイルされたシェーダのシーケンスを最適化するプロセスの例を示す図である。
【図１１Ｂ】いくつかの実現例に係る、コンパイルされたシェーダの複数のシーケンスを複数の性能基準と関連付けるシェーダハッシュテーブルを示す図である。
【図１１Ｃ】いくつかの実現例に係る、コンパイルされたシェーダのシーケンスの複数のバージョンを複数のユーザ入力と関連付けるシェーダハッシュテーブルを示す図である。
【図１２】いくつかの実現例に係る、複数のオンラインゲームセッションのために画像フレームをレンダリングする方法（たとえば、画像レンダリングのバックグラウンドでパイプラインされたシェーダの最適化を含む）の例を示すフローチャートである。
【発明を実施するための形態】
【００１４】
実現例の説明
ここで、実現例が詳細に参照され、それらの例が添付の図面に示される。以下の詳細な説明では、記載されているさまざまな実現例の徹底した理解を提供するために、多数の具体的な詳細が説明されている。しかしながら、記載されたさまざまな実現例がこれらの具体的な詳細がなくても実施されてよいことは、当業者にとって明らかであろう。他の例では、これらの実現例の態様を不必要に曖昧にしないように、よく知られている方法、プロシージャ、コンポーネント、回路、およびネットワークは詳細には記載されていない。
【００１５】
本明細書に記載される実現例は、効率的で携帯可能であり、レイテンシが低く、インタラクティブなゲーム体験を分散したゲームプレーヤのコミュニティのために提供することに向けられている。いくつかの実現例では、クラウドゲームハードウェアリソース（たとえば、ＧＰＵおよびエンコーダ）がダイナミックに割当てられ、個々のエンドユーザが利用可能なネットワーク帯域幅が監視および利用されて、多数のゲームプレーヤに同時に最適なオンラインゲーム体験が提供される。いくつかの実現例では、オンラインゲーム体験を効率的に提供するために、クラウドゲームストレージリソースが管理される。たとえば、ゲームサーバシステムは、ゲームコンテンツレンダリングで使用されるスタティックデータ項目を格納するためのスタティックゲーム格納リソースのレベルを追加して、消費電力が比較的大きいダイナミックメモリの需要を低減可能である。いくつかの実現例では、コンパイルされたシーケンスがダイナミックに最適化されて複数のオンラインゲームセッションのリアルタイム使用統計量に従って１つ以上の性能基準が満たされる一方で、コンパイルされたシェーダはフォアグラウンドで使用されて、これらのオンラインゲームセッションのためにゲームコンテンツをレンダリングする。
【００１６】
具体的には、いくつかの実現例では、サーバシステムは、１つ以上のＣＰＵと、複数のＧＰＵと、プログラムの実行中にＣＰＵおよび／またはＧＰＵによる使用のためのプログラムおよびデータを格納するメインダイナミックメモリとを備える。複数のＧＰＵの各々は、ローカルキャッシュを含む。不揮発性メモリに格納されたスタティックメモリプールは、サーバシステムに追加される。サーバシステムのメモリコントローラは、スタティックメモリプールを管理するように、たとえば、スタティックメモリプールに対する読出しアクセス／書込みアクセスを複数のＧＰＵの各々に提供するように構成される。一例では、メインダイナミックメモリは、常にリフレッシュが必要なダイナミックランダムアクセスメモリ（ＤＲＡＭ）であり、スタティックメモリプールは、電源に接続されている限りリフレッシュを必要としない相変化ランダムアクセスメモリ（ＰＲＡＭ）である。
【００１７】
サーバシステムは、ゲームタイトルについて、１つ以上のＣＰＵ上で並行して複数のゲームセッションを実行する。複数のゲームセッションの各々は、スタティックデータ項目と関連付けられ、スタティックデータ項目を用いてそれぞれのＧＰＵによって実行可能なグラフィックス処理（たとえば、オープングラフィックスライブラリ（ＯｐｅｎＧＬ）レンダリングパイプラインでの頂点処理、テッセレーションおよびプリミティブアセンブリ）を必要とする。スタティックデータ項目は、スタティックメモリプールに格納される。複数のゲームセッションの各々を実行するために、ＣＰＵは、グラフィックス処理をそれぞれのＧＰＵに割当て、それぞれのＧＰＵは、グラフィックス処理を実行する目的でメモリコントローラにスタティックデータ項目のコピーを要求する。それぞれのＧＰＵは、スタティックメモリプールから読出されたスタティックデータ項目のコピーをメモリコントローラから受信し、スタティックデータ項目のコピーを用いてグラフィックス処理を行う。グラフィックス処理の結果が、複数のゲームセッションのそれぞれ１つと関連して（たとえば、ローカルキャッシュまたはメインダイナミックメモリに）ローカルに格納される。
【００１８】
いくつかの実現例では、ＣＰＵがゲームタイトルに対応する実行可能なゲームプログラム（たとえば、サーバ側ゲームモジュール）をメインダイナミックメモリにロードすると、スタティックメモリプールに格納されたスタティックデータ項目が、スタティックメモリプールにロードされる。具体的には、ＣＰＵは、スタティックデータ項目がグラフィックス処理で使用されると判断し、メモリコントローラを制御して、スタティックデータ項目をスタティックメモリプールに格納する。スタティックデータ項目は場合によっては、サーバシステムのローカルハードドライブから抽出される、またはリモートライブラリサーバから受信される。スタティックデータ項目がスタティックメモリプールに格納されると、スタティックデータ項目は、メインダイナミックメモリに格納される必要がなくなり、そのため、メインダイナミックメモリは、サーバシステム内のＣＰＵおよびＧＰＵの計算性能を損なうことなくサイズおよび消費電力を減らすことによって、効率を改善することができる。
【００１９】
いくつかの実現例では、サーバシステムは、１つ以上のＣＰＵと、１つ以上のＧＰＵと、プログラムの実行中にＣＰＵおよび／またはＧＰＵによる使用のためのプログラムおよびデータを格納するメインダイナミックメモリと、シェーダキャッシュを備える。サーバシステムは、ＣＰＵ上でゲームタイトルについて複数のオンラインゲームセッションを並行して実行し、１つ以上のＧＰＵは、コンパイルされたシェーダの第１のシーケンスを用いて、複数のオンラインゲームセッションの各々について複数の画像フレームをレンダリングする。サーバシステムは、フォアグラウンドで複数のオンラインゲームセッションを実行しつつ、バックグラウンドでは、ゲームタイトルと関連付けられた複数のオンラインゲームセッションについて（たとえば、電力使用量およびゲームレイテンシに関する）性能基準を識別し、オンラインゲームセッションの各々の実行を特徴付ける使用統計（たとえば、ユーザ入力、電力使用量およびゲームレイテンシ）を収集する。サーバシステムは、コンパイルされたシェーダの第１のシーケンスの性能を性能基準に関して改良するためにコンパイルされたシェーダの第１のシーケンス内の第１のシェーダを修正して、コンパイルされたシェーダの修正された第１のシーケンスを生成する。必要に応じて、コンパイルされたシェーダの修正された第１のシーケンスは、コンパイルされたシェーダの別のシーケンスとして、コンパイルされたシェーダの第１のシーケンスの新しいバージョンとして、またはコンパイルされたシェーダの第１のシーケンスの代わりに格納される。コンパイルされたシェーダの修正された第１のシーケンスは、複数のオンラインゲームセッションについて画像フレームのレンダリングを行い、かつ、これらのオンラインゲームセッションの性能基準と関連付けられた性能を改良するために連続して使用可能である。これらの手段によって、コンパイルされたシェーダは、オンラインゲームセッションのリアルタイム使用統計に基づいて、オンラインゲームセッションの実行を中断することなく、ダイナミックに最適化される。
【００２０】
ゲームタイトルの複数のゲームセッションをホストするゲーム環境
図１は、複数の実現例に係るオンラインインタラクティブゲーム環境１００の例を示す図である。オンラインインタラクティブゲーム環境１００は、１つ以上のクライアントデバイス（たとえば、クライアントデバイス１０２および１０４）を含む。クライアントデバイス１０２の各々は、１つ以上のゲームアプリケーションを実行する。オンラインゲームセッションは、起動され、特定のゲームアプリケーションで実行されて、クライアントデバイス１０２のユーザに、サーバシステム１１４によってホストされるオンラインインタラクティブゲーム（「ゲームタイトル」とも呼ばれる）をプレーさせることができる。いくつかの実現例では、クライアントデバイス１０２（たとえば、ホストクライアント）は、オンラインインタラクティブゲームのゲームシーンに加わるよう１つ以上の他のクライアントデバイス１０２を招待するように構成される。これらのクライアントデバイス１０２のゲームセッションは、オンラインインタラクティブゲームの同じゲームシーンを表示するように同期されており、必要に応じて、別個の視点がそれぞれのユーザに対応している。
【００２１】
逆に、サーバシステム１１４は、オンラインインタラクティブゲームプラットフォームをホストして、クライアントデバイス１０２が特定のゲームアプリケーションを含む１つ以上のゲームアプリケーションをプレーするのをサポートする。具体的には、サーバシステム１１４は、クライアントデバイス１０２と関連付けられた複数のユーザアカウントを備え、１つ以上のゲームアプリケーションの各々と関連してクライアントデバイス１０２のユーザを認証する。サーバシステム１１４は、ゲームタイトルのシーンと関連付けられた対応するゲームセッションに参加するクライアントデバイス１０２上で、このシーンのレンダリングおよびリフレッシュを行う。いくつかの実現例では、サーバシステム１１４は、クライアントデバイス１０２の能力および／またはサーバシステム１１４とクライアントデバイス１０２の各々との間の通信接続の質を評価可能であり、適応的に、クライアントデバイス１０２と関連付けられたゲームセッションについて同時データストリームを生成する。これらの手段によって、サーバシステム１１４は、同時に実質的に低いレイテンシで、２つ以上のクライアントデバイス１０２上でオンラインインタラクティブゲームの同時ゲームセッションを容易にするように構成される。
【００２２】
いくつかの実現例では、クライアントデバイス１０２は、それぞれのオンラインゲームセッションと関連付けられたメディアコンテンツを表示するための、内部に一体化された表示スクリーンを有する。いくつかの実現例では、クライアントデバイス１０２は、メディアデバイス１０６および出力デバイス１０８に接続される。具体的には、クライアントデバイス１０２は、メディアデバイス１０６に直接（たとえば、電線を介して、Ｂｌｕｅｔｏｏｔｈ（登録商標）もしくは他の無線通信リンクを介して）、ローカルネットワーク１１０（たとえば、Ｗｉ−Ｆｉネットワーク）を介して、または１つ以上の通信ネットワーク１１２を介して、通信可能に接続される。いくつかの実現例では、クライアントデバイス１０２とメディアデバイス１０６とは、（たとえば、同じ部屋で、同じ家で、など）互いにローカルである。メディアデバイス１０６はさらに、ビジュアルおよび／または音声コンテンツを出力可能な１つ以上の出力デバイス１０８（たとえば、テレビ、表示モニタ、サウンドシステム、スピーカなど）に接続される。メディアデバイス１０６は、出力デバイス１０８（複数可）にコンテンツを出力するように構成される。いくつかの実現例では、メディアデバイス１０６は、キャスティングデバイス（たとえば、Ｇｏｏｇｌｅ社のＣＨＲＯＭＥＣＡＳＴ（登録商標））、または他の態様ではキャスティング機能を含むデバイスである。たとえば、ゲームコンテンツがサーバシステム１１６によってクライアントデバイスにおいてユーザ入力に応答してレンダリングされる場合、クライアントデバイス１０２は、メディアデバイス１０６を制御して、ゲームコンテンツを通信ネットワーク１１２を介してサーバシステム１１６から受信し、受信したゲームコンテンツを出力デバイス１０８にキャストする。
【００２３】
いくつかの実現例では、サーバシステム１１４は、ゲームサーバ１０８およびメディアストリーミングサーバ１２０を備える。ゲームサーバ１１８は、第１のクライアントデバイス１０２Ａ上で実行されているオンラインインタラクティブゲームセッションについて、２つ以上のメディアストリーム１３０および１３２を同時に提供するように構成される。２つ以上のメディアストリームはそれぞれ、第１のクライアントデバイス１０２Ａおよびレビュアークライアントデバイス１０４に１つ以上の通信ネットワーク１１２を介して提供される低レイテンシストリーム１３０および標準レイテンシストリームを含む。必要であれば、標準レイテンシストリーム１３２は、教育目的で提供される。第１のクライアントデバイス１０２Ａのユーザがゲームセッションを第１のクライアントデバイス１０２Ａでプレーする一方で、ゲームセッションは、記録され、標準レイテンシストリーム１３２を介して一人以上の観客に対してブロードキャストされる、すなわち、観客は、レビュアークライアントデバイス１０４上でゲームセッションのレビューが可能である。低レイテンシストリーム１３０は、オンラインインタラクティブゲームセッションのゲームプレーに対応し、関連付けられたレビューセッションに対応する標準レイテンシストリーム１３２と比較して早い反応速度および遅い送信レイテンシを有する。必要であれば、レビュアークライアントデバイス１０４は、クライアントデバイス１０２と同じ会場に位置する。必要であれば、レビュアーデバイスは、クライアントデバイス１０２から離れている。いくつかの実現例では、レビュアークライアントデバイス１０４は、必要であれば一体化されたディスプレーまたは外部ディスプレーを有するクライアントデバイス１０２Ａのような、他のクライアントデバイスである。いくつかの実現例では、レビュアークライアントデバイス１０４は、ビジュアルおよび／または音声コンテンツを出力可能な１つ以上の出力デバイス１０８に接続されたメディアデバイス１０６（たとえば、キャスティング機能を有するデバイス）である。いくつかの実現例では、低レイテンシストリームと標準レイテンシストリームとの両方は、同じ出力デバイスのスクリーン上に表示される。
【００２４】
各クライアントデバイス１０２は、中央サーバまたはクラウドコンピューティングシステム（たとえば、サーバシステム１１４）、および／またはネットワーク接続された他のデバイス（たとえば、他のクライアントデバイス１０２、レビュアークライアントデバイス１０４、メディアデバイス１０６および出力デバイス１０８）とのデータ通信及び情報共有が可能である。データ通信は、さまざまなカスタムまたは標準無線プロトコール（たとえば、ＩＥＥＥ  ８０２．１５．４、Ｗｉ−Ｆｉ、ＺｉｇＢｅｅ、６ＬｏＷＰＡＮ、Ｔｈｒｅａｄ、Ｚ−Ｗａｖｅ、Ｂｌｕｅｔｏｏｔｈ  Ｓｍａｒｔ、ＩＳＡ１００．１１ａ、ＷｉｒｅｌｅｓｓＨＡＲＴ、ＭｉＷｉなど）のいずれか、および／またはさまざまなカスタムもしくは標準有線プロトコール（たとえば、Ｅｔｈｅｒｎｅｔ（登録商標）、ＨｏｍｅＰｌｕｇなど）のいずれか、または、本特許出願日においてまだ開発されていない通信プロトコールを含む他の好適な通信プロトコールを用いて実行され得る。いくつかの実施形態では、オンラインインタラクティブゲーム環境１００は、クライアントデバイス１０２のセットおよびそれらの対応するメディアデバイスおよび出力デバイス（設けられている場合）がそれを介してローカルエリアネットワーク上で互いに通信可能に接続される従来のネットワークデバイス（たとえば、ルータ（図１には図示されていない））を含む。ローカルエリアネットワークは、通信ネットワーク１１２（たとえば、ワイドエリアネットワークおよびインターネット）の他の部分に通信可能に接続される。いくつかの実施形態では、クライアントデバイス１０２の各々は必要であれば、１つ以上の無線通信ネットワーク（たとえば、ＺｉｇＢｅｅ、Ｚ−Ｗａｖｅ、Ｉｎｓｔｅｏｎ、Ｂｌｕｅｔｏｏｔｈ、Ｗｉ−Ｆｉ、および／または他の無線通信ネットワーク）を用いて、１つ以上の他のクライアントデバイス１０２もしくは１０４、それぞれのメディアデバイス１０６、またはそれぞれの出力デバイス１０８と通信する。
【００２５】
いくつかの実現例では、クライアントデバイス１０２は互いに離れている、すなわち、同じ場所内にまたは構造物内にさえ位置していない。ゲームタイトルは、各クライアントデバイス１０２における実行のためにゲームアプリケーション（たとえば、ゲームアプリケーション６２９、図６）を起動することによって、クライアントデバイス１０２上で開始可能である。いくつかの実現例では、クライアントデバイス１０２毎に、ゲームアプリケーションは、サーバシステム１１４とのオンラインゲームセッション１１６を個別に確立する。２つ以上のクライアントデバイス１０２（たとえば、１０２Ａおよび１０２Ｂ）のオンラインゲームセッション１１６は、（たとえば、ゲームタイトルの同じゲームドメインにおいてプレーされるため）互いに関連しており、そのため、ゲームアプリケーション内のゲームシーンを共有する。関連するオンラインゲームセッション１１６は互いに同期されており、各オンラインゲームセッション１１６は必要であれば、それぞれのクライアントデバイス１０２に対応する唯一のプレーヤの視点を有する同じゲームシーンを示す。各クライアントデバイス１０２のユーザはそのため、それぞれのクライアントデバイス上でゲームをプレーすることができ、オンラインゲームセッション１１６からの出力の影響を他のクライアントデバイス１０２（複数可）に及ぼすことができる。たとえば、いくつかの実現例では、ゲームアプリケーション５２８は、同時に同じゲームをプレーしているユーザの間で矛盾のないゲーム状態を維持するように構成される。いくつかの実現例では、サーバシステム１１４およびゲームアプリケーション５２８は、ユーザの個々のゲームプレー状態およびビューに特有のシーンのレンダリングされたビューをもたらし得るゲームをプレーしている各ユーザのために、個々のセッションを維持するが、これらのセッションの各々は、同じゲームをプレーし、かつ、同じシーンにインタラクトしこれを眺めているユーザの他のセッションと一致している。
【００２６】
代替的に、他の実現例では、第１のクライアントデバイス１０２Ａのゲームアプリケーションがオンラインゲームセッション１１６Ａを確立した後で、１つ以上の第２のクライアントデバイス１０２Ｂが招待メッセージによってオンラインゲームセッション１１６Ａに参加するように招待され、たとえば、オンラインゲームセッション１１６Ａに参加するためのリンク（たとえば、ＵＲＬアドレス）を有するメッセージが、第２のクライアントデバイス１０２Ｂの各々に送信される。適切なコントローラ構成が、オンラインゲームセッション１１６Ａに参加するように招待された各第２のクライアントデバイス１０２Ｂに提供される。本出願では、第２のクライアント１０２Ｂがオンラインゲームセッション１１６Ａに参加すると、サーバシステム１１４は、個別の第２のクライアントデバイス１０２Ｂために別個のゲームセッション１１６Ｂを生成する。それぞれの第２のクライアントデバイス１０２の各別個のゲームセッション１１６Ｂは、第１のクライアントデバイス１０２Ａのゲームセッション１１６Ａと同期しており、これと同じシーンを共有するが、それぞれの第２のクライアントデバイス１０２Ｂに対応する唯一のプレーヤの視点を有し得る。各第２のクライアントデバイス１０２Ｂが適切なコントローラ構成を受信しオンラインゲームセッション１１６Ａに参加すると（より正確には、その関連するオンラインゲームセッション１１６Ｂを開始すると）、ユーザは、それぞれの第２のクライアントデバイス１０２Ｂ上でゲームをプレーし、他のクライアントデバイス１０２（複数可）で実行されているオンラインゲームセッション１１６の出力に影響を及ぼすことができる。
【００２７】
クライアントデバイス１０２は、ゲームアプリケーションを含む１つ以上の別個のユーザアプリケーションを含み、これを実行可能なデバイスである。いくつかの実現例では、クライアントデバイス１０２は、スマートフォン、タブレットデバイス、ラップトップコンピュータ、デスクトップコンピュータ、マルチメディアデバイスまたはリモートコントローラである。いくつかの実現例では、クライアントデバイス１０２は、専用ゲームコントローラデバイス（たとえば、ゲームコントローラ１０２Ｂ）を含む。いくつかの実現例では、クライアントデバイス１０２は、メディアデバイス１０６と連動して動作するように構成された１つ以上のユーザアプリケーションを含む。いくつかの実現例では、アプリケーションは、クライアントデバイス１０２をメディアデバイス１０６とペアリングし、メディアデバイス１０６を構成するためのメディアデバイスアプリケーションを含む。また、アプリケーションは、関連付けられたコンテンツをメディアデバイス１０６にキャスト可能な１つ以上のアプリケーションを含む。いくつかの実現例では、アプリケーションは、データ／コンテンツを直接メディアデバイス１０６に（たとえば、ローカルネットワークを介して）送信することによって、および／または、メディアデバイス１０６がそれからデータ／コンテンツをストリーミング、もしくは他の態様では受信可能なリモートロケーション（たとえば、ＵＲＬまたはサーバシステム１１６もしくはゲームコンテンツホストにおける記憶場所へのリンク）にメディアデバイス１０６を向けることによって、データおよび／またはコンテンツをメディアデバイス１０６にキャストする。メディアデバイス１０６は、アプリケーションおよび／またはリモートロケーションからデータ／コンテンツを受信し、受信したデータ／コンテンツに対応するビジュアルおよび／または音声コンテンツを、出力デバイス１０８に出力する。そのため、オンラインゲームセッション１１６は、クライアントデバイス１０２上で実行されているゲームアプリケーション、リモートサーバシステム１１４、およびメディアデバイス１０６間で確立される。
【００２８】
いくつかの実現例では、関連するオンラインゲームセッション１１６をリンクさせるプロセスの一部として、サーバシステム１１４は、対応するクライアントデバイス１０２の各々の能力、および／またはサーバシステム１１４とクライアントデバイス１０２との間の通信接続の質を評価する。いくつかの実現例では、サーバシステム１１４は、クライアントデバイス１０２とサーバシステム１１４との間のネットワークレイテンシを計測する。計測されたレイテンシが閾値を上回り低レイテンシ接続が利用可能な場合、サーバシステム１１４は、クライアントデバイス１０２に低レイテンシ接続に変更するように提案可能である、または、クライアントデバイス１０２を低レイテンシ接続に変更するようにクライアントデバイス１０２のユーザを勧誘可能である。たとえば、クライアントデバイス１０２がセルラー無線接続されていて、ローカルエリアネットワークが利用可能である場合、サーバシステム１１４は、クライアントデバイス１０２が利用可能なローカルネットワークを通じて接続するように提案可能である。いくつかの実現例では、レイテンシ閾値要件はゲーム間で異なる。たとえば、低レイテンシ接続で最良に体験されるゲーム（たとえば、アクションゲーム）もあれば、レイテンシに関して要求がそれほど厳しくない他のゲーム（たとえば、オンラインボードゲームまたはカードゲーム）もある。サーバシステム１１４は、異なる種類のゲームと関連付けられたこれらの異なる要件を考慮して、接続を推奨し得る。
【００２９】
ゲームセッション１１６を始める、またはこれに参加するクライアントデバイス１０２の一部として、サーバシステム１１４は、クライアントデバイス１０２と通信して、クライアントデバイス１０２上にコントローラをセットアップする。いくつかの実現例では、これは、クライアントデバイス１０２がコントローラに必要とされるリソースおよび通信能力を有しているかどうかをサーバシステム１１４が評価することを含む。クライアントデバイス１０２において利用可能なリソース、接続の質、およびゲーム要件によって、コントローラは、クライアントデバイス１０２において異なる態様で実現され得る。いくつかの実現例では、ゲームタイトルは、ウェブページベースのコントローラインターフェースでプレー可能である。たとえば、ゲームのためのコントローラインターフェースはウェブページ内に埋込まれてもよく、ウェブページは、クライアントデバイス１０２上のウェブブラウザでレンダリングされる。代替的にいくつかの実現例では、標準化されたコントローラが、ゲームに特有でないまたはゲームと直接関連付けられていない事前に定義されたアプリケーション（たとえば、ＣＨＲＯＭＥＣＡＳＴまたはＧｏｏｇｌｅ社のＧＯＯＧＬＥ  ＣＡＳＴ、もしくは他のメディアデバイスアプリケーション）において、またはクライアントデバイス１０２のオペレーティングシステムにおいて実現される。たとえば、クライアントデバイス１０２上のデバイスオペレーティングシステムまたは所定のアプリケーションは、コントローラサブモジュールを有し得る。コントローラサブモジュールは、１つ以上の標準化されたコントローラ構成、テンプレートなどを含む。標準化されたコントローラ構成の各々は、コントローラサブモジュールを、ある方法でクライアントデバイス１０２上の入力デバイスおよび／またはセンサを利用するように構成して、バーチャルコントローラを実現する。使用される標準化されたコントローラ構成は、ゲームによっておよび／またはクライアントデバイスの種類に応じて異なり得る。
【００３０】
さらにいくつかの実現例では、ゲームは、コントローラサブモジュールで実現され得る特定のコントローラ構成を有する。そのような構成は、オンラインゲームセッション１１６に参加するまたはこれを始めるクライアントデバイス１０２のプロセスの一部として、サーバシステム１１４において格納されてもよい、および、クライアントデバイス１０２に送信されてもよい。いくつかの実現例では、特定のコントローラ構成は、完全なカスタムコントローラ、または標準化されたコントローラとカスタムコントローラとの組合せでもよい。さらにいくつかの実現例では、ゲームは、当該ゲームと関連付けられた特定のアプリケーションを必要とする。たとえば、ゲームは、当該ゲームと特別に関連付けられたコントローラアプリケーションを必要とし得る。いくつかの実現例では、クライアントデバイス１０２は、セッション１１６を始めるまたはこれに参加する一部として、特定のアプリケーションまたは所定のアプリケーションをダウンロードするように向けられてもよい。たとえば、クライアントデバイス１０２が（コントローラサブモジュールを有する）事前に定義されたアプリケーションまたはゲームと関連付けられた特定のアプリケーションを既に有しておらず、そのようなアプリケーションがプレーのために必要とされる場合、サーバシステム１１４は、クライアントデバイス１０２に、ユーザにダウンロードが必要であると促し、かつ、ユーザに処理の許可を求めるように指示する。
【００３１】
サーバシステム１１４はさらに、データベース１６０を備える。データベース１６は少なくとも、サーバシステム１１４上でホストされる１つ以上のゲームアプリケーション（たとえば、ゲームアプリケーション６２９、図６）の各々のユーザアカウントと関連付けられたユーザ情報を格納する。ユーザ情報の例は、ユーザアカウント情報（たとえば、本人確認およびパスワード）、会員の種類、プリファレンス、および活動履歴を含むが、これらに限定されない。いくつかの実現例では、データベース１６０は、クライアントデバイス１０２上でプレーされるオンラインゲームセッションと関連付けられたセッションデータを格納する。各オンラインゲームセッション１１６のためのセッションデータの例は、フレームレート、レンダリング仕様、標準レイテンシ要件、ＧＰＵ割当て情報、エンコーダ割当て情報、関連セッション識別、シェーダパイプライン識別、および最新状態情報を含むが、これらに限定されない。セッションデータは、ユーザ情報よりも頻繁にアクセスされる。いくつかの実現例では、ユーザ情報およびセッションデータを格納するメモリはそれぞれ、フラッシュメモリおよびランダムアクセスメモリ（ＲＡＭ）で構成される。いくつかの実現例では、ユーザ情報およびセッションデータのサブセットが、それぞれのゲームタイトルに対応する各ゲームサーバ１１８に格納される。
【００３２】
サーバシステム１１４は、１つ以上のゲームサーバ１１８、メディアストリーミングサーバ１２０、ゲームライブラリサーバ１２２、シェーダライブラリサーバ１２４およびパイプラインオプティマイザサーバ１５０のうち１つ以上を備える。ゲームサーバ１１８または代替的なフロントエンドサーバ（図１には図示せず）は、クライアントデバイス１０２および１０４と関連付けられたユーザアカウント、たとえば、ユーザアカウントによる１つ以上のオンラインインタラクティブゲームの会員登録を管理する。クライアントデバイス１０２がそれぞれのユーザアカウントにログオンし、オンラインゲームセッション１１６を開始すると／オンラインゲームセッション１１６に参加すると、ゲームサーバ１１８は、ゲームセッション１１６をセットアップするだけでなく、コンテンツサーバ（図示せず）からゲームコンテンツを取得し、クライアントデバイス１０２または指定されたメディアデバイス１０４上で実行されるゲームアプリケーションにゲームコンテンツを送信し、ユーザリクエストまたはアクションを識別し、ユーザリクエストまたはアクションに応答してクライアントデバイス１０２またはメディアデバイス１０４のためにゲームプレー出力をレンダリングし、および、それぞれのゲームセッション１１６中にゲーム状態データを格納することによって、それぞれのクライアントデバイス１０２について各特定のゲームセッションを管理する。
【００３３】
いくつかの実現例では、ゲームサーバ１１８は、クラウドゲームハードウェアリソース（たとえば、ＧＰＵ１４０およびエンコーダ１４２）をダイナミックに割当て、個別のエンドユーザが利用可能なネットワーク帯域幅を監視および利用して、最適なクラウドゲーム体験を提供する。いくつかの実現例では、ゲームサーバ１１８は複数の性能階層を提供し、これらの性能階層は、高解像度ビデオ／メディアストリームを有する高性能のリアルタイムゲームセッションをサポートする階層と、ほぼレイテンシがない状態で１つ以上の実際のゲームストリームに対応するレビューメディアストリームをサポートする他の階層とを含む。必要であれば、そのようなレビューメディアストリームは、ＹｏｕＴｕｂｅ（登録商標）などのメディアストリーミングサイトを介して一人以上のユーザに提供され、メディアストリーミングサイトは必要であれば、メディアストリーミングサーバ１２０によって管理される。
【００３４】
いくつかの実現例によると、ゲームサーバ１１８は、第三者のゲームコンテンツを提供するゲームコンテンツホスト（図１では図示せず）に接続される。第三者のゲームコンテンツの例は、スポーツゲーム、レースゲーム、ロールプレーゲーム（ＲＰＧ）および一人称シューティング（ＦＰＳ）ゲームを含むが、これらに限定されない。これらのゲームの異なる例は、異なる関連付けられたレイテンシ要件および予想、出力ビデオ解像度、ならびにゲームサーバ計算作業負荷およびビデオ符号化／ストリーミングリソース、ならびにネットワーク帯域幅に基づいて、（たとえば、いくつかの例では異なる登録性能階層と一致する最適なユーザゲーム体験を確実なものにするために）大きく異なるクラウドハードウェア要件およびネットワークを有し得る。
【００３５】
説明したように、サーバシステム１１４は、１つ以上のゲームタイトルをホストし、ただ１つのゲームタイトルの複数のオンラインゲームセッションを実行して複数のクライアントデバイス上で同時ゲームプレーをサポートするように構成される。１つ以上のゲームタイトルの各々は、いずれかのオンラインゲームセッションをサポートするために実行される前に、ゲームサーバ１１８にロードされる。ゲームライブラリサーバ１２２は、ゲームサーバ１１８に接続され、実行可能なゲームプログラム（たとえば、図５Ａのサーバ側ゲームモジュール５２６）および実行可能なゲームプログラムの実行に必要なスタティックデータ項目を提供するように構成される。実行可能なゲームプログラムは、ゲームサーバ１１８にロードされると、ＣＰＵによって実行されて、ＧＰＵに、１つ以上の画像レンダリングプログラム（たとえば、シェーダプログラム）を用いて複数のオンラインゲームセッションの各々について複数の画像フレームを生成するように指示する。シェーダライブラリサーバ１２４は、ゲームサーバ１１８に接続され、異なるゲームタイトルによって必要とされると標準シェーダプログラムを提供するように構成される。シェーダプログラムがゲームタイトルによる使用のために選択される場合、それは、各オンラインゲームセッションについて複数の画像フレームをレンダリングするための使用のために、シェーダライブラリサーバ１２４から取出され、ゲームサーバ１１８によってコンパイルされ、ゲームサーバ１１８にローカルに格納される。いくつかの実現例では、オンラインゲームセッションの各画像フレームは、（たとえば、頂点シェーダ、テッセレーションシェーダ、幾何学シェーダおよびフラグメントシェーダを含む）コンパイルされたシェーダの順序シーケンスによってレンダリングされ、これらのコンパイルされたシェーダの各々は、それぞれの画像フレームを作成する過程において１つ以上の特定の画像レンダリング処理を実行する。
【００３６】
図２は、いくつかの実現例に係る、複数のゲームサーバ１１８がサーバシステム１１４内のスタティックメモリプール２０２を共有するオンラインインタラクティブゲーム環境２００の例を示す図である。サーバシステム１１４は、複数のゲームサーバ１１８、メディアストリーミングサーバ１２０、ゲームライブラリサーバ１２２およびシェーダライブラリサーバ１２４のうち１つ以上を備え、１つ以上のゲームタイトルをホストするように構成される。そうは言っても、サーバシステム１１４は、１つ以上の通信ネットワーク１１２によって複数のクライアントデバイス１０２に通信可能に接続され、ゲームタイトルに対応する複数のオンラインゲームセッションを並行して実行して、複数のクライアントデバイス１０２の各々を、それぞれのオンラインゲームセッションを介してそのゲームタイトルでゲームプレーに参加させる。ゲームサーバ１１８は、複数のクライアントデバイス１０２からセッションリクエストを受信し、それに応じて、オンラインゲームセッションを開始し、これらに参加し、またはこれらを終了する。各セッションリクエストに応答して、ゲームサーバ１１８のうち１つが、対応するオンラインゲームセッションを実行するように割当てられる。各オンラインゲームセッションの実行の過程において、それぞれのオンラインゲームセッションを実行するように割当てられたゲームサーバ１１８は、オンラインゲームセッションをリクエストしたクライアントデバイスのために複数の画像フレーム（すなわち、セッションデータストリーム）をレンダリングする。状況によっては、複数の画像フレームは、ゲームタイトルのシーンを共有するオンラインゲームセッションのサブセットのうちいずれかからのユーザ入力（すなわち、ジャンプ、シューティング、回転するコマンド）の受信に応答してレンダリングされる。必要であれば、ゲームサーバ１１８はまた、レビューメディアストリームを生成し、これを直接またはメディアストリーミングサーバ１２０を介して間接的に、リアルタイムでゲームプレーをレビューしたい観客に提供する。
【００３７】
各ゲームサーバ１１８は、１つ以上の処理ユニット（たとえば、ＣＰＵ１３８、ＧＰＵ１４０およびエンコーダ１４２）、メインダイナミックメモリ１４４、および１つ以上のローカルキャッシュ１４６を含む。メインダイナミックメモリ１４４は、プログラムの実行中にＣＰＵ１３８およびＧＰＵによる使用のためのプログラムおよびデータを格納するように構成される。必要であれば、各ゲームサーバ１１８は、それ自体のメインダイナミックメモリ１４４を有する。必要であれば、ゲームサーバ１１８のサブセットまたは全ては、メインダイナミックメモリ１４４を共有する。ローカルキャッシュ１４６は、データ、たとえば、頂点後処理が終了しＧＰＵ１４０でのプリミティブアセンブリを待つメディアコンテンツ、ＧＰＵ１４０によって生成されさらに符号化されるためにエンコーダ１４２に提供されるメディアコンテンツを一時的に格納するように構成される。
【００３８】
いくつかの実現例では、サーバシステム１１４はさらに、メインメモリ１４４およびキャッシュ１４６に加えて、スタティックメモリプール２０２を備える。スタティックメモリプール２０２は、ゲームサーバ１１８（たとえば、１１８−１、１１８−２〜１１８−Ｎ）のサブセットまたは全ての間でシェアされ、同じゲームタイトルの複数のオンラインゲームセッションにおいて使用される１つ以上のスタティックデータ項目を格納するように構成される。サーバシステム１１４はさらに、スタティックメモリプール２０２を管理するように構成されたメモリコントローラ２０４を備える。いくつかの実現例では、複数のゲームセッションの各々は、特定のスタティックデータ項目と関連付けられ、特定のスタティックデータ項目を用いてそれぞれのＧＰＵ１４０によって実行可能な特定のグラフィックス処理を必要とし、特定のスタティックデータ項目は、スタティックメモリプール２０２に格納される。それぞれのＧＰＵ１４０は、特定のスタティックデータ項目を抽出するために、メモリコントローラ２０４を介してスタティックメモリプール２０２にアクセスするように構成される。
【００３９】
なお、いくつかの実現例では、スタティックメモリプール２０２に格納されたスタティックデータ項目は、メインダイナミックメモリ１４４に格納可能である。メインダイナミックメモリ１４４は、スタティックメモリプール２０２と比較して早いレートでＧＰＵによってアクセスされる。しかしながら、メインダイナミックメモリ１４４は、メモリからの電荷漏洩を補償するために数ミリ秒毎にリフレッシュを必要とする、または新しい電子電荷を必要とするため、電力性能においては効率的ではない。スタティックデータ項目がスタティックメモリプール２０２に移動される場合、ゲームサーバ１１８内のメインダイナミックメモリ１４４の一部が解放され、より多くのプログラムおよびダイナミックデータを格納するために使用可能になる、または、消費電力を低減するためにより小さなメインダイナミックメモリ１４４を使用可能になる。
【００４０】
サーバシステム１１４は、ローカルキャッシュ１４６、メインダイナミックメモリ１４４およびスタティックメモリプール２０２を含むマルチレベルストレージ方式を有する。ローカルキャッシュ１４６は、少なくとも１つのキャッシュレベル（たとえば、Ｌ１、Ｌ２）を含む。メインダイナミックメモリ１４４およびスタティックメモリプール２０２と比べて、ローカルキャッシュ１４６は、より小さなサイズを有し、ＣＰＵおよびＧＰＵに物理的により近接し、より早いレートでアクセス可能である。ローカルキャッシュ１４６は、ＣＰＵ１３８およびＧＰＵ１４０による直接使用のための、メインダイナミックメモリ１４４またはスタティックメモリプール２０２から取出された命令およびデータのコピーを格納する。メインダイナミックメモリ１４４は、主メモリとも呼ばれる。ＣＰＵ１３８およびＧＰＵ１４０によって実行される全てのプログラムは、メインダイナミックメモリ１４４にロードされ、実行の前にブロックまたは命令単位でキャッシュに移動される。メインダイナミックメモリ１４４のサイズは、一度に実行可能なプログラムの数およびプログラムが容易に利用可能なデータの量を決めるため、重要である。スタティックメモリプール２０２は、キャッシュ１４６およびメインダイナミックメモリ１４４に付加的なものである。いくつかの実現例では、スタティックメモリプール２０２は、ＣＰＵ１３８およびＧＰＵ１４０の両方によってアクセス可能なレベル４キャッシュとも呼ばれるが、複数のゲームサーバ１１８の間で共有される。スタティックメモリプール２０２は、ローカルキャッシュ１４６およびメインダイナミックメモリ１４４と比較して大きなレイテンシを有しており、そのため、オンラインゲームセッションであまり使用されないスタティックデータ項目を格納するために使用される。サーバシステム１１４では、このマルチレベルストレージ方式によって、ゲームタイトルの複数のオンラインゲームセッションが、少なくとも消費電力に関して効率的に実行可能になる。
【００４１】
ゲーム環境におけるデータ格納
いくつかの実現例では、ゲームタイトルに対応するゲームコンテンツは、グラフィックスパイプラインプロセス（たとえば、ＯｐｅｎＧＬレンダリングパイプライン）によるオンラインゲームセッションについて、ＧＰＵ１４０によってレンダリングされる。グラフィックスパイプラインプロセスは、グラフィックス処理の順序シーケンスを含み、各グラフィックス処理は、１つ以上のユーザが定義したシェーダプログラムに基づいて実現される。各グラフィックス処理において、ＧＰＵ１４０は、前のグラフィックス処理からユーザ入力または出力を受信し、それ自体の出力を、それぞれのグラフィックス処理の中間出力またはグラフィックスパイプラインプロセス全体の最終的な出力として生成する。このプロセスの間に、それぞれのグラフィックス処理のシェーダプログラムは、前のグラフィックス処理から受信されたユーザ入力および出力に加えて、１つ以上のスタティックデータ項目を用いる。たとえば、ＯｐｅｎＧＬレンダリングパイプラインのグラフィックス処理で使用されるスタティックデータ項目は、１つ以上のテクスチャオブジェクト、頂点データバッファオブジェクト、および定数データオブジェクトを含む。グラフィックスパイプラインプロセスによって、各オンラインゲームセッションについて画像フレームのシーケンスがレンダリングされ、各画像フレームは、ある解像度を有するピクセルアレイ（ページとも呼ばれる）を含む。いくつかの実現例では、グラフィックスパイプラインプロセスに対応するスタティックデータ項目（たとえば、テクスチャオブジェクト）は、オンラインゲームセッションの画像フレームと同じ解像度を有する１つ以上の画像を含む。
【００４２】
スタティックデータ項目は、ゲームタイトルに対応する複数のオンラインゲームセッションのグラフィックスパイプラインプロセスにおいて共有される、すなわち、異なるオンラインゲームセッション間で変わらない。状況によっては、スタティックデータ項目は、個々のＧＰＵ１４０と関連付けられたランダムアクセスメモリ（ＧＰＵ  ＲＡＭ）の一部に格納される。ＧＰＵ  ＲＡＭのこの一部は、「リードオンリー」としてアプリケーションプログラミングインターフェース（ＡＰＩ）によって明示的にラベルをつけられる。状況によっては、ＧＰＵ  ＲＡＭは、その電力予算のかなりの部分をメモリリフレッシュに費やすＤＲＡＭ（たとえば、メインダイナミックメモリ１４４）である。リフレッシュサイクルを必要としないメモリ技術が存在すると仮定すると、スタティックデータ項目を格納するためにＧＰＵ  ＲＡＭを使用することはあまり望ましい解決策ではない。
【００４３】
いくつかの実現例では、ＧＰＵのＤＲＡＭのほんの一部（たとえば、メインダイナミックメモリの一部）は、リフレッシュを必要とせずＤＲＡＭと比較して使用電力の少ない不揮発性メモリで置換えられる。この不揮発性メモリは、グラフィックスパイプラインプロセスで使用されるリードオンリーアセット（すなわち、スタティックデータ項目のサブセットまたは全て）を格納するために使用される。このような不揮発性メモリの例には、ＰＲＡＭ、フラッシュメモリおよびソリッドステートドライブが含まれる。いくつかの実現例では、ＰＲＡＭが使用されると、ＤＲＡＭと比較して桁違いに少ない書込みサイクルを処理可能である。したがっていくつかの実現例では、ＰＲＡＭは、ウェアレベリングおよびハッシュ割当てを用いる。ＰＲＡＭ内の各ページは、格納されたコンテンツを示す関連付けられたハッシュを有し、ＰＲＡＭに対する読出しおよび書込みは、（ページテーブル変換を用いて）このハッシュにおいてインデックスが付けられる。ゲームタイトルに対応するゲームアプリケーションがその「リードオンリー」アセット（たとえば、スタティックデータ項目）を解放すると、メモリコントローラ２０４は、リードオンリーアセットに対応するページを即座に解放しないが、ＰＲＡＭが一杯の場合、リードオンリーアセットに対応するページの解放のみを行う。リードオンリーアセットに対応するページは解放されると、最長時間未使用（ＬＲＵ）法に従って廃棄される。そのため、ＰＲＡＭ内のメモリユニットは、近似的に同じ量の作業負荷を実行し（たとえば、もう一度同じゲームタイトルについて同じ量のアクセスを提供し）、永久にメモリユニットにダメージを与えることがある過剰な書込みから保護される。
【００４４】
クラウドベースゲームアプリケーションのいくつかの実現例では（たとえば、サーバシステム１１４では）、ＧＰＵのＤＲＡＭのほんの一部（たとえば、メインダイナミックメモリ１４４の一部）が不揮発性メモリに置換えられた後で、各ＧＰＵのＤＲＡＭは、ＲＡＭの読出し／書込みに必要なものまで低減される。各ＧＰＵ１４０の不揮発性メモリは、他のＧＰＵの不揮発性メモリと統合されて集中型のスタティックメモリプール２０２（たとえば、ＰＲＡＭストレージデバイス）を形成し、これらのＧＰＵ１４０の間で共有される。いくつかの実現例では、アクセスは早いインラック相互接続によってスタティックメモリプール２０２に送られ、早いインラック相互接続は、各サーバラックにまたは同様の規模で配置されたバスを含む。また、メモリルックアップテーブルまたはハッシュが、スタティックメモリプール２０２に格納される。
【００４５】
ＧＰＵアセットのリードオンリー部分は、複数の実行にわたって再使用可能であり、集中型のリードオンリー記憶装置に付随する作業負荷のうち多くが同様である場合、シェア可能である。そうは言っても、いくつかの実現例では、スタティックメモリプール２０２に格納されるスタティックデータ項目は、抽出される場合、２つ以上のオンラインゲームセッションの間で再使用される。このスタティックメモリプール２０２へ書込まれると、スタティックデータ項目は、繰り返し同じスタティックデータ項目が格納されることを避けるために、メモリルックアップテーブルまたはハッシュに従ってハッシュされる。いくつかの実現例では、スタティックデータ項目がスタティックメモリプール２０２に既に存在する場合、スタティックメモリプール２０２が完全に一杯になるのを避けるために、拡張ＬＲＵポリシーが適用される。いくつかの実現例では、オフセットがスタティックメモリプール２０２内に存在するデータについて検索され、このスタティックデータ項目への今後のメモリアクセスのために保管される。ゲームアプリケーションがスタティックデータ項目を解放すると、スタティックメモリプール２０２のスペースがなくなるまで、それを消去する必要はない。
【００４６】
いくつかの実現例では、レイテンシが各ＧＰＵ１４０からスタティックメモリプール２０２までの往復について計測され、１つ以上のＧＰＵレイテンシ隠蔽方法を用いて補償される。１つ以上のＧＰＵレイテンシ隠蔽方法は、スタティックメモリプール２０２への書込みアクセス、タイルされた／圧縮された／空間的にコヒーレントなテクスチャ、およびスタティックメモリプール２０２からのページサイズの転送を組合わせる書込み統合を含むが、これに限定されない。ある状況下では、スタティックデータ項目を格納するために（ローカルなＤＲＡＭではなく）スタティックメモリプール２０２が用いられるため、レイテンシを隠蔽するためにワープの数が増やされる。
【００４７】
いくつかの実現例では、集中型のスタティックメモリプール２０２は、ＰＲＡＭおよび書込みサイクルが限定されていることが多いＰＲＡＭのようなメモリを含む。スタティックメモリプール２０２はスワップされる、または置換えられる一方で、ＧＰＵ１４０はいずれもラックに詰め込まれない。
【００４８】
いくつかの実現例では、サーバシステム１１４は、２つ以上のゲームタイトルについてオンラインゲームセッションをサポートする。作業負荷が、スタティックメモリプール２０２にアップロードされた「リードオンリー」アセットの以前の作業負荷に従って、複数のサーバを含むラックに割当てられる。ゲームタイトルはレベルによって分割され、同じレベルの人気のあるゲームタイトルは、より小さなスタティックメモリプールを可能にするために、同じラック上のゲームサーバ１１８によって実行される。
【００４９】
いくつかの実現例では、多数のＧＰＵが同じ作業負荷を実行していて（たとえば、ゲームタイトルに対応するオンラインゲームセッション）ＤＲＡＭリフレッシュおよびネットワーク電力コストを償却するのに十分な再利用を達成可能であれば、スタティックメモリプール２０２は、共有ＤＲＡＭプール（ＰＲＡＭプールまたはその等価物に代えて）に置換え可能である。
【００５０】
図３Ａは、いくつかの実現例に係る、データをサーバシステム１１４に格納するように構成されたマルチレベルストレージ方式を有するメモリシステム３００の例を示す図である。マルチレベルストレージ方式に従って、サーバシステム１１４のメモリシステム３００は、各個別のサーバ（たとえば、ゲームサーバ１１８）内に直接配設された複数のキャッシュ３０２を含む。より具体的には、複数のキャッシュ３０２の各々は、個別のサーバのプロセッサ、たとえば、ゲームサーバ１１８のＣＰＵ１３８およびＧＰＵ１４０に直接関連付けられ、個別のサーバのプロセッサによって実行される命令と命令の実行中に使用されるデータとの両方を提供するように構成される。サーバシステム１１４のメモリシステム３００はさらに、サーバ（たとえば、ゲームサーバ１１８）の１つ以上のプロセッサによって実行されるプログラムおよびプログラムの実行中に使用されるデータを格納するように構成されたメインダイナミックメモリ１４４を含む。各プログラムは複数の命令を含み、実行中、これらの命令は、対応するプロセッサのキャッシュ３０２に順番にロードされ、それぞれのプロセッサによる実行を待つ。いくつかの実現例では、サーバシステム１１４のサーバのサブセットまたは全ては、メインダイナミックメモリ１４４を共有する。データバスは、サーバシステム１１４のサーバのサブセットまたは全てをメインダイナミックメモリ１４４に接続して、メインダイナミックメモリ１４４に対する書込みおよび読出しアクセスを実行可能にする。必要であれば、データバスは、それを介してメインダイナミックメモリ１４４が閾値バスレイテンシよりもかなり小さなレイテンシでアクセスされる高速データバスを含む。いくつかの実現例では、サーバシステム１１４の各サーバは、それぞれのサーバの１つ以上のプロセッサのみがアクセス可能なそれぞれのメインダイナミックメモリ１４４を有する。たとえば、ゲームサーバ１１８は、ゲームサーバ１１８のＣＰＵ１３８とＧＰＵ１４０との両方がアクセス可能なメインダイナミックメモリ１４４を含む。ゲームサーバ１１８のメインダイナミックメモリ１４４は、１つ以上のゲームタイトルを実行するように構成された命令３０４、たとえば、図５Ａのサーバ側ゲームモジュール５２６の命令と、各ゲームタイトルのオンラインゲームセッションと関連付けられたダイナミックデータ３０６、たとえば、第１のゲームセッションデータ３０８および第２のゲームセッションデータ３１０を格納する。具体的には、第１のゲームセッションデータ３０８は必要であれば、それぞれのゲームタイトルの対応するオンラインゲームセッションについて、ＧＰＵ１４０によって生成される１つ以上の画像フレームのテクスチャページ３０８Ａ、頂点ページ３０８Ｂ、定数ページ３０８Ｃおよびフレームデータ３０８Ｄを含む。サーバシステム１１４内のメインダイナミックメモリ１４４に格納されるプログラムおよびデータについては、図５Ａおよび図５Ｂを参照して以下でより詳細に説明される。
【００５１】
マルチレベルストレージ方式に従って、サーバシステム１１４のメモリシステム３００はさらに、サーバシステム１１４内の複数のゲームサーバ１１８のために集中化されこれらによって共有されるスタティックメモリプール２０２を含む。スタティックメモリプール２０２は、ゲームタイトルのオンラインゲームセッションの画像フレームをレンダリングするために使用される１つ以上のスタティックデータ項目を格納するように構成される。１つ以上のスタティックデータ項目の例は、テクスチャオブジェクト３１２、頂点データバッファオブジェクト３１４、定数データオブジェクト３１６を含むが、これらに限定されない。複数のゲームサーバ１１８が複数のオンラインゲームセッションを実行するために割当てられると、各ゲームサーバ１１８は、スタティックメモリプール２０２から１つ以上のスタティックデータ項目を取得し、対応するメインダイナミックメモリ１４４から１つ以上のダイナミックデータ項目３０６を取得する。
【００５２】
さらにいくつかの実現例では、ゲームサーバ１１８はさらに、ＧＰＵ１４０に接続されたシェーダキャッシュ３１８を含む。シェーダキャッシュ３１８は、コンパイルされたシェーダの命令がＧＰＵ１４０に直接ロードされてグラフィックスパイプラインプロセスを介してゲームコンテンツのレンダリングが可能になるように、コンパイルされたシェーダの少なくとも１つのシーケンスを格納するように構成される。いくつかの実現例では、サーバシステム１１４は、各々が性能基準に従って構成された複数のコンパイルされたシェーダシーケンス３２０を含み、各々は必要であれば、異なるユーザ入力状況に対応する複数のバージョンを含む。必要であれば、複数のコンパイルされたシェーダシーケンス３２０は、シェーダキャッシュ３１８に格納される。必要であれば、複数のコンパイルされたシェーダシーケンス３２０は、スタティックメモリプール２０２に格納され、シェーダキャッシュ３１８に格納される、または、ゲームコンテンツレンダリングでの使用のために選択される場合はＧＰＵ１４０のキャッシュに直接移動される。
【００５３】
さらに、マルチレベルストレージ方式に従って、サーバシステム１１４のメモリシステム３００は、１つ以上のゲームタイトルに対応する１つ以上の実行可能なゲームプログラムを格納するハードドライブ３２４を備える。ゲームタイトルをホストするようにサーバシステム１１４を構成する過程において、サーバシステムのＣＰＵ１３８は、ゲームタイトルに対応する実行可能なゲームプログラム３２８のプログラムリクエスト３２６を送信する。プログラムリクエスト３２６に応答して、ハードドライブ３２４は、ゲームタイトルに対応する実行可能なゲームプログラム３２８をＣＰＵ１３８に戻す。いくつかの実現例では、ハードドライブ３２４は、リクエストされた実行可能なゲームプログラム３２８を格納せず、ＣＰＵ１３８は、より離れたサーバ（たとえば、ゲームライブラリサーバ１２２または他の第三者のゲームプロバイダ）に実行可能なゲームプログラム３２８をリクエストするプログラムリクエスト３２６を、送信する。ＣＰＵ１３８は、ハードドライブ３２４またはリモートサーバから戻された実行可能なゲームプログラム３２８を、サーバ側ゲームモジュール５２６としてインダイナイミックメモリ１４４に格納する。
【００５４】
さらにいくつかの実現例では、ハードドライブ３２４は、１つ以上のゲームタイトルのスタティックデータ項目も格納する。ゲームタイトルをロードしている過程において、サーバシステムのＣＰＵ１３８は、ゲームタイトルのスタティックデータ項目のデータリクエスト３３０を送信する。データリクエスト３２６に応答して、ハードドライブ３２４は、ゲームタイトルに対応するスタティックデータ項目３３２のサブセットまたは全てをＣＰＵ１３８に戻す。いくつかの実現例では、ハードドライブ３２４は特定のスタティックデータ項目を格納せず、ＣＰＵ１３８は、より離れたサーバ（たとえば、ゲームライブラリサーバ１２２またはシェーダライブラリサーバ１２４）に特定のスタティックデータ項目をリクエストするデータリクエスト３３０を送信する。ハードドライブ３２４またはリモートサーバから戻された１つ以上のスタティックデータ項目３３２Ａは、スタティックメモリプール２０２に格納される。代替的にいくつかの実現例では、１つ以上のスタティックデータ項目３３２Ｂが、ゲームサーバ１１８のＣＰＵおよびＧＰＵによる直接アクセスのために、メインダイナミックメモリ１４４に格納される。
【００５５】
さらにＣＰＵ１３８は、シェーダライブラリサーバにシェーダリクエストを送信して、ゲームタイトルに関連して用いられる１つ以上の標準シェーダプログラム３３６を取得し、戻されたシェーダプログラム３３６は、シェーダキャッシュ３１８にローカルに格納される。ＣＰＵ１３８およびＧＰＵ１４０は、ゲームタイトルに対応するオンラインゲームセッションを実行しつつ、複数のダイナミックデータ項目３３８を生成する。これらの複数のダイナミックデータ項目３３８は、サーバシステム１１４のメインダイナミックメモリ１４４に格納される。
【００５６】
いくつかの実現例では、サーバシステム１１４は、それぞれメインダイナミックメモリ１４４およびスタティックメモリプール２０２に対する読み書きアクセスを管理するように構成されたダイナミックメモリコントローラ２０４Ａおよびスタティックメモリコントローラ２０４Ｂを含む。いくつかの実現例では、サーバシステム１１４は、メインダイナミックメモリ１４４およびスタティックメモリプール２０２に対する読み書きアクセスを管理するように構成されたただ１つのメモリコントローラ２０４を含む。メインダイナミックメモリ１４４は、メインダイナミックメモリ１４４内の命令３０４、ダイナミックデータ項目３０６、および（設けられている場合）スタティックデータ項目３３２Ｂの位置を識別するディレクトリ３０４を含む。いくつかの実現例では、スタティックメモリプール２０２は、スタティックメモリプール２０２内のスタティックデータ項目３３２Ａの位置を識別するハッシュテーブル３４２を含む。必要であれば、スタティックデータ項目３３２は、コンテキスト情報に基づいて識別される。一例では、スタティックメモリプール２０２は、複数のコンパイルされたシェーダシーケンス３２０を格納し、スタティックメモリプール２０２内のそれらのアドレスは、ハッシュテーブル内の対応するグラフィックスパイプラインプロセスの性能基準、ユーザ入力および／または使用統計量を用いて識別される。必要であれば、ハッシュテーブル３４２内のマッピングに基づくそのようなコンテキストも、他のスタティックデータ項目に適用される。ハッシュテーブルは、異なる状況に関連して繰り返しスタティックデータ項目を格納することからスタティックメモリプール２０２を保護し、これによって、メモリリソースの無駄が生じる。
【００５７】
図３Ｂは、いくつかの実現例に係る、複数のレベルのキャッシュを有するＣＰＵ１３８の例を示す図である。いくつかの実現例では、各ＣＰＵは、複数のＣＰＵコア３５０を含む。各ＣＰＵコア３５０は、それぞれのＣＰＵコアによって実行される命令と、命令の実行中に使用されるデータとの両方を格納するキャッシュ３５２を有する。キャッシュ３５２は、それぞれのＣＰＵコア３５０と直接接続され、命令及びデータをそれぞれのＣＰＵコア３５０に即座に直接提供可能である。いくつかの実現例では、ＣＰＵコア３５０はさらに、ＣＰＵ１３８の複数のＣＰＵコア３５０によって共有されるＣＰＵキャッシュ３５４を含む。ＣＰＵキャッシュ３５４は、ＣＰＵコア３５０に格納された命令の実行中に使用されるデータを格納する。ＣＰＵキャッシュ３５４は、ＣＰＵコア３５０と直接接続されたキャッシュ３５２にデータを供給する。
【００５８】
図３Ｃは、いくつかの実現例に係る、複数のレベルのキャッシュを有するＧＰＵ１４０の例を示す図である。いくつかの実現例では、各ＧＰＵは、複数のＧＰＵコア３６０を含む。各ＧＰＵコア３６０は、それぞれのＧＰＵによって実行される命令と、命令の実行中に使用されるデータとの両方を格納するキャッシュ３６０を有する。キャッシュ３６２は、それぞれのＧＰＵコア３６０と直接接続され、命令およびデータをそれぞれのＧＰＵコア３６２に即座に直接提供可能である。いくつかの実現例では、ＧＰＵコア３６０はさらに、ＧＰＵ１３８の複数のＧＰＵコア３６０によって共有されるＧＰＵキャッシュ３６４を含む。ＧＰＵキャッシュ３６４は、ＣＰＵコア３６０に格納された命令の実行中に使用されるデータを格納する。ＧＰＵキャッシュ３６４は、ＧＰＵコア３６０と直接接続されているキャッシュ３６２にデータを供給する。ゲームタイトルのゲームコンテンツをレンダリングするために、メモリシステム３００内の読み書きがページによって（すなわち、ゲームコンテンツの画像フレームに対応する画像ピクセルのアレイによって）管理される。ページの大きさの読出しは、ラストレベルキャッシュとして使用されるＤＲＡＭの小さなプールを含む場合があるローカルＧＰＵメモリ階層（Ｌ３−Ｌ１キャッシュ）においてキャッシュされる、すなわち、キャッシュ３６２およびＧＰＵキャッシュ３６４においてキャッシュされる。
【００５９】
図３Ｄは、いくつかの実現例に係る、サーバシステム１１４において複数のプロセッサによって共有されるスタティックメモリプール２０２に対する読み書きアクセスを制御するメモリコントローラ２０４の例を示す図である。メモリコントローラ２０４は、アクセス制御モジュール３７２、ページ解放モジュール３７４、ウェアレベリングモジュール３７６およびＬＲＵモジュール３７８のうち１つ以上を含む。アクセス制御モジュール３７２は、そこに格納されるハッシュテーブル３４２に基づいてスタティックメモリプール２０２にアクセスするように構成される。ページ解放モジュール３７４は、スタティックメモリプール２０２からスタティックデータ項目を削除するように構成される。必要であれば、特定のデータ項目を削除するリクエストに応答して、ページ解放モジュール３７４は、スタティックメモリプール２０２が一杯かどうかを判断する。スタティックメモリプール２０２が一杯ではないという判断に従って、ページ解放モジュール３７４は、ハッシュテーブル３４２を修正して、削除されるべき特定のデータ項目に対するアクセスを無効にする。スタティックメモリプール２０２が一杯であるという判断に従って、ページ解放モジュール３７４は、スタティックメモリプール２０２から特定のデータ項目を削除して、対応するメモリ空間を解放する。
【００６０】
ウェアレベリングモジュール３７６は、スタティックメモリプール２０２におけるメモリユニットの再書込みを監視し、スタティックメモリプール２０２の耐用年数を延ばす目的でスタティックメモリプール２０２において均等に再書込みを分散するように構成される。ＬＲＵモジュール３７８は、最も長い間使われていないスタティックデータ項目をスタティックメモリプール２０２から削除するように構成される。具体的には、いくつかの実現例では、ＬＲＵモジュール３７８は、スタティックメモリプール２０２に格納された各スタティックデータ項目と共に世代ビットを格納する。メモリ制限に達すると、最も長い間アクセスされていないスタティックデータ項目が、世代ビットに従って識別される最も古いデータ項目から削除される。ＬＲＵモジュールがスタティックデータ項目を削除すると、世代ビットは、スタティックメモリプール２０２に残っているスタティックデータ項目について変わる。
【００６１】
図４Ａは、いくつかの実現例に係る、サーバシステム１１４上でゲームタイトルをロードするプロセス４００の間のデータフローの例を示す図である。サーバシステム１１４は、互いに離れたゲームサーバ１１８、ゲームライブラリサーバ１２２、およびシェーダライブラリサーバ１２４を含む。サーバシステム１１４はまた、ゲームサーバ１１８によってホストされるゲームタイトルのゲームプレーに関与する複数のクライアントデバイス１０２から離れている。サーバシステム１１４（具体的には、ゲームサーバ１１８）は、１つ以上のＣＰＵ１３８と複数のＧＰＵ１４０とを含み、マルチレベルストレージ方式を採用する。マルチレベルストレージ方式に従って、サーバシステム１１４は、プログラムの実行中にＣＰＵおよび／またはＧＰＵによる使用のためのプログラムおよびデータを格納するメインダイナミックメモリ１４４と、不揮発性メモリに格納されるスタティックメモリプール２０２と、スタティックメモリプール２０２を管理するように構成されたメモリコントローラ２０４とを備える。ゲームタイトルをロードするユーザリクエストの受信（４０１）に応答して、ＣＰＵ１３８は、ゲームサーバ１１８のハードドライブ３２４またはゲームライブラリサーバ１２２にプログラムリクエストを送信して（４０２）、ゲームタイトルに対応する実行可能なプログラム（たとえば、サーバ側ゲームモジュール５２６）をリクエストする。いくつかの実現例では、ＣＰＵ１３８はまず、プログラムリクエストをハードドライブ３２４に送信する。ハードドライブ３２４が実行可能なゲームプログラムのコピーを提供できない場合、ＣＰＵ１３８は、プログラムリクエストをゲームライブラリサーバ１２２に送信する。プログラムリクエストに応答して、ハードドライブ３２４またはゲームライブラリサーバ１２２は、メインダイナミックメモリ１４４に格納されている（４０４）実行可能なゲームプログラムのコピーを戻す。
【００６２】
１つ以上のスタティックデータ項目（たとえば、テクスチャオブジェクト）は、実行可能なゲームプログラムの実行の過程において必要とされ、そのため、ＣＰＵ１３８は、データリクエストを、ハードドライブ３２４、ゲームライブラリサーバ１２２、およびシェーダライブラリサーバ１２４のうち少なくとも１つに送信して（４０６）、スタティックデータ項目の所定のセットをリクエストする。ハードドライブ３２４がそれぞれのデータ項目を有していない場合、ＣＰＵ１３８は、順序にしたがって、たとえば、まずハードドライブ３２４に、次にゲームライブラリサーバ１２２および／またはシェーダライブラリサーバ１２４に、データリクエストを送信する。この順序は必要に応じて、スタティックデータ項目のセットについて同じである、または、各スタティックデータ項目に従ってカスタマイズされる。リクエストされたスタティックデータ項目の第１のサブセットの各々について、ハードドライブ３２４、ゲームライブラリサーバ１２２およびシェーダライブラリサーバ１２４のうちの１つは、スタティックメモリプール２０２に格納されている（４０８）それぞれのデータ項目のコピーを戻す。いくつかの実現例では、リクエストされたスタティックデータ項目の第２のサブセットが戻され、メインダイナミックメモリ１４４に格納される（４１０）。いくつかの実現例では、リクエストされたスタティックデータ項目は、リクエストされたデータ項目の第３のサブセット（たとえば、１つ以上のシェーダプログラム）を含む。リクエストされたスタティックデータ項目の第３のサブセットは、ハードドライブ３２４とシェーダライブラリサーバ１２４とのうち１つによって戻され、シェーダキャッシュ３１８に格納される（４１２）。
【００６３】
図４Ｂは、いくつかの実現例に係る、サーバシステム１１４上で（具体的には、ゲームサーバ１１８内で）オンラインゲームセッションを実行するプロセスの間のデータフロー４２０の例を示す図である。ＣＰＵは、複数の分散されたクライアントデバイス１０２から、ゲームタイトルで複数のオンラインゲームセッションを開始する複数のセッションリクエストを受信する（４２２）。各クライアントデバイス１０２は、ゲームタイトルに対応するリアルタイムユーザインタラクティブゲームアプリケションを実行し、それぞれのセッションリクエストがそれぞれのクライアントデバイス１０２のゲームアプリケーションから送信される。それぞれのセッションリクエストは、リクエストしているクライアントデバイス１０２のユーザ情報を含む。それぞれのクライアントデバイス１０２のユーザ情報を受信すると、ＣＰＵ１３８は、ユーザ情報に基づいて対応するオンラインゲームセッションを認証し（４２４）、ＧＰＵ１４０のうち１つを割当てて（４２６）、対応するオンラインゲームセッションを実行する。いくつかの実現例では、複数のオンラインゲームセッションのうち２つ以上が、ＧＰＵ１４０のうち１つに割当てられる。つまり、２つ以上のオンラインゲームセッションは、時分割多重化（ＴＤＭ）、空間多重化、またはそれらの組合せに基づいて、ＧＰＵのうち１つの計算リソースおよびストレージリソースを共有する必要がある。ゲームコンテンツレンダリングにおけるＧＰＵ割当てについては、２０１８年３月２２日に出願され、「Methods and Systems for Rendering and Encoding Content for Online Interactive Gaming Sessions（オンラインインタラクティブゲームセッションのためにコンテンツをレンダリングおよび符号化するための方法およびシステム）」と題された米国仮特許出願第６２／６４６，８２４号において説明され、その全体が本明細書において引用により援用される。
【００６４】
各セッションリクエストに応答して、ＣＰＵ１３８は、ゲームタイトルの実行可能なゲームプログラムの命令をメインダイナミックメモリ１４４からＣＰＵ１３８のローカルキャッシュにコピーし（４２８）、命令を１つずつ実行する。同様に、ＣＰＵ１３８によって命令されると、それぞれのオンラインゲームセッションを実行するように割当てられたそれぞれのＧＰＵもまた、実行可能なゲームプログラム内の関連するゲームレンダリング命令をそのローカルキャッシュにロードし、ゲームレンダリング命令を１つずつ実行する。
【００６５】
いくつかの実現例では、複数のオンラインゲームセッションの各々は、たとえば毎秒６０フレーム（ｆｐｓ）のレートで常にリフレッシュされる。いくつかの実現例では、複数のオンラインゲームセッションの各々は、それぞれのセッション自体または関連するセッションによって入力されたユーザアクションに応答してリフレッシュされる。たとえば、オンラインゲームセッションのサブセットは、ゲームタイトルの同じゲームシーンにあるときに関連付けられ、オンラインゲームセッションのサブセットの各々に配信されたゲームコンテンツは、少なくともオンラインゲームセッションのサブセットのうちいずれか１つがユーザアクションを入力すると、アップデートされる。
【００６６】
具体的には、オンラインゲームセッションについて、ＣＰＵ１３８は、オンラインゲームセッションまたはオンラインゲームセッションと同じゲームシーンを共有している他の別個のゲームセッションに関与している第１のクライアントデバイスのゲームアプリケーションを介して入力されたユーザ入力を受信する（４３０）。これに応答して、ＣＰＵ１３８は、ゲームタイトルに対応する実行可能なゲームプログラムの命令を実行して（４３２）、オンラインゲームセッションを実行するように割当てられたＧＰＵ１４０に、ユーザ入力に従って画像フレームのシーケンスをレンダリングするように命令する（４３８）。このオンラインゲームセッションの実行中、このオンラインゲームセッションと関連付けられたダイナミックデータ項目は、メインダイナミックメモリ１４４に格納される、またはこれから抽出される（４３４）。このオンラインゲームセッションと関連付けられたスタティックデータ項目が、スタティックメモリプール２０２から抽出される（４３６）。いくつかの実現例では（本明細書では図示せず）、スタティックデータ項目のセットがメインダイナミックメモリ１４４から抽出される。
【００６７】
その後、割当てられたＧＰＵ１４０は、ユーザ入力に基づいてオンラインゲームセッションの画像フレームをレンダリングするゲームレンダリング命令を実行する（４３９）。オンラインゲームセッションの実行中、ＧＰＵ１４０は、シェーダキャッシュ３１８からコンパイルされたシェーダを取得し（４４０）、スタティックデータ項目をスタティックメモリプール２０２から抽出し（４４２）、ダイナミックデータ項目をメインダイナミックメモリ１４４に格納する、またはこれから抽出する（４４４）。いくつかの実現例では（本明細書では図示せず）、ＧＰＵはまた、メインダイナミックメモリ１４４から１つ以上のスタティックデータ項目を抽出する。ＧＰＵによってレンダリングされた画像フレームは、エンコーダ１４２によって符号化され、オンラインゲームセッションを実行しているクライアントデバイス１０２にストリーミングされる（４４６）。いくつかの実現例では、ＧＰＵ（たとえば、観客レビュー向けの標準レイテンシストリーム）によってレンダリングされた画像フレームは、メディアストリーミングサーバ１２０を介してクライアントデバイス１０２にストリーミングされる（４４８）。
【００６８】
図４Ｃは、いくつかの実現例に係る、シェーダ最適化プロセス４５０におけるデータフローの例を示す図である。いくつかの実現例では、実行可能なゲームプログラム（たとえば、図５Ａのサーバ側ゲームモジュール５２６）は、ゲームアプリケーション、およびオンラインゲームセッションとシェーダパイプライン最適化プロセスとを同時に実行するように構成されたシェーダパイプラインオプティマイザを含む。たとえば、ゲームアプリケーションがフォアグラウンドでグラフィックスパイプラインプロセスにおけるオンラインゲームセッションを実行する一方で（動作４３８〜４４８）、シェーダパイプラインオプティマイザは、バックグラウンドでこのグラフィックスパイプラインプロセスにおいて用いられるコンパイルされたシェーダを最適化する。つまり、グラフィックスパイプラインプロセスが実行される一方で（動作４３８〜４４８）、ゲームサーバ１１８は、１つ以上の性能基準を満たすために、バックグラウンドでコンパイルされたシェーダの１つ以上のシーケンスを生成する（４５０）。
【００６９】
具体的には、いくつかの実現例では、ＣＰＵ１３８は、必要であればゲームタイトルに関連する全てのアクティブなオンラインゲームセッションからサンプリングされたオンラインゲームセッションのセットの使用統計を収集する（４５２）。使用統計は、ＣＰＵ１３８およびＧＰＵ１４０のローカルキャッシュまたはメインダイナミックメモリ１４４から取得され得る。ＣＰＵ１３８は、最適化の間に満たされる必要がある１つ以上の性能基準を識別し、取得する（４５４）。いくつかの実現例では、１つ以上の性能基準は、スタティックメモリプール２０２またはメインダイナミックメモリ１４４（任意）に格納された１つ以上のスタティックデータ項目を含む。ＣＰＵ１３８はその後、使用統計および性能基準に基づいてアクティブなオンラインゲームセッションを実行するために使用されているコンパイルされたシェーダのシーケンスを最適化するリクエストを、ＧＰＵに送信する（４５６）。１つ以上の性能基準の各々について、ＧＰＵ１４０は、コンパイルされたシェーダのシーケンスの性能をそれぞれの性能基準に関して改良するためにコンパイルされたシェーダのシーケンス内の１つ以上のシェーダを修正して（４５８）、コンパイルされたシェーダの修正されたシーケンスを生成する。状況によっては、コンパイルされたシェーダの修正されたシーケンスは、必要であれば、次のオンラインゲームセッションによって使用されるコンパイルされたシェーダのシーケンスの代わりに格納される。状況によっては、コンパイルされたシェーダの修正されたシーケンスは、使用統計に対応するコンパイルされたシェーダのシーケンスの新しいバージョンとして格納され、オンラインゲームセッションの次のゲーム状態が使用統計に一致するときに使用される。いくつかの実現例では、コンパイルされたシェーダの修正されたシーケンスの各々は、対応する性能基準と関連してシェーダキャッシュ３１８に格納される（４６０）。代替的に、図４Ｃに図示されていないいくつかの実現例では、関連付けられた、コンパイルされたシェーダの修正されたシーケンスおよび性能基準が、スタティックメモリプール２０２に格納される。
【００７０】
図４Ｄは、いくつかの実現例に係る、複数のオンラインゲームセッションが実行されているときにスタティックデータ項目を取得するデータフロー４８０の例を示す図である。説明したように、複数のオンラインゲームセッションがゲームサーバ１１８によって並行して実行されるとき（４８２）、１つ以上のＣＰＵは、各オンラインゲームセッションをそれぞれのＧＰＵに割当てる。各オンラインゲームセッションの実行中、それぞれのＧＰＵ１４０は、コンパイルされたシェーダをシェーダキャッシュ３１８から取得し（４４０）、スタティックデータ項目をスタティックメモリプール２０２から抽出し（４４２）、ダイナミックデータ項目をメインダイナミックメモリに格納する、またはこれから抽出する（４４４）。図４Ｄを参照すると、いくつかの実現例では、２つのクライアントデバイス１０２Ａおよび１０２Ｂはそれぞれ、複数のオンラインゲームセッションのうち第１のオンラインゲームセッションおよび第２のオンラインゲームセッションを実行する。クライアントデバイス１０２Ａと１０２Ｂとの両方は、たとえば、クライアントデバイス１０２Ａによるゲームタイトルに対応するゲームアプリケーション内のユーザ入力の受信（４８４）に応答して、ゲームサーバ１１８によってレンダリングされた画像フレームを受信する。それぞれの画像フレームのレンダリングの過程において、（第１および第２のゲームセッションを含む）複数のゲームセッションの各々が、スタティックデータ項目と関連付けられ、スタティックデータ項目を用いてそれぞれのＧＰＵによって実行可能なグラフィックス処理を必要とし、スタティックデータ項目はスタティックメモリプール２０２に格納される。
【００７１】
複数のゲームセッションのうち第１のゲームセッションについて、ＣＰＵは、グラフィックス処理を第１のＧＰＵに割当てる。第１のＧＰＵは、第１のＧＰＵによって、メモリコントローラ２０４にスタティックデータ項目の第１のコピーをリクエストし（４８６）、スタティックメモリプール２０２から読出されたスタティックデータ項目の第１のコピーを、メモリコントローラ２０４から受信する（４８８）。第１のＧＰＵはその後、スタティックデータ項目の第１のコピーを用いてグラフィックス処理を行い、複数のゲームセッションのうち第１のゲームセッションと関連して（たとえば、識別子を用いることによって）グラフィックス処理の第１の結果をローカルに格納する。同様に、複数のゲームセッションのうち第２のゲームセッションについて、ＣＰＵは、グラフィックス処理を第２のＧＰＵに割当てる。第２のＧＰＵは、メモリコントローラ２０４に、スタティックデータ項目の第２のコピーをリクエストし（４９０）、スタティックメモリプール２０２から読出されたスタティックデータ項目の第２のコピーを、メモリコントローラ２０４から受信する（４９２）。第２のＧＰＵは、スタティックデータ項目の第２のコピーを用いてグラフィックス処理を行い、複数のゲームセッションのうち第２のゲームセッションと関連して、グラフィックス処理の第２の結果をローカルに格納する。
【００７２】
いくつかの実現例では、複数のオンラインゲームセッションのうち第３のオンラインゲームセッションについて、ＣＰＵは、グラフィックス処理を第３のＧＰＵに割当てる。第３のＧＰＵは、第１のＧＰＵが所定の期間内にスタティックデータ項目の第１のコピーをリクエストしたと判断する。第３のＧＰＵは、第１のＧＰＵからスタティックデータ項目の第１のコピーを直接取得する。いくつかの実現例では、第１のＧＰＵ自体がメモリコントローラからまだ第１のコピーを受信しておらず、第３のＧＰＵは待機して、第１のＧＰＵが第１のコピーを受信した後で第１のＧＰＵから第１のコピーを取得する。つまり、第１および第３のＧＰＵは、スタティックデータ項目のコピーのリクエストを統合する。
【００７３】
いくつかの実現例では、複数のゲームセッションの各々は優先順位と関連付けられ、第１および第２のＧＰＵは、第１および第２のゲームセッションの優先順位に従って、スタティックメモリプール２０２から読出されたスタティックデータ項目のコピーをメモリコントローラから受信する。たとえば、第１のゲームセッションは、第２のゲームセッションより高い優先順位を有する。第２のＧＰＵが第２のコピーをリクエストした後で閾値時間と同時に、またはこの閾値時間内に第１のＧＰＵが第１のコピーをリクエストすると、第２のＧＰＵは、第１のＧＰＵがメモリコントローラ２０４から第１のコピーを受信するまで第２のコピーの受信を中断される。
【００７４】
サーバシステム、クライアントデバイス、ゲームコントローラおよびメディアデバイス
図５Ａは、いくつかの実現例に係る、サーバシステム１１４を示すブロック図である。図５Ｂは、いくつかの実現例に係る、サーバ５００に格納されたデータを示すブロック図である。サーバシステム１１４は通常、１つ以上の処理ユニット（たとえば、ＣＰＵ１８（複数可）、ＧＰＵ１４０（複数可）およびエンコーダ１４２）、１つ以上のネットワークインターフェース５０４、メモリ５０６、およびこれらのコンポーネント（チップセットとも呼ばれる）を相互接続するための１つ以上の通信バス５０８を備える。サーバシステム１１４は必要であれば、キーボード、マウス、音声コマンド入力ユニットもしくはマイクロホン、タッチスクリーンディスプレー、タッチ感知入力パッド、ジェスチャ撮像カメラ、または他の入力ボタンもしくは制御装置などの、ユーザ入力を容易にする１つ以上の入力デバイス５１０を備え得る。さらに、サーバシステム１１４は、マイクロホンおよび音声認識またはカメラおよびジェスチャ認識を用いてキーボードを補足する、またはこれに置換わる。いくつかの実現例では、サーバシステム１１４は必要であれば、たとえば、電子デバイスに印刷されたグラフィックシリーズコードを撮像するための、１つ以上のカメラ、スキャナ、または光検出ユニットを備える。サーバシステム１１４はまた、１つ以上のスピーカおよび／または１つ以上のビジュアルディスプレーを含む、ユーザインターフェースおよびディスプレーコンテンツの提示を可能にする１つ以上の出力デバイス５１２を備え得る。
【００７５】
メモリ５０６は、ＤＲＡＭ、ＳＲＡＭ、ＤＤＲ  ＲＡＭなどの高速ランダムアクセスメモリ、またはその他のランダムアクセス固体記憶装置を含み、必要であれば、１つ以上の磁気ディスク記憶装置、１つ以上の光学ディスク記憶装置、１つ以上のフラッシュメモリデバイスなどの不揮発性メモリ、または１つ以上のその他の不揮発性固体記憶装置を含む。メモリ５０６は必要であれば、１つ以上の処理ユニットから離れて位置する１つ以上のストレージデバイスを含む。メモリ５０６、または代替的にメモリ５０６内の不揮発性メモリは、非一時的なコンピュータ可読記憶媒体を含む。いくつかの実現例では、メモリ５０６は、メインダイナミックメモリ１４４、スタティックメモリプール２０２およびシェーダキャッシュ３１８のサブセットまたは全てを含む。いくつかの実現例では、メモリ５０６またはメモリ５０６内の非一時的なコンピュータ可読記憶媒体は、以下のプログラム、モジュール、およびデータ構造、またはそれらのサブセットもしくは上位セットを格納する。
【００７６】
●さまざまな基本システムサービスを処理するための、およびハードウェア依存タスクを実行するためのプロシージャを含むオペレーティングシステム５１６。
【００７７】
●１つ以上のネットワークインターフェース５０４（有線または無線）およびインターネット、他のワイドエリアネットワーク、ローカルエリアネットワーク、メトロポリタンエリアネットワークなどの１つ以上の通信ネットワーク１１２を介して、サーバ５００（たとえば、ゲームサーバ１１８）を他のデバイス（たとえば、サーバシステム１１４内の他のサーバ、クライアントデバイス１０２および／または１０４、ならびにメディアデバイス１０６）に接続するためのネットワーク通信モジュール５１８。
【００７８】
●クライアントデバイス１０２および／または１０４において、情報の提示を可能にするためのユーザインターフェースモジュール５２０（たとえば、アプリケーション（複数可）、ウィジェット、ウェブサイトおよびそのウェブページ、ならびに／またはゲーム、音声および／もしくは映像コンテンツ、テキストなどを提示するするためのグラフィカルユーザインターフェース）。
【００７９】
●デバイスの提供、デバイス制御、およびメディアデバイス１０６（複数可）と関連付けられたユーザアカウント管理のためのデバイスサーバ側機能を提供するように実行されるメディアデバイスモジュール５２２（任意）。
【００８０】
●クライアントデバイス（１０２および／または１０４）ならびにメディアデバイス１０６のいずれかの位置情報に基づいて、クライアントデバイス１０２および／または１０４の位置を判断するための位置判断モジュール５２４。
【００８１】
●ゲームセッションの設定、セッション状態および他のゲーム関連データの格納、クライアントデバイス１０２からのゲームプレー入力の処理、ならびにゲームプレー入力に応じたゲームプレー出力（たとえば、画像フレームのシーケンス）のレンダリングを含むがこれらに限定されない、１つ以上のゲームタイトルと関連付けられたサーバ側機能を提供するためのサーバ側ゲームモジュール５２６。
【００８２】
●メディアストリーミングサイトのホスト、オンラインゲームセッションと関連付けられた同時付帯（concurrent ancillary）または補足メディアストリームの受信、および同じクライアントデバイス１０４または別個のクライアントデバイス１０２のゲームアプリケーション６２９上で実行中のオンラインゲームセッションと同時に表示するための同時メディアストリームのクライアントデバイス１０４への提供のためのメディアストリーミングサーバモジュール５３８。
【００８３】
●クライアントデバイス１０２／１０４への接続のネットワーク帯域幅の評価、およびクライアントデバイス１０２／１０４がゲームをプレーするために必要なモジュールまたはアプリケーションを有しているかどうかの評価を含むがこれらに限定されない、クライアントデバイス１０２／１０４のデバイスおよびネットワーク性能を評価するためのデバイス／ネットワーク評価モジュール５４０。
【００８４】
●データ（たとえば、ゲームコントローラ構成５５６、ソフトウェアアップデートなど）をクライアントデバイス１０２／１０４に提供するためのデータ送信モジュール５４２。
【００８５】
●以下を含むサーバシステムデータ５４４。
○共通デバイス設定（たとえば、サーバ階層、デバイスモデル、記憶容量、処理能力、通信能力など）を含む、クライアントデバイス１０２および１０４と関連付けられた情報を格納するためのクライアントデバイス設定５５２。
【００８６】
○アカウントアクセス情報およびデバイス設定のための情報（たとえば、サーバ階層、デバイスモデル、記憶容量、処理能力、通信能力など）のうち１つ以上を含む、メディアデバイスモジュール５２２のユーザアカウントと関連付けられた情報を格納するためのメディアデバイス設定５５４（任意）。
【００８７】
○クライアントデバイス１０２、レビュアークライアントデバイス１０４およびメディアデバイス１０６のうちいずれかの存在、近接度または位置と関連付けられた情報を含む位置／近接度データ５５６。
【００８８】
○さまざまなゲームタイトルについてコントローラ構成を格納するためのゲームコントローラ構成５５８。
【００８９】
○たとえばユーザアカウント情報（たとえば、本人確認およびパスワード）、会員の種類、プリファレンス、および活動履歴を含む、サーバシステム１１４上でホストされる１つ以上のゲームタイトル（たとえば、ゲームアプリケーション６２９、図６）の各々のユーザアカウントと関連付けられた情報を格納するためのユーザ情報５５８。
【００９０】
○たとえば第１のゲームセッションのためのデータ５６２および第２のゲームセッションのためのデータ５６４を含む、ゲームセッションと関連付けられたデータを格納するためのゲームセッションデータ５６０であり、各ゲームセッションのためのセッションデータ５６０は、それぞれのゲームセッションと関連付けられた１つ以上の画像フレームのフレームレート、レンダリング仕様、標準レイテンシ要件、ＧＰＵ割当て情報、エンコーダ割当情報、関連セッションの識別、最新状態情報、シェーダパイプライン識別、テクスチャページ３０８Ａ、頂点ページ３０８Ｂ、定数ページ３０８Ｃ、およびフレームデータ３０８Ｄを含むが、これらに限定されない。
【００９１】
○複数のオンラインゲームセッションによって共有されるデータを格納するためのスタティックデータ項目５６８であり、スタティックデータ項目５６２は、テクスチャオブジェクト、頂点データバッファオブジェクト、定数データオブジェクト、および異なる性能基準を満たすように仕様統計に基づいて最適化される、コンパイルされたシェーダのシーケンスのうち１つ以上を含むが、これらに限定されない。
【００９２】
○コンパイルされグラフィックスパイプラインプロセスにおける実行の準備が整っているシェーダを格納するためのコンパイルされたシェーダのシーケンス５７０であり、コンパイルされたシェーダのシーケンスは、デフォルト設定でゲームコンテンツをレンダリングするために用いられるコンパイルされたシェーダのデフォルトシーケンス、および異なる性能基準を満たすために仕様統計に基づいて最適化されるコンパイルされたシェーダの複数のシーケンスを含むが、これらに限定されない。
【００９３】
○最適化されたコンパイルされたシェーダのシーケンスと関連して格納される性能基準５７２および仕様統計５７４であり、性能基準５７２の各々は、全消費電量、コードサイズ、平均レイテンシ、全キャッシュ使用量、および複数のオンラインゲームセッションを実行している過程におけるコンパイルされたシェーダのシーケンスの全メモリ使用量のうち１つ以上に対応し、仕様統計５７４は、複数のオンラインゲームセッションの各々の実行を特徴付ける。
【００９４】
いくつかの実現例では、サーバ側ゲームモジュール５２６は、以下のプログラム、モジュール、またはこれらのサブセットもしくは上位セットを含む。
【００９５】
●オンラインゲームセッションの認証、セッションのサブセットを実行するためのＧＰＵの割当て、割当てられたＧＰＵに対応するセッションを実行させる命令、および割当てられたＧＰＵによってレンダリングされた画像フレームの符号化を含む、１つ以上のゲームタイトルに対応するオンラインゲームセッションを実行するためのゲームアプリケーション５２８（複数可）。
【００９６】
●専門のゲームコントローラデバイス１０２Ｂにインタラクトしこれを制御するための、たとえば、ゲームコントローラデバイス１０２Ｂからユーザリクエストおよび入力を受信するためのコントローラデバイスモジュール５３０。
【００９７】
●ゲームタイトルに対応するオンラインゲームセッションについて、画像フレームをレンダリングするグラフィックスパイプラインプロセスのグラフィックス処理の順序シーケンスで用いられるシェーダをコンパイルするためのシェーダコンパイラ５３２。
【００９８】
●コンパイルされたシェーダのシーケンスの性能を性能基準に関して改良するために、オンラインゲームを実行するために用いられているコンパイルされたシェーダのシーケンスにおける１つ以上のシェーダを修正するためのシェーダパイプラインオプティマイザ５３４。
【００９９】
●オンラインゲームセッションの実行中のＧＰＵ１４０を制御して、デフォルトのコンパイルされたシェーダのシーケンスまたは最適化されたコンパイルされたシェーダのシーケンスを用いて画像フレームをレンダリングするためのゲームレンダリングモジュール５３６。
【０１００】
いくつかの実現例では、サーバシステム１１４はさらに、１つ以上の通信バス５０８を用いてＣＰＵ、ＧＰＵ、メインダイナミックメモリ１４４およびスタティックメモリプール２０２に相互接続された１つ以上のメモリコントローラ２０４を備える。１つ以上のメモリコントローラ２０４は、メインダイナミックメモリ１４４を管理するように構成された第１のメモリコントローラ２０４Ａと、スタティックメモリプール２０２を管理するように構成された第２のメモリコントローラ２０４Ｂとを備える。既に示したように、構成要素５１６〜５４２および５５２〜５６６はメインダイナミックメモリ１４４に格納され、第１のメモリコントローラ２０４Ａを介してアクセス可能である。スタティックデータ項目５６８はスタティックメモリプール２０２に格納されており、第２のメモリコントローラ２０４Ｂを介してアクセス可能である。コンパイルされたシェーダ５７０、性能基準５７２および使用統計５７４は、必要であれば、シェーダキャッシュ３１８またはスタティックメモリプール２０２に一緒に格納される。必要であれば、オンラインゲームセッションの特定のセットについて収集された使用統計５７４は、ゲームセッションデータ５６２としてメインダイナミックメモリ１４４に格納される。
【０１０１】
上記のように識別された構成要素の各々は、既に記載されたメモリデバイスの１つ以上に格納されてもよく、上述の機能を実行するための命令のセットに対応する。上記のように識別されたモジュールまたはプログラム（すなわち、命令のセット）は、別のソフトウェアプログラム、プロシージャ、モジュールまたはデータ構造として実現される必要はなく、そのため、これらのモジュールのさまざまなサブセットは、さまざまな実現例で組合されてもよい、または他の態様では再配置されてもよい。いくつかの実現例では、メモリ５０６は必要であれば、上記のように識別されたモジュールおよびデータ構造のサブセットを格納する。さらに、メモリ５０６は必要であれば、記載されていない付加的なモジュールおよびデータ構造を格納する。
【０１０２】
図６は、いくつかの実現例に係る、ゲーム環境１００のクライアントデバイス６００の例（たとえば、クライアントデバイス１０２または１０４）を示すブロック図である。クライアントデバイス６００の例は、携帯電話、タブレットコンピュータ、ラップトップコンピュータ、デスクトップコンピュータ、およびウェアラブルパーソナルデバイスを含むが、これらに限定されない。クライアントデバイス６００は、１つ以上の処理ユニット（ＣＰＵ）６０２、１つ以上のネットワークインターフェース６０４、メモリ６０６、およびこれらのコンポーネント（チップセットとも呼ばれる）を相互接続するための１つ以上の通信バス６０８を含む。クライアントデバイス６００は、キーボード、マウス、音声コマンド入力ユニットもしくはマイクロホン、タッチスクリーンディスプレー、タッチ感知入力パッド、ジェスチャ撮像カメラ、または他の入力ボタンもしくは制御装置などの、ユーザ入力を容易にする１つ以上の入力デバイス６１０を含み得る。さらに、クライアントデバイス６００のうち一部は、マイクロホンおよび音声認識またはカメラおよびジェスチャ認識を用いてキーボードを補足する、またはこれに置換わる。いくつかの実現例では、クライアントデバイス６００は、たとえば電子デバイスに印刷されたグラフィックシリーズコードを撮像するための１つ以上のカメラ、スキャナ、または光検出ユニットを備える。クライアントデバイス６００はまた、１つ以上のスピーカおよび／または１つ以上のビジュアルディスプレーを含む、ユーザインターフェースおよびディスプレーコンテンツの提示を可能にする１つ以上の表示デバイス６１２を含む。必要であれば、クライアントデバイス６００は、クライアントデバイス６００の位置を判断するための、ＧＰＳ（全地球測位衛星）または他の地理位置受信機などの、位置検出デバイス６１４を含む。クライアントデバイス６００はまた、たとえばＩＲセンサなどの、メディアデバイス１０６および／またはプレーヤクライアント１０４の近接度を判断するための、近接度判断デバイス６１５を含み得る。クライアントデバイス６００は、入力として使用可能なクライアントデバイス６００の動き、方位、および他のパラメータを検知するための１つ以上のセンサ６１３（たとえば、加速度計、ジャイロスコープなど）を含み得る。
【０１０３】
メモリ６０６は、ＤＲＡＭ、ＳＲＡＭ、ＤＤＲ  ＲＡＭなどの高速ランダムアクセスメモリ、またはその他のランダムアクセス固体記憶装置を含み、必要であれば、１つ以上の磁気ディスク記憶装置、１つ以上の光学ディスク記憶装置、１つ以上のフラッシュメモリデバイスなどの不揮発性メモリ、または１つ以上のその他の不揮発性固体記憶装置を含む。メモリ６０６は必要であれば、１つ以上の処理ユニット６０２から離れて位置する１つ以上のストレージデバイスを含む。メモリ６０６、または代替的にメモリ６０６内の不揮発性メモリは、非一時的なコンピュータ可読記憶媒体を含む。いくつかの実現例では、メモリ６０６またはメモリ６０６の非一時的なコンピュータ可読記憶媒体は、以下のプログラム、モジュール、およびデータ構造、またはこれらのサブセットもしくは上位セットを含む。
【０１０４】
●さまざまな基本システムサービスを処理するための、およびハードウェア依存タスクを実行するためのプロシージャを含むオペレーティングシステム６１６。
【０１０５】
●１つ以上のネットワークインターフェース６０４（有線または無線）およびローカルネットワーク１１０、ならびにインターネット、他のワイドエリアネットワーク、ローカルエリアネットワーク、メトロポリタンエリアネットワークなどの１つ以上の通信ネットワーク１１２を介して、クライアントデバイス６００を他のデバイス（たとえば、サーバシステム１１４、メディアデバイス１０６、および他のクライアントデバイス１０２または１０４）に接続するためのネットワーク通信モジュール６１８。
【０１０６】
●１つ以上の出力デバイス６１２（たとえば、ディスプレー、スピーカなど）を介してクライアントデバイス６００において、情報の提示を可能にするためのユーザインターフェースモジュール６２０（たとえば、アプリケーション、ウィジェット、ウェブサイトおよびそのウェブページ、ならびに／またはゲーム、音声および／もしくは映像コンテンツ、テキストなどを提示するするためのグラフィカルユーザインターフェース）。
【０１０７】
●１つ以上の入力デバイス６１０のうち１つからの１つ以上のユーザ入力またはインタラクションを検出し、検出された入力またはインタラクションを解釈するための入力処理モジュール６２２。
【０１０８】
●セッション１１６に参加するためのウェブインターフェースを含む、ウェブサイトおよびそのウェブページのナビゲーション、リクエスト（たとえばＨＴＴＰを介して）、ならびに表示を行うためのウェブブラウザモジュール６２４。
【０１０９】
●メディアデバイス１０６と関連付けられたユーザアカウントへのロギング、ユーザアカウントと関連付けられている場合はメディアデバイス１０６の制御、ならびにメディアデバイス１０６と関連付けられた設定およびデータの編集およびレビューを含む、メディアデバイス１０６とインタラクトするためのメディアデバイスアプリケーション６２６。
【０１１０】
●ゲームセッションのセットアップ、セッション状態データおよび他のゲーム関連データのローカルな格納、入力デバイス６１０からのゲームプレー入力の受信、ならびにゲームプレー入力に応じたゲームプレー出力（たとえば、画像フレームのシーケンス）の提供を含むがこれらに限定されない、１つ以上のゲームタイトルと関連付けられたクライアント側機能を提供するためのクライアント側ゲームモジュール６２８であって、いくつかの実現例では、クライアント側ゲームモジュール６２８はさらに、１つ以上のゲームタイトルに対応する１つ以上のゲームアプリケーション６２９を含む。
【０１１１】
●データ（たとえば、ゲームコントローラ構成６４０、クライアント側ゲームモジュール６２８および他のアプリケーション、モジュール、アプリケーション、およびメモリ６０６内のデータに対するアップデート）をサーバシステム１１４ならびに他のコンテンツホストおよびプロバイダからダウンロードするためのデータダウンロードモジュール６３０。
【０１１２】
●少なくともゲームアプリケーション６２９および他のアプリケーション／モジュールと関連付けられたデータを格納するクライアントデータ６３２であって、以下を含む。
【０１１３】
○共通のデバイス設定（たとえば、サーバ階層、デバイスモデル、記憶容量、処理能力、通信能力など）を含む、クライアントデバイス６００自体と関連付けられた情報を格納するためのクライアントデバイス設定６３４。
【０１１４】
○アカウントアクセス情報およびデバイス設定のための情報（たとえば、サーバ階層、デバイスモデル、記憶容量、処理能力、通信能力など）のうち１つ以上を含むがこれらに限定されない、メディアデバイスアプリケーション６２６のユーザアカウントと関連付けられた情報を格納するためのメディアデバイス設定６３６。
【０１１５】
○アカウントアクセス情報、ゲーム内のユーザのプリファレンス、ゲームプレー履歴データ、および他のプレーヤについての情報のうち１つ以上を含む、ゲームアプリケーション（複数可）のユーザアカウントと関連付けられた情報を格納するためのゲームアプリケーション６３８（複数可）。
【０１１６】
○ゲームアプリケーション６２８（複数可）についてのクライアント側ゲームモジュール６２８の構成（たとえば、ゲームコントローラ構成４５６から受信された構成、図４）と関連付けられた情報を格納するためのゲームコントローラ構成６４０（複数可）。
【０１１７】
○クライアントデバイス１０２および１０４ならびにメディアデバイス１０６のうちいずれかの存在、近接度または位置と関連付けられた情報を含む位置データ６４２。
【０１１８】
○異なるゲームタイトルと関連付けられたクライアントデバイス６００上で実行されるオンラインゲームセッションと関連付けられた情報、たとえば、最新の状態情報、頂点ページ、定数ページ、およびオンラインゲームセッションの各々と関連付けられた１つ以上の画像フレームのフレームデータを含むローカルゲームセッションデータ６４４。
【０１１９】
図６に示されないいくつかの実現例では 、クライアント側ゲームモジュール６２８は、メニューモードでクライアントデバイス１０２とメディアデバイス１０６との間でメッセージ（たとえば、セットアップコマンド）を送信するためのコマンドモジュール、ゲームプレーモードでクライアントデバイス１０２とサーバシステム１１４との間（たとえば、メディアストリーミングサーバ１２０に対する）ゲームプレーコマンドを送信するためのストリーミングモジュール、およびゲームアプリケーションにゲームプレー入力インターフェースを提供するためのコントローラモジュールを含む。いくつかの実現例では、クライアント側ゲームモジュール６２８は、メディアデバイスアプリケーション６２６またはメモリ６０６内の他のアプリケーションの一部（たとえば、サブモジュール）である。いくつかの実現例では、クライアント側ゲームモジュール６２８は、オペレーティングシステム６１６の一部である。いくつかの実現例では、クライアント側ゲームモジュール６２８は、別個のモジュールまたはアプリケーションである。
【０１２０】
クライアントデバイス１０２のいくつかの実現例では、メディアデバイスアプリケーション６２６（および、それに応じてメディアデバイス設定６３６）ならびにゲームアプリケーション６２９（および、それに応じてゲームアプリケーション設定６３８）は任意である。クライアントデバイス１０２が参加するように招待される特定のゲームに応答して、メディアデバイスアプリケーション６２６およびゲームアプリケーション６２９は、プレーするように要求されない。これらのアプリケーションのいずれかがゲームをプレーするために必要であり（たとえば、ゲームは、メディアデバイスアプリケーション６２６内のクライアント側ゲームモジュール６２８を使用し）、このアプリケーションがメモリ６０６内にない場合、クライアントデバイス１０２は、このアプリケーションをダウンロードするように促される。
【０１２１】
いくつかの実現例では、クライアントデバイス１０２は、ゲームコントローラデバイスを含む。ゲームコントローラデバイスは、マイクロホン（または音声コマンド入力ユニット）、ボタン、方向パッド（複数可）、およびジョイスティック（複数可）などの、ユーザ入力を容易にする１つ以上の入力デバイス６１０を含む。いくつかの実現例では、ゲームコントローラ１０２はさらに、ジェスチャ認識特徴を含む。ゲームコントローラ１０２はまた、スピーカ３２０（複数可）、ＬＥＤ（複数可）、および／または必要であればディスプレーなどの、音声出力および／またはビジュアル出力を容易にする１つ以上の出力デバイスを含む。
【０１２２】
上述のように識別された構成要素の各々は、既に記載したメモリデバイスのうち１つ以上に格納されてもよく、上述の機能を実行するための命令のセットに対応する。上述のように識別されたモジュールまたはプログラム（すなわち、命令のセット）は、別のソフトウェアプログラム、プロシージャ、モジュールまたはデータ構造として実現される必要はなく、そのため、これらのモジュールのさまざまなサブセットはさまざまな実現例で組合わせれてもよい、または他の態様では再配置されてもよい。いくつかの実現例では、メモリ６０６は必要であれば、上述のように識別されたモジュールおよびデータ構造のサブセットを格納する。さらに、メモリ６０６は必要であれば、上述されていない付加的なモジュールおよびデータ構造を格納する。
【０１２３】
図７は、いくつかの実現例に係るゲーム環境１００のメディアデバイス１０６の例を示すブロック図である。メディアデバイス１０６は通常、１つ以上の処理ユニット（ＣＰＵ）７０２、１つ以上のネットワークインターフェース７０４、メモリ７０６、およびこれらのコンポーネント（チップセットとも呼ばれる）を相互接続するための１つ以上の通信バス７０８を含む。必要であれば、メディアデバイス１０６は、ＩＲセンサなどの、クライアントデバイス１０２または１０４の近接度を判断するための近接度／位置検出ユニット７１０を含む。
【０１２４】
さらにいくつかの実現例では、メディアデバイス１０６は、１つ以上の通信ネットワークを使用可能にし、かつ、メディアデバイス１０６に他のデバイスと（たとえば、クライアントデバイス１０２と）通信させる無線機を含む。いくつかの実現例では、無線機は、さまざまなカスタムまたは標準無線プロトコール（たとえば、ＩＥＥＥ  ８０２．１５．４、Ｗｉ−Ｆｉ、ＺｉｇＢｅｅ、６ＬｏＷＰＡＮ、Ｔｈｒｅａｄ、Ｚ−Ｗａｖｅ、Ｂｌｕｅｔｏｏｔｈ  Ｓｍａｒｔ、ＩＳＡ１００．５Ａ、ＷｉｒｅｌｅｓｓＨＡＲＴ、ＭｉＷｉ、Ｗｈｉｓｐｅｒｎｅｔ、Ｂｌｕｅｔｏｏｔｈ ｌｏｗ  ｅｎｅｒｇｙなど）、カスタムまたは標準有線プロトコール（たとえば、Ｅｔｈｅｒｎｅｔ、ＨｏｍｅＰｌｕｇなど）、および／または本特許出願日においてまだ開発されていない通信プロトコールを含む、他の好適な通信プロトコールのうちいずれかを用いてデータ通信が可能である。
【０１２５】
メモリ７０６は、ＤＲＡＭ、ＳＲＡＭ、ＤＤＲ  ＲＡＭなどの高速ランダムアクセスメモリ、またはその他のランダムアクセス固体記憶装置を含み、必要であれば、１つ以上の磁気ディスク記憶装置、１つ以上の光学ディスク記憶装置、１つ以上のフラッシュメモリデバイスなどの不揮発性メモリ、または１つ以上のその他の不揮発性固体記憶装置を含む。メモリ７０６は必要であれば、１つ以上の処理ユニット７０２から離れて位置する１つ以上のストレージデバイスを含む。メモリ７０６、または代替的にメモリ７０６内の不揮発性メモリは、非一時的なコンピュータ可読記憶媒体を含む。いくつかの実現例では、メモリ７０６またはメモリ７０６の非一時的なコンピュータ可読記憶媒体は、以下のプログラム、モジュール、およびデータ構造、またはこれらのサブセットもしくは上位セットを含む。
【０１２６】
●さまざまな基本システムサービスを処理するための、およびハードウェア依存タスクを実行するためのプロシージャを含むオペレーティングシステム７１６。
【０１２７】
●１つ以上のネットワークインターフェース７０４（有線または無線）およびインターネット、他のワイドエリアネットワーク、ローカルエリアネットワーク、メトロポリタンエリアネットワーク、ケーブルテレビシステム、衛星テレビシステム、ＩＰＴＶシステムなどの１つ以上の通信ネットワーク１１２を介して、メディアデバイス１０６を他のコンピュータまたはシステム（たとえば、サーバシステム１１４およびクライアントデバイス１０２）に接続するためのネットワーク通信モジュール７１８。
【０１２８】
●１つ以上のコンテンツソース（たとえば、ゲームセッション１１６からの出力のためのサーバシステム１１４）から受信されたコンテンツ信号を復号し、復号された信号内のコンテンツをメディアデバイス１０６に接続された出力デバイス１０８に出力するためのコンテンツ復号モジュール７２０。
【０１２９】
●近接度検出ユニット７１０によって検出されたまたはサーバシステム１１４によって提供された近接度関連情報に基づいて、クライアントデバイス１０２および／または１０４の近接度を判断するための近接度判断モジュール７２２。
【０１３０】
●メディアディスプレーを制御するためのメディア表示モジュール７２４。
●メディアデバイス１０６上でゲームコンポーネントの全てのライフサイクルを制御し、ゲームコントローラ１０２からメッセージ（たとえば、コマンド）を受信し、ゲームコントローラ入力をサーバシステム１１４にリレーするためのゲームアプリケーション７２６。
【０１３１】
●ユーザコンテンツ（たとえば、プロフィール、アバター、購入されたゲーム、ゲームカタログ、友達、メッセージ）および表示のために最適化された画像にアクセスし、ゲームプレー中にクライアントデバイス１０２から入力を受信するためのゲームユーザインターフェースモジュール７２８。
【０１３２】
●ゲームアプリケーション７２６とゲームユーザインターフェースモジュール７２８との間の通信をインターフェース接続し、ゲーム起動中にサーバシステム１１４とのセッションペアリングリクエストを開始するためのインターフェース制御モジュール７３０。
【０１３３】
●サーバシステム１１４および認証システム（設けられている場合）と通信するためのサーバインターフェースモジュール７３２であり、以下を含む。
【０１３４】
○認証システムと通信してゲームコントローラのリンクされたユーザを認証するための認証サブモジュール７３４。
【０１３５】
○サーバシステム１１４からゲームセッション情報（たとえば、セッションＩＤ、ゲームサーバ提供ＩＰアドレス、ポートなど）を受信し、この情報を提供するインターフェース制御モジュール７３０へのコールバックを呼び出すためのセッションサブモジュール７３６。
【０１３６】
○サーバシステム１１４のメディアストリーミングサーバ１２０から送信されたゲームストリームを、ゲームプレー中にリアルタイムで受信し表示するためのストリーミングサブモジュール７３８。
【０１３７】
●少なくとも以下を含むデータを格納するメディアデバイスデータ７４０。
○アカウントアクセス情報およびデバイス設定（たとえば、サーバ階層、デバイスモデル、記憶容量、処理能力、通信能力など）のための情報を含む、メディアデバイスアプリケーションのユーザアカウントと関連付けられた情報を格納するためのメディアデバイス設定７４２。
【０１３８】
○クライアントデバイス１０２および／または１０４、ならびにメディアデバイス１０６のいずれかの存在、近接度または位置と関連付けられた情報を含む位置データ７４４。
【０１３９】
○異なるゲームタイトルと関連してクライアントデバイス６００上で実行されるオンラインゲームセッションと関連付けられた情報、たとえば、オンラインゲームセッションの各々と関連付けられた１つ以上の画像フレームの最新の状態情報、テクスチャページ、頂点ページ、定数ページ、およびフレームデータと関連してを含むローカルゲームセッションデータ７４６。
【０１４０】
上述のように識別された構成要素の各々は、既に説明されたメモリデバイスのうち１つ以上に格納されてもよく、上述の機能を実行するための命令のセットに対応する。上述のように識別されたモジュールまたはプログラム（すなわち、命令のセット）は、別のソフトウェアプログラム、プロシージャ、モジュールまたはデータ構造として実現される必要はなく、そのため、これらのモジュールのさまざまなサブセットがさまざまな実現例で組合わされてもよい、または他の態様では再配置されてもよい。いくつかの実現例では、メモリ７０６は必要であれば、上述のように識別されたモジュールおよびデータ構造のサブセットを格納する。さらに、メモリ７０６は必要であれば、記載されていないさらに別のモジュールおよびデータ構造を格納する。
【０１４１】
スタティックメモリプール
図８Ａおよび図８Ｂは、いくつかの実現例に係る、１つ以上のゲームタイトルをホストするサーバシステムの格納能力を管理するための方法の例を示すフローチャート８００である。方法８００は必要であれば、コンピュータメモリまたは非一時的なコンピュータ可読記憶媒体（たとえば、図５Ａのサーバ側ゲームモジュール５２６）に格納され、かつ、サーバシステム１１４（たとえば、ゲームサーバ１１８のＣＰＵおよびＧＰＵ）の１つ以上のプロセッサによって実行される命令によって制御される。コンピュータ可読記憶媒体は、磁気もしくは光学ディスク記憶装置、フラッシュメモリなどの固体記憶装置、または他の不揮発性メモリデバイスもしくはデバイスを含み得る。コンピュータ可読記憶媒体に格納される命令は、ソースコード、アセンブリ言語コード、オブジェクトコード、または１つ以上のプロセッサによって解釈される他の命令フォーマットのうち１以上を含み得る。方法８００におけるいくつかの動作は組合わされてもよい、および／または、いくつかの動作の順番は変更されてもよい。
【０１４２】
サーバシステム１１４は、１つ以上のＣＰＵ１３８と、複数のＧＰＵ１４０と、プログラムの実行中にＣＰＵおよび／またはＧＰＵによって使用されるためのプログラムおよびデータを格納するメインダイナミックメモリ１４４と、不揮発性メモリに格納されたスタティックメモリプール２０２と、スタティックメモリプールを管理するように構成されたメモリコントローラ２０４とを備える。ＧＰＵ１４０の各々は、ローカルキャッシュを含み、メモリコントローラ２０４を介してスタティックメモリプール２０２にアクセスするように構成される。いくつかの実現例では、スタティックメモリプール２０２は、サーバシステム１１４の１つ以上のＣＰＵ１３８および複数のＧＰＵ１４０に近接して配設され、これらによって共有される。ＣＰＵ１３８およびＧＰＵ１４０は、データバスを介してスタティックメモリプール２０２にアクセスする。さらにいくつかの実現例では、メインダイナミックメモリ１４４は、サーバシステムの１つ以上のＣＰＵおよび複数のＧＰＵに近接して配設され、これらによって共有される。ＣＰＵ１３８およびＧＰＵ１４０は、データバスを介してメインダイナミックメモリ１４４にアクセスする。いくつかの実現例では、スタティックメモリプール２０２は、サーバシステム１１４の１つ以上のＣＰＵおよび複数のＧＰＵの各々から距離を有し、この距離は、所定の距離閾値よりも小さい（たとえば、＜３メートル）。そうは言っても、スタティックメモリプール２０２は、サーバシステム１１４の１つ以上のＣＰＵおよび複数のＧＰＵがその上に配設されるサーバラックに物理的に位置する。
【０１４３】
いくつかの実現例では、メモリコントローラ２０４は、メインダイナミックメモリとスタティックメモリプールとの両方を管理するように構成される。代替的にいくつかの実現例では、メモリコントローラ２０４は第１のメモリコントローラを含み、サーバシステムはさらに、第１のメモリコントローラから離れた、メインダイナミックメモリを管理するように構成された第２のメモリコントローラを備える。
【０１４４】
サーバシステム１１４は、ゲームタイトルについて１つ以上のＣＰＵ１３８上で並行に複数のゲームセッションを実行する（８０２）。複数のゲームセッションの各々は、スタティックデータ項目と関連付けられており、スタティックデータ項目を用いてそれぞれのＧＰＵ１４０によって実行可能なグラフィックス処理を必要とし、スタティックデータ項目は、スタティックメモリプール２０２に格納される。いくつかの実現例では、グラフィックス処理は、ＯｐｅｎＧＬグラフィックスレンダリングパイプラインの一部であり、頂点処理、テッセレーション、幾何学処理、プリミティブアセンブリ、ラスタ化、フラグメンテーションおよびプリサンプリングのうち１つを含む。いくつかの実現例では、スタティックデータ項目は、ゲーム開発段階中にゲームタイトルの開発者によって事前に定義される。ゲームタイトルがサーバシステムに最初にロードされると、事前に定義されたスタティックデータ項目はスタティックメモリプール１４４にロードされる。いくつかの実現例では、スタティックデータ項目は、ＯｐｅｎＧＬレンダリングパイプラインで使用される１つ以上の標準パラメータを含む。スタティックデータ項目の例は、ＯｐｅｎＧＬライブラリから初めからロードされていた標準テクスチャ、頂点、幾何学、および定数を含むが、これらに限定されない。
【０１４５】
１つ以上のＣＰＵ１３８上で実行される複数のゲームセッションのうち第１のゲームセッションについて（８０４）、ＣＰＵ１３８は、グラフィックス処理を第１のＧＰＵに割当てる（８０６）。第１のＧＰＵは、メモリコントローラ２０４にスタティックデータ項目の第１のコピーをリクエストし（８０８）、スタティックメモリプール２０４から読出されたスタティックデータ項目の第１のコピーをメモリコントローラから受信する（８１０）。いくつかの実現例では、スタティックメモリプールから読出されたスタティックデータ項目の第１のコピーをメモリコントローラから受信すると、第１のＧＰＵは、一時的にローカルキャッシュまたはメインダイナミックメモリに第１のコピーを格納する。第１のＧＰＵはその後、スタティックデータ項目の第１のコピーを用いてグラフィックス処理を実行し（８１２）、複数のゲームセッションのうち第１のゲームセッションと関連して、グラフィックス処理の第１の結果をローカルに格納する（８１４）。いくつかの実現例では、第１のＧＰＵは、複数のＧＰＵコアおよび複数のＧＰＵコアによってシェアされる共通キャッシュを有し、各ＧＰＵコアは、それぞれのＧＰＵコアによって使用される命令およびデータを格納するそれぞれのキャッシュメモリを含む。
【０１４６】
いくつかの実現例では、サーバシステム１１４は、グラフィックス処理を行うために複数のＧＰＵによって使用される１つ以上のコンパイルされたシェーダを格納するシェーダキャッシュを備える。さらにいくつかの実現例では、サーバシステム１１４は、複数のゲームセッションのうち第１のゲームセッションについて性能基準を識別し、この性能基準に従って、複数のコンパイルされたシェーダのうち１つのシェーダを選択する。複数のコンパイルされたシェーダのうち選択された１つのシェーダは、グラフィックス処理を行うために第１のＧＰＵによって使用される。
【０１４７】
同様に、１つ以上のＣＰＵ上で実行される複数のゲームセッションのうち第２のゲームセッションについて（８１６）、ＣＰＵ１３８は、グラフィックス処理を第２のＧＰＵに割当てる（８１８）。第２のＧＰＵは、メモリコントローラにスタティックデータ項目の第２のコピーをリクエストし（８２０）、スタティックメモリプール２０２から読出されたスタティックデータ項目の第２のコピーをメモリコントローラ２０４から受信する（８２２）。第２のＧＰＵはその後、スタティックデータ項目の第２のコピーを用いてグラフィックス処理を実行し（８２４）、複数のゲームセッションのうち第２のゲームセッションと関連して、グラフィックス処理の第２の結果をローカルに格納する。
【０１４８】
いくつかの実現例では、メインダイナミックメモリ１４４はダイナミックランダムアクセスメモリを含み、ＧＰＵのローカルキャッシュおよび１つ以上のＣＰＵのローカルキャッシュの各々は、スタティックランダムアクセスメモリを含む。スタティックメモリプールは、ソリッドステートドライブ、フラッシュメモリおよび相変化ランダムアクセスメモリのうち１つを含む。ローカルキャッシュへのアクセスレートは、スタティックメモリプールへのアクセスレートよりも速いメインダイナミックメモリ１４４へのアクセスレートよりも速い。いくつかの実現例では、スタティックメモリプールへのアクセスによって生じるレイテンシが、それぞれのＧＰＵにおけるゲームコンテンツレンダリングの間に補償される。
【０１４９】
いくつかの実現例では、グラフィックス処理の第１の結果は、複数のゲームセッションのうち第１のゲームセッションと関連して、それぞれのＧＰＵのローカルキャッシュ（たとえば、図３ＣのＧＰＵキャッシュ３６４）に格納される。グラフィックス処理は第１のグラフィックス処理であり、第２のグラフィックス処理が後に続く。第２のグラフィックス処理の実行中、第１のＧＰＵ１４０は、ローカルキャッシュから第１のグラフィックス処理の第１の結果を取得し、第１のグラフィックス処理の第１の結果を用いて第２のグラフィックス処理を行う。必要であれば、第２のグラフィックス処理は、直接または間接的に第１のグラフィックス処理に続く。いくつかの実現例では、第１および第２のグラフィックス処理の両方は、複数のゲームセッションのうち第１のゲームセッションに関与するクライアントデバイスから受信されたユーザリクエストまたは入力に応答してゲームコンテンツストリームを生成するグラフィックスパイプラインプロセス（たとえば、ＯｐｅｎＧＬレンダリングパイプライン）の一部である。一例では、第１および第２のグラフィックス処理の両方は、ＯｐｅｎＧＬレンダリングパイプライン内の２つの連続する処理である。第１の結果は、ＯｐｅｎＧＬレンダリングパイプラインにおいて生成された中間結果であり、第２のグラフィックス処理によって使用された後にローカルキャッシュからパージ可能である。
【０１５０】
代替的にいくつかの実現例では、グラフィックス処理の第１の結果は、複数のゲームセッションのうち第１のゲームセッションと関連してメインダイナミックメモリ１４４に格納される。グラフィックス処理は第１のグラフィックス処理を含み、第２のグラフィックス処理がその後に続く。第２のグラフィックス処理の実行中、第１のＧＰＵ１４０は、メインダイナミックメモリ１４４からグラフィックス処理の第１の結果を取得し、第１のグラフィックス処理の第１の結果を用いて、第１のグラフィックス処理に続く第２のグラフィックス処理を実行する。必要であれば、第１の結果はダイナミックデータ３０６の一部（たとえば、ゲームセッションデータ５６２）として格納される。
【０１５１】
いくつかの実現例では、サーバシステム１１４はさらにエンコーダ１４２を備える。エンコーダ１４２は、第１の結果を、複数のゲームセッションのうち第１のゲームセッションと関連付けられた画像フレームに符号化する。画像フレームは、複数のゲームセッションのうち第１のゲームセッションに関与するクライアントデバイスに提供される。
【０１５２】
いくつかの実現例では、スタティックデータ項目は、グラフィックス処理を行うために複数のＧＰＵ１４０によって使用される１つ以上のコンパイルされたシェーダを含む。さらにいくつかの実現例では、スタティックデータ項目が複数のコンパイルされたシェーダを含む場合、第１のＧＰＵは、複数のゲームセッションのうち第１のゲームセッションについて性能基準を識別し、性能基準に従って、複数のコンパイルされたシェーダのうち１つのシェーダを選択する。複数のコンパイルされたシェーダのうち選択された１つのシェーダは、グラフィックス処理を行うために第１のＧＰＵによって使用される。
【０１５３】
なお、スタティックデータ項目は、複数のゲームセッションのうち第１および第２のゲームセッションを含む複数のゲームセッションの間で共有される。いくつかの実現例では、複数のゲームセッションの各々は優先順位と関連付けられ、第１および第２のＧＰＵの各々は、第１および第２のゲームセッションの優先順位に従ってスタティックメモリプールから読出されたスタティックデータ項目のそれぞれのコピーを、メモリコントローラから受信する。たとえば、第１のゲームセッションは第２のゲームセッションより高い優先順位を有し、第１のＧＰＵは、第２のＧＰＵが第２のコピーをリクエストした後で、閾値時間と同時にまたはこの時間内に第１のコピーをリクエストする。第２のＧＰＵは、第１のＧＰＵがメモリコントローラから第１のコピーを受信するまで、第２のコピーの受信を中断される。
【０１５４】
いくつかの実現例では、スタティックメモリプール２０２はハッシュテーブルを含み、複数のスタティックデータ項目が、ハッシュテーブルに従ってゲームタイトルと関連してスタティックメモリプール２０２に格納される。いくつかの実現例では、スタティックデータ項目は、スタティックデータ項目がリードオンリーであると示すタグと関連付けられる。
【０１５５】
いくつかの実現例では、メモリコントローラ２０４は、スタティックデータ項目を解放する解放リクエストを受信する。解放リクエストに応答して、メモリコントローラ２０４は、スタティック（たとえば、コールド）メモリプールが一杯かどうかを判断する。スタティックメモリプールが一杯であることに従って、メモリコントローラ２０４は、ＬＲＵページ置換方法に基づいてスタティックデータ項目を解放する。スタティックメモリプールが一杯でないことに従って、メモリコントローラ２０４は、スタティックデータ項目の解放を打ち切る。メモリコントローラ２０４は、スタティックメモリプール２０２に格納されたデータを解放するように構成されたページ解放モジュール３７４を含む。
【０１５６】
いくつかの実現例では、スタティックメモリプール２０２は複数のページに分割され、複数のページの各々は、それぞれのページに格納されたデータについて位置を識別するページハッシュを有する。メモリコントローラ２０４は、各ページのページハッシュに従って、スタティックメモリプール２０２に対する読み書きを行う。一例では、このスタティックメモリプール２０２はＰＲＡＭを含む。
【０１５７】
なお、図８Ａおよび図８Ｂの処理が説明された特定の順序は例示に過ぎず、記載された順序が処理を実行可能な唯一の順序を示すと意図されていない。当業者であれば、本明細書で説明されたようなスタティックメモリプールに格納されたデータを用いてオンラインゲームセッションを実行するさまざまな方法が分かるであろう。さらに、なお、方法９００（たとえば、図９）に関して本明細書で説明された他のプロセスの詳細は、図８Ａ〜図８Ｂに関して説明された方法８００に類似の態様でも適用可能である。簡潔に説明するために、これらの詳細はここでは繰り返さない。
【０１５８】
図９は、いくつかの実現例に係る、ゲームタイトルをサーバシステム１１４にロードするための方法９００の例を示すフローチャートである。方法９００は必要であれば、コンピュータメモリまたは非一時的なコンピュータ可読記憶媒体（たとえば、図５Ａのメモリ５０６）に格納され、かつ、サーバシステム１１４の１つ以上のプロセッサ（たとえば、ゲームサーバ１１８のＣＰＵおよびＧＰＵ）によって実行される命令によって制御される。コンピュータ可読記憶媒体は、磁気もしくは光学ディスク記憶装置、フラッシュメモリなどの固体記憶装置、または他の不揮発性メモリデバイスもしくはデバイスを含み得る。コンピュータ可読記憶媒体に格納された命令は、ソースコード、アセンブリ言語コード、オブジェクトコード、または１つ以上のプロセッサによって解釈される他の命令フォーマットのうち１つ以上を含み得る。方法９００におけるいくつかの動作は組合わされてもよい、および／または、いくつかの動作の順番は変更されてもよい。
【０１５９】
サーバシステム１１４は、１つ以上のＣＰＵ１３８と、複数のＧＰＵ１４０と、プログラムの実行中にＣＰＵおよび／またはＧＰＵによって使用されるためのプログラムおよびデータを格納するメインダイナミックメモリ１４４と、不揮発性メモリに格納されたスタティックメモリプール２０２と、スタティックメモリプールを管理するように構成されたメモリコントローラ２０４とを備える。ＧＰＵ１４０の各々は、メモリコントローラ２０４を介してスタティックメモリプール２０２にアクセスするように構成される。
【０１６０】
ＣＰＵ１３８は、ゲームタイトルに対応する実行可能なゲームプログラム（たとえば、サーバ側ゲームモジュール５２６）を、メインダイナミックメモリ１４４にロードする（９０２）。ＣＰＵ１３８は、並行して複数のゲームセッションを実行する（９０４）ように構成され、ゲームセッションの各々は、実行可能なゲームプログラムに対応する。複数のオンラインゲームセッションの各々は、それぞれのオンラインゲームセッションをレンダリングするように割当てられたそれぞれのＧＰＵによって実行可能なグラフィックス処理を必要とする（９０６）。
【０１６１】
ＣＰＵ１３８は、複数のゲームセッションのグラフィックス処理で用いられるスタティックデータ項目を識別する（９０８）。いくつかの実現例では、スタティックデータ項目は第１のスタティックデータ項目を含み、第１のスタティックデータ項目は、所定のスタティックデータ項目のリストにおいてＣＰＵ１３８によって識別される。所定のスタティックデータ項目のリストは、スタティックデータ項目の第１のサブセットとスタティックデータ項目の第２のサブセットとを含む。メモリコントローラは、第１のスタティックデータ項目を含むスタティックデータ項目の第１のサブセットをスタティックメモリプール２０２に格納し、スタティックデータ項目の第２のサブセットをメインダイナミックメモリ１４４に格納する。
【０１６２】
メモリコントローラ２０４は、スタティックデータ項目をスタティックメモリプールに格納し（９１０）、オンラインゲームセッションを実行しているＧＰＵに、グラフィックス処理を実行しつつスタティックデータ項目へアクセスすることを許可する（９１２）。いくつかの実現例では、スタティックデータ項目はゲームタイトルのレンダリングで使用される標準スタティックデータ項目である。スタティックデータ項目のスタティックメモリプールへの格納の前に、ＣＰＵ１３８は、サーバシステム１１４のハードドライブ３２４またはリモートライブラリサーバからスタティックデータ項目を取出す。たとえば、スタティックデータ項目は、シェーダライブラリサーバ１２４に格納されたシェーダプログラムを含む。ＣＰＵ１３８は、シェーダライブラリサーバ１２４からシェーダプログラムを取得し、ゲームタイトルをロードする過程において、スタティックメモリプール２０２にこれを格納する。代替的にいくつかの実現例では、スタティックデータ項目は、ゲームタイトルの開発者によって事前に定義されサーバシステム１１４のハードドライブ３２４に格納されたカスタムスタティックデータ項目である。スタティックデータ項目のスタティックメモリプールへの格納の前に、ＣＰＵ１３８は、サーバシステム１１４のハードドライブ３２４からスタティックデータ項目を取出す。ゲームタイトルのサーバシステム１１４へのロードについては、図４Ａを参照して詳細に説明されている。
【０１６３】
いくつかの実現例では、実行可能なゲームプログラムに従って、ＣＰＵ１３８は、複数のＧＰＵの各々を、その上で実行されるべき複数のオンラインゲームセッションのサブセットに割当てる。複数のゲームセッションの各々について、それぞれのＧＰＵによるグラフィックス処理の実行中、それぞれのＧＰＵ１４０は、メモリコントローラを介してスタティックメモリプールからスタティックデータ項目のコピーを取得し、スタティックデータ項目のコピーを用いてグラフィックス処理を行う。いくつかの実現例では、複数のゲームセッションの各々について、それぞれのＧＰＵによるグラフィックス処理の実行中、それぞれのＧＰＵ１４０は、スタティックデータ項目のコピーをそれぞれのＧＰＵのそれぞれのローカルキャッシュにロードする。さらにいくつかの実現例では、複数のゲームセッションの各々について、それぞれのＧＰＵによるグラフィックス処理の実行中、それぞれのＧＰＵ１４０は、それぞれのオンラインゲームセッションと関連して、ダイナミックデータ項目およびユーザ情報をメインダイナミックメモリ１４４に格納する。いくつかの実現例では、複数のゲームセッションのサブセットについて、ＧＰＵ１４０は、スタティックデータ項目のコピーをＧＰＵのローカルキャッシュに一度ロードし、複数のゲームセッションのサブセットに対応するＧＰＵのサブセットによってスタティックデータ項目のコピーを共有する。スタティックデータ項目を用いたオンラインゲームセッションの画像フレームのレンダリングは、図４Ｂおよび図８Ａ〜図８Ｂを参照して、より詳細に説明された。
【０１６４】
なお、図９の動作が説明された特定の順序は例示に過ぎず、説明された順序は動作を実行可能な唯一の順序を示すと意図されていない。当業者であれば、本明細書で説明されたように、ゲームタイトルをサーバシステム１１４にロードするさまざまな方法が分かるであろう。さらに、なお、方法８００（たとえば、図８Ａ〜図８Ｂ）に関して本明細書で説明された他のプロセスの詳細も、図９に関して説明された方法９００と類似の態様で適用可能である。簡潔に説明するために、これらの詳細はここでは繰り返さない。
【０１６５】
シェーダ最適化
オンラインゲームセッションのために画像フレームをレンダリングする過程において、ＧＰＵ１４０は、他のパイプライン状態データと共にソース形式（ＧＬＳＬ、ＨＬＳＬ）または中間形式（ＤＸＩＬ、ＳＰＩＲ−Ｖ）でシェーダを取得し、ＧＰＵが使用するためのシェーダをコンパイルして、ゲームコンテンツをレンダリングする（たとえば、オンラインゲームセッションと関連付けられた画像フレームのシーケンスを出力する）。シェーダコンパイルは費用がかかる場合がある。たとえば、ゲームアプリケーションのなかには、各々が数ミリ秒かかるシェーダを１００，０００以上コンパイルすることを必要とするものもある。シェーダコンパイルがユーザ入力に応答してリアルタイムに行われる場合、長い時間がかかり、ユーザ体験が損なわれてしまう。状況によっては、シェーダコンパイルは、コンパイル時間を削減する目的で簡潔にされるが、結果として生じるコンパイルされたシェーダの質は、シェーダコンパイルの時間が制約された性質のために損なわれる。このパラグラフから次の８番目のパラグラフまでの説明は、開示されたもののコピーである。
【０１６６】
本出願のいくつかの実現例では、ＧＰＵ１４０は、サーバシステム１１４内の計算リソースへの高速パスによって接続されている。コンパイルされたパイプラインのフリートワイドキャッシングが事前に用意され、コンパイラ入力のハッシュによってインデックスを付けられ、ローカルに格納されて、シェーダコンパイル時間を削除または削減する。さらにいくつかの実現例では、手動でまたは遅いがより効果的なシェーダパイプラインコンパイラ（たとえば、図５Ａのシェーダパイプラインオプティマイザ５３４）によってフリートワイド性能分析を行って、より広範囲にわたる最適化のために候補シェーダを識別可能である。いくつかの実現例では、コンパイルされたシェーダはフリートワイドキャッシュ（たとえば、シェーダキャッシュ３１８）において、より高性能のシェーダ、すなわち他の特徴を有するシェーダにダイナミックに置換えられる。いくつかの実現例では、性能に基づく最適化ステージのために特化されたシェーダと含む異なるコンパイルされたシェーダのセットが、特定の状況での展開のために格納される。いくつかの実現例では、ゲームコンテンツレンダリングで用いられるシェーダは、シェーダパイプラインコンパイラ（たとえば、コンパイラ５３２）が改良されていると再コンパイルされ、ゲームアプリケーション自体は、これらのシェーダ最適化動作によって影響されない。いくつかの実現例では、ゲームドライバ（図５Ａではサーバ側ゲームモジュール５２６とも呼ばれる）を混乱させることなく、詳細な分析が特徴使用について実現される。いくつかの実現例では、ＧＰＵ１４０上で実行されているゲームドライバ（すなわち、サーバ側ゲームモジュール５２６）を混乱させることなく、特定のゲームタイトルについて、特化されたシェーダがコンパイルされ、検査され、選択される。
【０１６７】
いくつかの実現例では、ゲームドライバ（具体的には、サーバ側ゲームモジュール５２６のシェーダパイプラインオプティマイザ５３４）は、グラフィックスを供給する全てのＧＰＵで実行されるゲームドライバ内のシェーダパイプライン生成／コンパイル呼出しを透過的にインターセプトする。ゲームドライバは、シェーダコンパイラに対する全ての入力のハッシュを評価し、一致するコンパイルされたシェーダについてシェーダパイプラインサーバ（またはシェーダキャッシュ）にリクエストを送信する。シェーダパイプラインサーバまたはキャッシュが一致するシェーダがないと返す場合（またはアイムアウト）、ゲームドライバは、従来のコンパイルパイプラインを使用し、結果をシェーダパイプラインサーバまたはシェーダキャッシュに格納し、さらに、それをオンラインゲームセッションのために用いる。シェーダパイプラインサーバは、多くの態様で実現され得る。シェーダパイプラインサーバは必要であれば、中央の１つのサーバ、または標準分散データベース技術（遅いレイテンシアクセスについてのレプリケーションを含む）を採用するサーバの分散／連合セットである。
【０１６８】
いくつかの実現例では、ゲームドライバ（具体的には、サーバ側ゲームモジュール５２６のシェーダパイプラインオプティマイザ５３４）は、フリートワイド分析および性能に基づく最適化を行う。フリートワイド分析の例は、時間分析、シェーダ性能分析および消費電力分析を含む。具体的には、いくつかの実現例では、セッションのサンプルセットが、ゲームタイトルと関連付けられた全てのオンラインゲームセッションから選択される。これらのロード（すなわち、サンプリングされたセッション）は、各シェーダパイプラインを実行するために必要な時間の収集および中央データベースへの報告に特化したゲームドライバによって実行される。必要であれば、サンプリングされたセッションは、フォアグラウンドで同時にオンラインゲームセッションを実行するゲームサーバ１１８を用いてバックグラウンドで分析される。状況によっては、この計測はゲームアプリケーション（およびそれゆえユーザ体験）を混乱させることがあり、そのため、サンプリングされたセッションは、別のパイプラインオプティマイザサーバ１５０上で分析される。これによって、使用統計を集めつつ、ユーザ体験は高品質を保つことができる。いくつかの実現例では、シェーダパイプラインオプティマイザ５３４は、オンラインゲームセッション内で選択的に、たとえば、特定のシェーダまたは画像フレームのサブセットのサンプリングを行って、フォアグラウンドでのゲームコンテンツレンダリングへの影響を低減する。次に、これらのタイミングを用いて、さらなる最適化のための好ましい候補シェーダを選択し、手動レビューまたは自動システムを呼出して、シェーダを精緻化する。代替的にいくつかの実現例では、シェーダパイプライン（すなわち、コンパイルされたシェーダのシーケンス）を最適化するために、消費電力が監視され使用される。具体的には、シェーダパイプラインオプティマイザ５３４は、タイミング性能ではなくパワードローを計測するように取付けられている。
【０１６９】
詳細なシェーダ分析を含むいくつかの実現例では、シェーダパイプラインオプティマイザ５３４は、修正されたシェーダおよび粒子の細かいシェーダ実行情報を収集するドライバを選択して、たとえば、各基本ブロックを、補助ＧＰＵバッファ内にタグを出すように取付ける。補助ＧＰＵバッファはその後、ローカルに分析される、または、我々の（たとえば、データベース１６０に含まれる）分析データベースに全体がアップロードされる。取付けられたシェーダは、製造ドライバを混乱させることなく、我々のフリートワイドシェーダパイプラインキャッシュ内のアセットからオフラインで生成される。
【０１７０】
シェーダ特殊化のいくつかの実現例では、（多くの場合、高度な訓練を受けた技術者によって手動で）人気のあるゲームタイトル／アプリケーションについてシェーダを特殊化するためにフリークエントオプティマイゼーション（frequent optimization）がシェーダパイプラインオプティマイザ５３４で適用されて、マシンコンパイルされたコードを手動で調整されたコードで置換える。フリートワイドキャッシュは、フリートワイドキャッシュにおいてコンパイルされたシェーダパイプラインを置換えることによってドライバを再展開することなく、この置換を行うために使用される。いくつかの実現例では、コンパイルされたシェーダの複数のバージョンがフリートワイドキャッシュに格納され、異なる統計分析を行うために展開される。いくつかの実現例では、電力最適化シェーダおよび性能最適化シェーダの両方がシェーダキャッシュに格納されるが、たとえばゲームのピーク消費電力を管理するために、性能基準に従ってダイナミックに展開される。なお、これは多数の性能管理軸、たとえば、電力、時間、メモリ使用量およびコードサイズに及ぶ。さらにいくつかの実現例では、
コンパイラアップデートおよびプロファイリングを含むいくつかの実現例では、シェーダパイプラインオプティマイザ５３４は、シェーダコンパイラの新しいバージョンをシェーダキャッシュ内の全てのシェーダに対して実行し、シェーダコンパイラの前のバージョンと一緒にシェーダのこのシェーダコンパイラの新しいバージョンを格納する。オプティマイザ５３４はその後、オンラインゲームセッションのサンプルを用いて新しいシェーダコンパイラを実行し、性能影響を計測し、新しいシェーダコンパイラの適合性を判断する。これらの手段によって、コンパイルされたシェーダとシェーダコンパイラとの両方が、ゲームモジュールのゲームコンテンツレンダリングを混乱させることなく、バックグランドでダイナミックに改良される。
【０１７１】
いくつかの実現例では、サーバシステム１１４は、内部ユーザおよび外部ユーザについて分散シェーダパイプラインキャッシュに問合わせるためにアプリケーションプログラミングインターフェース（ＡＰＩ）を備える。分散シェーダパイプラインキャッシュは、所与の入力のセットについて問合わされて、さらなる検査および分析が可能になる。たとえば、マップリデューススタイルクエリが、個々のシェーダおよびシェーダパイプラインのフリートワイド分析について分散シェーダパイプラインキャッシュ上で実行される。このＡＰＩは、デプスオンリーパスについて最も使用される命令のブレンドであり、Ｄｒｅｍｅｌなどに対するエクスポートパイプラインとして実現され得る。さらに、ＡＰＩは、インフラストラクチャとしてのパイプライン−シェーダ−コンパイラを活用することによって、コンパイラエクスポローラインターフェースを提供するように構成される。
【０１７２】
図１０は、いくつかの実現例に係る、サーバシステム１１４においてゲームコンテンツレンダリングと同時にパイプラインされたシェーダを最適化するプロセス１０００の例を示す図である。いくつかの実現例において図５Ａに示すように、サーバ側ゲームモジュール５２６は、同時ゲームコンテンツレンダリングおよびシェーダパイプライン最適化を可能にするように協働して機能するゲームアプリケーション５２８と、シェーダパイプラインオプティマイザ５３４と、ゲームレンダリングモジュール５３８と、シェーダキャッシュ３１８とを含む。具体的には、ゲームアプリケーション５２８がフォアグラウンドでグラフィックスパイプラインプロセスにおいてオンラインゲームセッションを実行する一方で、シェーダパイプラインオプティマイザ５３４は、バックグラウンドでこのグラフィックスパイプラインプロセスにおいて使用されるコンパイルされたシェーダを最適化する。
【０１７３】
サーバシステム１１４のＣＰＵ１３８は、ゲームタイトルに対応するゲームアプリケーション５２８を実行して、複数のオンラインゲームセッションを並行して実行する。ＣＰＵ１３８は、ＧＰＵ１４０のサブセットの各々を割当てて、複数のオンラインゲームセッション（たとえば、１つ以上のセッション）のサブセットを実行する。ＧＰＵ１４０はその後、コンパイルされたシェーダの第１のシーケンスを識別し、コンパイルされたシェーダの識別された第１のシーケンスを用いて、オンラインゲームセッションの各々について複数の画像フレームをレンダリングする。いくつかの実現例では、コンパイルされたシェーダの第１のシーケンスがシェーダキャッシュ３１８に格納されており、一度識別されており、直接シェーダキャッシュからＧＰＵ１４０にロードされて、ゲームアプリケーション５２８の命令に従って、オンラインゲームセッションのために画像フレームをレンダリングする。いくつかの実現例では、複数のオンラインゲームセッションの実行は特定の性能基準に従う必要があり、コンパイルされたシェーダの第１のシーケンスは、オンラインゲームセッションの各々について画像フレームをレンダリングするために使用される前に、特定の性能基準に従って識別される。
【０１７４】
ＧＰＵが複数のオンラインゲームセッションを実行する一方で、シェーダパイプラインオプティマイザ５３４は、バックグラウンドでコンパイルされたシェーダの第１のシーケンスを最適化する。別の言い方をすれば、ＣＰＵ１３８は、サーバシステム１１４内のＣＰＵおよびＧＰＵの未使用のサブセットを割当てて、１つ以上の性能基準に関して、コンパイルされたシェーダの代替的なシーケンスまたはコンパイルされたシェーダの第１のシーケンスの他のバージョンを識別する。必要であれば、ゲームサーバ１１８はまた、シェーダパイプライン最適化について割当てられたＣＰＵおよびＧＰＵの未使用のサブセットと、オンラインゲームセッションを実行するアクティブなＣＰＵおよびＧＰＵとの両方を含む。必要であれば、ゲームサーバ１１８とは異なるパイプラインオプティマイザサーバ１５０は、シェーダパイプライン最適化について割当てられたＣＰＵとＧＰＵとのサブセットを含む。
【０１７５】
具体的には、ゲームアプリケーション５２８が複数のオンラインゲームセッションを実行する一方で、シェーダパイプラインオプティマイザ５３４は、ゲームタイトルと関連付けられた複数のオンラインゲームセッションについて性能基準を識別し、コンパイルされたシェーダの第１のシーケンスを用いて、オンラインゲームセッションの各々の実行を特徴付ける使用統計を収集する。シェーダパイプラインオプティマイザ５３４は、使用統計を分析し、コンパイルされたシェーダの第１のシーケンスの性能が性能基準に関してさらに改良可能であると判断する。たとえば、シェーダパイプラインオプティマイザ５３４は、コンパイルされたシェーダの第１のシーケンスの第１のシェーダの修正がコンパイルされたシェーダの第１のシーケンスの性能を性能基準に関して改良すると判断し、そのため、第１のシェーダを修正して、コンパイルされたシェーダの修正された第１のシーケンスを生成する。いくつかの実現例では、シェーダパイプラインオプティマイザ５３４はさらに、コンパイルされたシェーダの第１のシーケンス内の１つ以上の第２のシェーダを修正して、性能基準に関してコンパイルされたシェーダの第１のシーケンスの性能を改良する。
【０１７６】
いくつかの実現例では、シェーダパイプラインオプティマイザ５３４は、コンパイルされたシェーダの第１のシーケンスを性能基準に関して最適化するように構成された自動オプティマイザ１００２を含む。そうは言っても、自動オプティマイザ１００２は、シェーダキャッシュからコンパイルされたシェーダの第１のシーケンスを取得し、コンパイルされたシェーダの第１のシーケンスの性能を性能基準に関して改良するために、自動的にユーザの介入なしで、コンパイルされたシェーダの第１のシーケンス内の第１のシェーダを修正する。代替的にいくつかの実現例では、シェーダパイプラインオプティマイザ５３４は、ユーザにコンパイルされたシェーダの第１のシーケンスを性能基準に関して手動で最適化させるユーザインターフェースを提供するように構成された手動オプティマイザ１００４を含む。管理者ユーザは、管理者クライアントデバイス１０２上で実行されているゲーム開発プラットフォーム上で管理者アカウントにログオンする。ユーザインターフェースは、性能基準、使用統計および他の関連情報項目を提示して、手動最適化を容易にする。サーバシステム１１４は、コンパイルされたシェーダの第１のシーケンス内の第１のシェーダを修正する命令を受信し、そのため、第１のシェーダは、ユーザ命令に応答して、コンパイルされたシェーダの第１のシーケンス内で修正される。さらにいくつかの実現例では、パイプラインシェーダオプティマイザ５３４は、自動オプティマイザ１００２および手動オプティマイザ１００４の両方を含み、自動最適化、手動最適化、またはこれらの組合せをサポートする。
【０１７７】
さらにいくつかの実現例では、コンパイルされたシェーダの第１のシーケンス内の第１のシェーダを置換えるために、代替的なシェーダオプションのグループから代替的なシェーダが選択される。必要であれば、自動オプティマイザ１００２は、コンパイルされたシェーダの第１のシーケンスの性能を性能基準に関して改良するために、自動的に代替的なシェーダオプションを識別し、代替的なシェーダを選択する。必要であれば、自動オプティマイザ１００２は、代替的なシェーダオプションを自動的に識別するが、管理者ユーザは、手動オプティマイザ１００４によって代替的なシェーダを選択するように促される。必要であれば、手動オプティマイザ１００４は、関連情報項目を提供して、管理者ユーザに代替的なシェーダオプションの識別および代替的なシェーダの選択を促す最適化プロセスを容易にする。
【０１７８】
図１０を参照すると、いくつかの実現例では、コンパイルされたシェーダの修正された第１のシーケンスは、シェーダキャッシュ内のコンパイルされたシェーダの第１のシーケンスが生成された後にそれに置換わる。代替的にいくつかの実現例では、コンパイルされたシェーダの第１のシーケンスおよびコンパイルされたシェーダの修正された第１のシーケンスは、コンパイルされたシェーダの第１のシーケンスの２つのバージョンとして格納される。続いて、サーバシステム１１４は、オンラインゲームセッションの各々の実行を特徴付ける次の使用統計を収集し、次の使用統計に従って、ＧＰＵは、コンパイルされたシェーダの第１のシーケンスの２つのバージョンのうち１つを選択して、複数のオンラインゲームセッションの各々について複数の画像フレームのレンダリングを行い得る。
【０１７９】
代替的にいくつかの実現例では、性能基準は第１の性能基準を含み、複数のオンラインゲームセッションは、第１の基準とは別の第２の性能基準に従ってレンダリングおよび実行される。パイプラインオプティマイザ５３４は、シェーダキャッシュ３１８が、第１の性能基準をコンパイルされたシェーダの修正された第１のシーケンスと、および第２の性能基準をコンパイルされたシェーダの第１のシーケンスと関連付けることを可能にする。
【０１８０】
いくつかの実現例では、シェーダパイプラインオプティマイザ５３４は、バックグラウンドで２つ以上の性能基準について最適化されたシェーダパイプラインを取得する。性能基準は第１の性能基準を含み、コンパイルされたシェーダの修正された第１のシーケンスは、シェーダキャッシュ内の第１の性能基準と関連して記憶される。コンパイルされたシェーダの修正された第１のシーケンスを識別した後で、シェーダパイプラインオプティマイザ５３４は、コンパイルされたシェーダの第１のシーケンスの性能を第２の性能基準に関して改良するために、ゲームタイトルと関連付けられた複数のオンラインゲームセッションについて第２の性能基準を識別し、コンパイルされたシェーダの第２のシーケンスを判断する。コンパイルされたシェーダの第２のシーケンスは、第２の性能基準に関連してシェーダキャッシュ３１８に格納される。
【０１８１】
シェーダキャッシュ３１８がコンパイルされたシェーダの複数のシーケンスを含む場合、複数の性能基準の各々をコンパイルされたシェーダのそれぞれのシーケンスと関連付けるシェーダハッシュテーブル１００６を確立し、これを格納する（図１１Ｂ）。性能基準およびコンパイルされたシェーダの第１のシーケンスは、シェーダハッシュテーブル内で関連付けられている。必要であれば、コンパイルされたシェーダの第１のシーケンスは、複数のバージョンを有し得る。使用統計はユーザ入力情報を含み、第１のシーケンスの複数のバージョンが、ユーザ入力の異なる情報と関連付けられる（図１１Ｃ）。たとえば、最も人気のあるユーザ入力が第１のユーザ入力（たとえば、ジャンプ）である場合、コンパイルされたシェーダの第１のシーケンスの第１のバージョンが、対応する性能基準を満たすために使用され、最も人気のあるユーザ入力が第２のユーザ入力（たとえば、シューティング）である場合、コンパイルされたシェーダの第１のシーケンスの第２のバージョンが、対応する性能基準を満たすために使用される。さらにいくつかの実現例では、シェーダハッシュテーブルは、使用統計に従ってダイナミックにアップデートされる。
【０１８２】
なお、性能基準は、複数のオンラインゲームセッションを実行する過程において、コンパイルされたシェーダの第１のシーケンスの全消費電力、コードサイズ、平均レイテンシ、全キャッシュ使用量、および全メモリ使用量のうち１つ以上に対応する。たとえば、性能基準は、コードサイズが閾値サイズよりも低いことを必要とする。他の例では、性能基準は、使用統計を考慮して、消費電力が閾値電力レベルまで低減されることを必要とする。
【０１８３】
いくつかの実現例では、使用統計は、複数のオンラインゲームセッションの各々に対応するコンパイルされたシェーダの第１のシーケンスのユーザ入力、消費電力、１つ以上のゲームレイテンシ、コードサイズ、メモリ使用量およびキャッシュ使用量を含む。特定の例では、使用統計は、複数のオンラインゲームセッションの全消費電力を含む。第１の性能基準および第２の性能基準はそれぞれ、複数のオンラインゲームセッションの応答時間および電力使用量に対応する。複数のオンラインゲームセッションの全消費電力が事前に定義された電力閾値を超えており、低減する必要があるという判断に従って、ゲームアプリケーション５２８は、コンパイルされたシェーダの第２のシーケンスを選択し、コンパイルされたシェーダの第２のシーケンスを用いて複数のゲームセッションの各々について複数の画像フレームのレンダリングを行って、第２の性能基準に従って複数のオンラインゲームセッションの全消費電力を改良する。
【０１８４】
図１１Ａは、いくつかの実現例に係る、パイプラインされたシェーダを最適化するプロセスの例を示す図である。ゲームタイトルに関連する複数のオンラインゲームセッションは、ＯｐｅｎＧＬレンダリングパイプラインを用いて実行される。ＯｐｅｎＧＬレンダリングパイプラインは少なくとも、頂点処理（たとえば、スクリーン空間内への頂点の変形）、プリミティブ処理（たとえば、クリップされ間引かれたプリミティブへの頂点の編成）、ラスタ化（たとえば、プリミティブのピクセルフラグメントへのラスタ化）、フラグメント処理（たとえば、各ピクセルにおいて色を計算するためのフラグメントのシェーディング）、およびピクセル処理（たとえば、フラグメントのそれらのピクセル位置におけるフレームバッファへのブレンディング）を含む処理のサブセットを含む。特定の例では、ＯｐｅｎＧＬレンダリングパイプラインは、オンラインゲームセッションの各々について画像フレームをレンダリングするために９つの連続したパイプライン処理またはステージを含む。これらの９つの連続したパイプラインステージは、以下のサブセットまたは全てを含む。
【０１８５】
●頂点アレイデータを準備するための頂点仕様１１０２。
●各頂点に作用するための頂点シェーダ１１０４。
【０１８６】
●必要に応じて頂点データのパッチをより小さなプリミティブに細分するためのテッセレーション１１０６。
【０１８７】
●必要に応じてより小さなプリミティブを出力プリミティブに変換するための幾何学シェーダ１１０８。
【０１８８】
●変形フィードバック、プリミティブクリッピング、透視除算、ビューポート変換を含むがこれらに限定されない、最新のステージの出力プリミティブの調整および異なる位置への発送のための頂点後処理１１１０。
【０１８９】
●出力プリミティブを個々の基本プリミティブのシーケンスに分割するためのプリミティブアセンブリ１１１２。
【０１９０】
●プリミティブのサンプルカバレッジに基づいて個々のプリミティブを個別のエレメント（フラグメントとも呼ばれる）に分解するためのラスタ化１１１４。
【０１９１】
●ラスタ化によって生成された各フラグメントを色のセットおよび１つの深度値に処理するためのフラグメントシェーダ１１１６。
【０１９２】
●エンコーダ１４２によって処理可能なゲームプレーマルチメディアコンテンツに色のセットおよび１つの深度値を処理するための、たとえば、ピクセルオーナーシップテスト、シザーテスト、マルチサンプル処理、ステンシルテスト、深度テスト、オクルージョンクエリアップデート、ブレンディング、ｓＲＧＢ変換、ディザリング、論理演算、および書込みマスク論理演算を含むがこれらに限定されない、標準化、速度および／または圧縮のためのプリサンプル処理１１１８。
【０１９３】
オンラインゲームセッションのサブセットを実行するように割当てられた各ＧＰＵ１４０は、オンラインゲームセッションのサブセットの各セッションについて、９つの連続したパイプラインステージを実行する。いくつかの実現例では、頂点シェーダ１１０４、テッセレーション１１０６、幾何学シェーダ１１０８およびフラグメントシェーダ１１１６の各々は、プログラム可能なシェーダのそれぞれのセットを含む。プログラム可能なシェーダのそれぞれのセット内のシェーダについて、シェーダパイプラインオプティマイザ５３４は、それぞれのシェーダを修正するオプションを有しており、これによって、シェーダパイプラインの修正されたシーケンスを生成する。
【０１９４】
より具体的には、一例では、ゲームアプリケーション５２８は複数のゲームセッションを実行し、コンパイルされたシェーダの第１のシーケンスを用いて複数のオンラインゲームセッションの各々について、複数の画像フレームをレンダリングする。コンパイルされたシェーダの第１のシーケンスは、プログラム可能なシェーダである頂点シェーダ１１０４Ａ、テッセレーションシェーダ１１０６Ａ、幾何学シェーダ１１０８およびフラグメントシェーダ１１１６Ａを含む。複数のオンラインゲームセッションがフォアグラウンドで実行される一方で、シェーダパイプラインオプティマイザ５３４は、ゲームタイトルと関連付けられた複数のオンラインゲームセッションについて性能基準を識別し、オンラインゲームセッションの各々を特徴付ける使用統計を収集する。その結果、シェーダパイプラインオプティマイザ５３４は、コンパイルされたシェーダの第１のシーケンスの性能を性能基準に関して改良するために、コンパイルされたシェーダの第１のシーケンス内の頂点シェーダ１１０４Ａおよびテッセレーションシェーダ１１０６Ａを修正すると判断して、コンパイルされたシェーダの修正された第１のシーケンスを生成する。
【０１９５】
具体的には、シェーダパイプラインオプティマイザ５３４は、コンパイルされたシェーダの修正された第１のシーケンス内の幾何学シェーダ１１０８Ａおよびフラグメントシェーダ１１１６Ａを維持しつつ、頂点シェーダ１１０４Ａおよびテッセレーションシェーダ１１０６Ａを頂点シェーダ１１０４Ｎおよびテッセレーションシェーダ１１０６Ｂと置換える。コンパイルされたシェーダの修正された第１のシーケンスはその後、性能基準に関連してシェーダキャッシュに格納される。
【０１９６】
図１１Ｂは、いくつかの実現例に係る、コンパイルされたシェーダの複数のシーケンスを複数の性能基準と関連付けるシェーダハッシュテーブル１００６を示す図である。図１１Ｃは、いくつかの実現例に係る、コンパイルされたシェーダのシーケンスの複数のバージョンを複数のユーザ入力と関連付けるシェーダハッシュテーブル１１８０を示す図である。シェーダキャッシュ３１８がコンパイルされたシェーダの複数のシーケンスを含む場合、複数の性能基準の各々をコンパイルされたシェーダのそれぞれのシーケンスと関連付けるシェーダハッシュテーブル１００６を確立し、これを格納する。たとえば、性能基準（性能基準１）とコンパイルされたシェーダの第１のシーケンスとは、シェーダハッシュテーブルにおいて関連付けられる。必要であれば、コンパイルされたシェーダの第１のシーケンスは、異なる仕様統計に対応する複数のバージョンを有し得る。いくつかの実現例では、使用統計はユーザ入力情報を含み、第１のシーケンスの複数のバージョンがユーザ入力の異なる情報と関連付けられる。たとえば、最も人気のあるユーザ入力が第１のユーザ入力（たとえば、ジャンプ）である場合、コンパイルされたシェーダの第１のシーケンスの第１のバージョンが、対応する性能基準を満たすために使用され、最も人気のあるユーザ入力が第２のユーザ入力（たとえば、シューティング）である場合、コンパイルされたシェーダの第１のシーケンスの第２のバージョンが、対応する性能基準を満たすために使用される。さらにいくつかの実現例では、シェーダハッシュテーブル１０５０は、使用統計に従ってダイナミックにアップデートされる。
【０１９７】
図１２は、いくつかの実現例に係る、（たとえば、画像レンダリングのバックグラウンドでのパイプラインされたシェーダの最適化を含む）複数のオンラインゲームセッションについて画像フレームをレンダリングする方法１２００の例を示すフローチャートである。方法１３００は必要であれば、コンピュータメモリまたは非一時的なコンピュータ可読記憶媒体（たとえば、図５Ａのシェーダパイプラインオプティマイザ５３４）に格納され、かつ、サーバシステム１１４の１つ以上のプロセッサによって実行される命令によって制御される。コンピュータ可読記憶媒体は、磁気もしくは光学ディスク記憶装置、フラッシュメモリなどの固体記憶装置、または他の不揮発性メモリデバイスもしくはデバイスを有し得る。コンピュータ可読記憶媒体に格納される命令は、ソースコード、アセンブリ言語コード、オブジェクトコード、または１つ以上のプロセッサによって解釈される他の命令フォーマットのうち１つ以上を含み得る。方法１２００におけるいくつかの動作は組合わされてもよい、および／または、いくつかの動作の順番は変更されてもよい。
【０１９８】
方法１２００は、サーバシステム１１４において実現される。サーバシステム１１４は、１つ以上のＣＰＵ１３８と、１つ以上のＧＰＵ１４０と、プログラムの実行中にＣＰＵおよび／またはＧＰＵによる使用のためのプログラムおよびデータを格納するメインダイナミックメモリ１４４と、シェーダキャッシュ３１８とを備える。１つ以上のＣＰＵは、ゲームタイトルについて複数のオンラインゲームセッションを並行して実行する（１２０２）。１つ以上のＣＰＵは、ＧＰＵ１４０に、ユーザリクエストまたは入力に応答して複数のオンラインゲームセッションの各々について連続する画像フレームをレンダリングするように命令する。１つ以上のＧＰＵはその後、コンパイルされたシェーダの第１のシーケンスを用いて、複数のオンラインゲームセッションの各々について複数の画像をレンダリングする（１２０４）。いくつかの実現例では、複数のオンラインゲームセッションは、ゲームタイトルについてＣＰＵおよびＧＰＵによって処理される全てのオンラインゲームセッションからサンプリングされる。
【０１９９】
サーバシステム１１４は、複数のオンラインゲームセッションを実行しつつ、ゲームタイトルと関連付けられた複数のオンラインゲームセッションについて性能基準を識別し（１２０６）、オンラインゲームセッションの各々の実行を特徴付ける使用統計を収集する（１２０８）。いくつかの実現例では、性能基準は、複数のオンラインゲームセッションの実行の過程におけるコンパイルされたシェーダの第１のシーケンスの全消費電力、コードサイズ、平均レイテンシ、全キャッシュ使用量、および全メモリ使用量のうち１つ以上に対応する。いくつかの実現例では、使用統計は、複数のオンラインゲームセッションの各々に対応するコンパイルされたシェーダの第１のシーケンスのユーザ入力、消費電力、１つ以上のゲームレイテンシ、コードサイズ、メモリ使用量およびキャッシュ使用量を含む。
【０２００】
サーバシステム１１４は、コンパイルされたシェーダの第１のシーケンスの性能を性能基準に関して改良するためにコンパイルされたシェーダの第１のシーケンス内の第１のシェーダを修正して（１２１０）、コンパイルされたシェーダの修正された第１のシーケンスを生成する。いくつかの実現例では、コンパイルされたシェーダの第１のシーケンスの性能を性能基準に関して改良するために、コンパイルされたシェーダの第１のシーケンス内の第２のシェーダが、第１のシェーダに加えて修正される。
【０２０１】
いくつかの実現例では、コンパイルされたシェーダの修正された第１のシーケンスは、シェーダキャッシュ内のコンパイルされたシェーダの第１のシーケンスに置換わる。代替的にいくつかの実現例では、オンラインゲームセッションの実行で使用されるコンパイルされたシェーダの第１のシーケンスは、コンパイルされたシェーダの第１のシーケンスの第１のバージョンとしてシェーダキャッシュに格納され、コンパイルされたシェーダの修正された第１のシーケンスは、コンパイルされたシェーダの第１のシーケンスの第２のバージョンとしてシェーダキャッシュに格納される。次のゲームコンテンツレンダリング中に、たとえば次のユーザ入力に応答して、サーバシステム１１４は、オンラインゲームセッションの各々の次の実行について特定の性能基準を識別し、特定の性能基準に従って、コンパイルされたシェーダの第１のシーケンスの第１および第２のバージョンを選択して、複数のオンラインゲームセッションの各々について複数の画像フレームをレンダリングする。
【０２０２】
いくつかの実現例では、コンパイルされたシェーダの第１のシーケンス内の第１のシェーダを修正するために、サーバシステム１１４は、複数のオンラインゲームセッションの性能が性能基準を満たすように代替的なシェーダオプションのグループから代替的なシェーダを選択して、コンパイルされたシェーダの第１のシーケンス内の第１のシェーダに置換える。その結果、コンパイルされたシェーダの修正された第１のシーケンスは、代替的なシェーダを含む。なお、いくつかの実現例では、代替的なシェーダオプションのグループは、シェーダライブラリサーバ１２４から提供される。状況によっては、代替的なシェーダオプションのグループは、サーバシステム１１４上で実行されるゲームタイトルを管理する管理者ユーザに提示され、サーバシステム１１４は、管理者ユーザがログオンしたクライアントデバイス１０２を介して、管理者ユーザから代替的なシェーダのユーザ選択を受信する。
【０２０３】
いくつかの実現例では、管理者ユーザは、管理者クライアントデバイス１０２上で実行されるゲームアプリケーション上の管理者アカウントにログオンし、性能基準および使用統計に基づいて、コンパイルされたシェーダの第１のシーケンスを手動で最適化する。この最適化プロセスの間、サーバシステム１１４は、コンパイルされたシェーダの第１のシーケンス内の第１のシェーダを修正するユーザ命令を受信し、そのため、第１のシェーダは、ユーザ命令に応答して、コンパイルされたシェーダの第１のシーケンスで修正される。逆に、いくつかの実現例では、コンパイルされたシェーダの第１のシーケンス内のシェーダは、コンパイルされたシェーダの第１のシーケンスの性能を性能基準に関して改良するために、自動的にユーザの介入なしで修正される。
【０２０４】
いくつかの実現例では、ＧＰＵがコンパイルされたシェーダの第１のシーケンスを用いて複数のオンラインゲームセッションのために画像フレームをレンダリングする前に、サーバシステム１１４が、複数のオンラインゲームセッションが性能基準に従ってレンダリングされる必要があると判断する。性能基準を考慮して、コンパイルされたシェーダの第１のシーケンスは、複数のオンラインゲームセッションの各々について複数の画像フレームをレンダリングするために判断される。
【０２０５】
いくつかの実現例では、性能基準は第１の性能基準を含み、複数のオンラインゲームセッションは、第１の基準とは別の第２の性能基準に従ってレンダリングおよび実行される。サーバシステム１１４は、第１の性能基準をコンパイルされたシェーダの修正された第１のシーケンスと関連付け、第２の性能基準をコンパイルされたシェーダの第１のシーケンスと関連付ける。
【０２０６】
いくつかの実現例では、性能基準は第１の性能基準を含み、コンパイルされたシェーダの修正された第１のシーケンスは、シェーダキャッシュに第１の性能基準と関連して格納される。さらにいくつかの実現例では、サーバシステム１１４は複数のオンラインゲームセッションを実行しつつ、コンパイルされたシェーダの第１のシーケンスの性能を第２の性能基準に関して改良するために、ゲームタイトルと関連付けられた複数のオンラインゲームセッションについて第２の性能基準を識別し、コンパイルされたシェーダの第２のシーケンスを判断する。コンパイルされたシェーダの第２のシーケンスは、第２の性能基準に関連してシェーダキャッシュに格納される。さらにいくつかの実現例では、使用統計は、複数のオンラインゲームセッションの全消費電量を含み、第１の性能基準および第２の性能基準はそれぞれ、複数のオンラインゲームセッションの応答時間および電力使用量を最適化する。複数のオンラインゲームセッションの全消費電力が事前に定義された電力閾値を超えているという判断に従って、サーバシステム１１４は、コンパイルされたシェーダの第２のシーケンスを選択し、コンパイルされたシェーダの第２のシーケンスを用いて、複数のオンラインゲームセッションの各々について複数の画像フレームをレンダリングする。
【０２０７】
いくつかの実現例では、サーバシステム１１４は、複数の性能基準の各々をコンパイルされたシェーダのそれぞれのシーケンスと関連付けるシェーダハッシュテーブルを確立する。シェーダハッシュに従って、性能基準とコンパイルされたシェーダの第１のシーケンスとがシェーダハッシュテーブルで関連付けられる。シェーダハッシュテーブルは、シェーダキャッシュに格納される。さらにいくつかの実現例では、使用統計はユーザ入力情報を含む。コンパイルされたシェーダの第１のシーケンスの複数のバージョンが、シェーダハッシュテーブルにおいてユーザ入力情報と関連付けられる。さらにいくつかの実現例では、サーバシステム１１４は、たとえばシェーダキャッシュ内のコンパイルされたシェーダの第１のシーケンスをコンパイルされたシェーダの修正された第１のシーケンスと置換えることによって、使用統計に従ってシェーダハッシュテーブルをダイナミックにアップデートする。
【０２０８】
なお、シェーダ最適化は、ＣＰＵおよびＧＰＵを有する１つのサーバだけでなく、複数のサーバ（すなわち、複数のＣＰＵおよびＧＰＵを有する）を含むサーバシステムにも適用可能である。ゲームコンテンツレンダリングで使用されるコンパイルされたシェーダのシーケンスの最適化については、図１０および図１１Ａ〜図１１Ｃを参照してより詳細に説明されている。
【０２０９】
なお、図１２の動作が説明された特定の順序は例示に過ぎず、説明された順序は動作を実行可能な唯一の順序を示すと意図されたものではない。当業者であれば、本明細書で説明されたコンパイルされたシェーダのシーケンスを最適化するさまざまな方法が分かるであろう。さらに、方法８００および９００（たとえば、図８Ａ〜図８Ｂおよび９００）に関して本明細書で説明された他のプロセスの詳細も、図１２に関して説明された方法１２００に類似の態様で適用可能である。簡潔に説明するために、これらの詳細はここでは繰り返さない。
【０２１０】
本出願のいくつかの実現例は、１つ以上のＣＰＵと、複数のＧＰＵと、プログラムの実行中にＣＰＵおよび／またはＧＰＵによる使用のためのプログラムおよびデータを格納するメインダイナミックメモリと、不揮発性メモリに格納されたスタティックメモリプールと、スタティックメモリプールを管理するように構成されたメモリコントローラとを備えるサーバシステムに向けられている。ＧＰＵの各々はローカルキャッシュを含み、メモリコントローラを介してスタティックメモリプールにアクセスするように構成される。サーバシステムは、１つ以上のＣＰＵ上でゲームタイトルについて複数のゲームセッションを並行して実行する。複数のゲームセッションの各々は、スタティックデータ項目と関連付けられ、スタティックデータ項目を用いてそれぞれのＧＰＵによって実行可能なグラフィックス処理を必要とし、スタティックデータ項目は、スタティックメモリプールに格納される。１つ以上のＣＰＵ上で実行されるゲームセッションのサブセットの各々について、サーバシステムは、グラフィックス処理をそれぞれのＧＰＵに割当て、それぞれのＧＰＵによって、スタティックデータ項目のコピーをメモリコントローラにリクエストし、スタティックメモリプールから読出されたスタティックデータ項目の第１をメモリコントローラから受信し、それぞれのＧＰＵによって、スタティックデータ項目のコピーを用いてグラフィックス処理を実行し、それぞれのゲームセッションに関連してグラフィックス処理の結果をローカルに格納する。
【０２１１】
要約すると、本出願のいくつかの実現例は、１つ以上のＣＰＵと、複数のＧＰＵと、プログラムの実行中にＣＰＵおよび／またはＧＰＵによる使用のためのプログラムおよびデータを格納するメインダイナミックメモリと、不揮発性メモリに格納されたスタティックメモリプールと、スタティックメモリプールとを管理するように構成されたメモリコントローラとを備えるサーバシステム上でゲームタイトルをロードすることに向けられている。ＣＰＵは、ゲームタイトルに対応する実行可能なゲームプログラムをメインダイナミックメモリにロードする。ＣＰＵは、複数のオンラインゲームセッションを並行して実行するように構成される。ゲームセッションの各々は実行可能なゲームプログラムに対応し、それぞれのオンラインゲームセッションをレンダリングするように割当てられたそれぞれのＧＰＵによって実行可能なグラフィックス処理を必要とする。ＣＰＵは、複数のゲームセッションのグラフィックス処理で使用されるスタティックデータ項目を識別する。メモリコントローラは、スタティックデータ項目をスタティックメモリプールに格納し、オンラインゲームセッションを実行しているＧＰＵがグラフィックス処理を実行しつつスタティックデータ項目にアクセスすることを可能にする。
【０２１２】
本出願のいくつかの実現例は、ゲームタイトルのための同時画像レンダリングおよびシェーダ最適化に向けられている。サーバシステムは、１つ以上のＣＰＵと、複数のＧＰＵと、プログラムの実行中にＣＰＵおよび／またはＧＰＵによる使用のためのプログラムおよびデータを格納するメインダイナミックメモリと、シェーダキャッシュとを備える。ＣＰＵは、ゲームタイトルについて複数のオンラインゲームセッションを並行して実行する。ＧＰＵは、コンパイルされたシェーダの第１のシーケンスを用いて、複数のオンラインゲームセッションの各々について複数の画像フレームをレンダリングする。サーバシステムは、複数のオンラインゲームセッションを実行しつつ、コンパイルされたシェーダの第１のシーケンスの性能を性能基準に関して改良するために、ゲームタイトルと関連付けられた複数のオンラインゲームセッションについて性能基準を識別し、オンラインゲームセッションの各々の実行を特徴付ける使用統計を収集し、コンパイルされたシェーダの第１のシーケンス内の第１のシェーダを修正して、コンパイルされたシェーダの修正された第１のシーケンスを生成する。
【０２１３】
さまざまな実現例を詳細に参照し、それらの例を添付の図面に示した。上記詳細な説明において、本発明および記載の実現例の十分な理解のため、多数の具体的な詳細を説明した。しかしながら、これらの具体的な詳細がなくても、本発明を実行し得る。その他の場合、周知の方法、プロシージャ、コンポーネント、および回路は、実現例の態様を不必要にあいまいにしないように、詳細に説明しなかった。
【０２１４】
さまざまな構成要素を説明するために、「第１の」、「第２の」といった用語が本明細書において使用される場合があるが、これらの構成要素は、これらの用語によって限定されるべきではないと理解されるだろう。これらの用語は、ある構成要素を別の構成要素と区別するために使用されるにすぎない。たとえば、第１のデバイスの名称がすべて矛盾なく変更され、第２のデバイスの名称がすべて矛盾なく変更される場合に限り、説明の意味を変更することなく、第１のデバイスを第２のデバイスと称することができ、同様に、第２のデバイスを第１のデバイスと称することができる。第１のデバイスおよび第２のデバイスは両方ともデバイスであるが、同じデバイスではない。
【０２１５】
本明細書で使用される用語は、特定の実現例を説明する目的のためだけのものであり、特許請求の範囲を制限すると意図されたものではない。実現例および添付の請求の範囲の説明において使用されるように、単数形「a」、「an」、および「the」は、文脈が明らかに他のものを示さない限り、複数形も含むことを意図する。本明細書において使用される用語「および／または（and/or）」は、関連する記載された項目のうちの１つ以上のいずれか、およびすべての考えられる組み合わせを指し、それらを包含すると理解されるだろう。用語「備える／含む（comprises）」および／または「備える／含む（comprising）」は、本明細書において使用されるとき、記載の特徴、整数、ステップ、動作、構成要素、および／またはコンポーネントの存在を具体的に挙げるが、１つ以上のその他の特徴、整数、ステップ、動作、構成要素、コンポーネント、および／またはそれらのグループの存在もしくは追加を排除しないと理解されるだろう。
【０２１６】
本明細書で使用するとき、「〜である場合（if）」という用語は、文脈に応答して、記載の先行条件が真である「ときに（when）」、「すると（upon）」、「と判定することに応答して（in response to determination）」、「という判定に従って（in accordance with a determination）」、または「と検出することに応答して（in response to detecting）」を意味すると解釈され得る。同様に、「記載の先行条件が真であると判定された場合（if it is determined [that a stated condition precedent is true]）」、「記載の先行条件が真である場合（if [a stated condition precedent is true]）」、「記載の先行条件が真であるとき（when [a stated condition precedent is true]）」という句は、文脈に応じて、記載の先行条件が真である「と判定すると（upon determining）」、「と判定することに応答して（in response to determining）」、「という判定に応答して（in accordance with a determination）」、「と検出すると（upon detecting）」、または「と検出することに応答して（in response to detecting）」を意味すると解釈され得る。
【０２１７】
具体的な実現例を参照して、説明する目的で以上の説明を記載した。しかしながら、例示的な上記の議論は、網羅的であることまたは開示される正確な形態に請求項の範囲を限定することを意図しない。上記教示に鑑みて多数の修正例および変更例が可能である。実現例は、請求項の基礎をなす原則およびそれらの実践的な適用例を最良に説明し、それにより、当業者が、考察された特定の使用に適するようなさまざまな修正例とともに本発明およびさまざまな実現例を最良に用いることができるようにするために、選択され記載された。
【図１】
2021517997.tif 000003
【図２】
2021517997.tif 000004
【図３Ａ】
2021517997.tif 000005
【図３Ｂ】
2021517997.tif 000006
【図３Ｃ】
2021517997.tif 000007
【図３Ｄ】
2021517997.tif 000008
【図４Ａ】
2021517997.tif 000009
【図４Ｂ】
2021517997.tif 000010
【図４Ｃ】
2021517997.tif 000011
【図４Ｄ】
2021517997.tif 000012
【図５Ａ】
2021517997.tif 000013
【図５Ｂ】
2021517997.tif 000014
【図６】
2021517997.tif 000015
【図７】
2021517997.tif 000016
【図８Ａ】
2021517997.tif 000017
【図８Ｂ】
2021517997.tif 000018
【図９】
2021517997.tif 000019
【図１０】
2021517997.tif 000020
【図１１Ａ】
2021517997.tif 000021
【図１１Ｂ】
2021517997.tif 000022
【図１１Ｃ】
2021517997.tif 000023
【図１２】
2021517997.tif 000024
【手続補正書】
【提出日】令和2年12月8日(2020.12.8)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
オンラインゲームセッションのために画像フレームをレンダリングする方法であって、
１つ以上のＣＰＵ上で、ゲームタイトルについて複数のオンラインゲームセッションを並行して実行することと、
１つ以上のＧＰＵが、コンパイルされたシェーダの第１のシーケンスを用いて、複数のオンラインゲームセッションの各々について複数の画像フレームをレンダリングすることとと、
前記ゲームタイトルと関連付けられた前記複数のオンラインゲームセッションについ
て性能基準を識別することと、
前記複数のオンラインゲームセッションの各々の実行を特徴付けるリアルタイム使用統計を収集することと、
前記リアルタイム使用統計に基づいて、前記複数のオンラインゲームセッションについて前記コンパイルされたシェーダの第１のシーケンスの性能を前記性能基準に関して改良するために前記コンパイルされたシェーダの第１のシーケンス内の第１のシェーダを修正して、コンパイルされたシェーダの修正された第１のシーケンスを生成することとを含む、方法。
【請求項２】
前記メモリのシェーダキャッシュに格納された前記コンパイルされたシェーダの第１のシーケンスを前記コンパイルされたシェーダの修正された第１のシーケンスと置換えることをさらに含む、請求項１に記載の方法。
【請求項３】
前記コンパイルされたシェーダの第１のシーケンスの第１のバージョンとして、前記コンパイルされたシェーダの第１のシーケンスを前記メモリのシェーダキャッシュに格納することと、
前記コンパイルされたシェーダの第１のシーケンスの第２のバージョンとして、前記コンパイルされたシェーダの修正された第１のシーケンスを前記シェーダキャッシュに格納することと、
前記複数のオンラインゲームセッションの各々の実行を特徴付ける次の使用統計を収集することと、
前記次の使用統計に従って、前記コンパイルされたシェーダの第１のシーケンスの前記第１および第２のバージョンのうち１つを選択して、前記複数のオンラインゲームセッションの各々について前記複数の画像フレームをレンダリングすることとを含む、請求項１または２に記載の方法。
【請求項４】
前記コンパイルされたシェーダの第１のシーケンス内の前記第１のシェーダを修正することはさらに、前記複数のオンラインゲームセッションの性能が前記性能基準を満たすように、代替的なシェーダオプションのグループから代替的なシェーダを選択して、前記コンパイルされたシェーダの第１のシーケンス内の前記第１のシェーダを置換えることを含み、前記コンパイルされたシェーダの修正された第１のシーケンスは、前記代替的なシェーダを含む、請求項１〜３のいずれか１項に記載の方法。
【請求項５】
前記コンパイルされたシェーダの第１のシーケンス内の前記第１のシェーダを修正するユーザ命令を受信することをさらに含み、前記第１のシェーダは、前記ユーザ命令に応答して、前記コンパイルされたシェーダの第１のシーケンスで修正される、請求項１〜４のいずれか１項に記載の方法。
【請求項６】
前記コンパイルされたシェーダの第１のシーケンスの性能を前記性能基準に関して改良するために前記コンパイルされたシェーダの第１のシーケンス内の前記第１のシェーダは自動的にユーザの介入なしで修正される、請求項１〜５のいずれか１項に記載の方法。
【請求項７】
前記コンパイルされたシェーダの修正された第１のシーケンスを生成することはさらに、前記コンパイルされたシェーダの第１のシーケンスの性能を前記性能基準に関して改良するために前記コンパイルされたシェーダの第１のシーケンス内の第２のシェーダを修正することを含む、請求項１〜６のいずれか１項に記載の方法。
【請求項８】
前記複数のゲームセッションは前記性能基準に従ってレンダリングされる必要があると判断することと、
前記複数のオンラインゲームセッションの各々について、前記複数の画像フレームをレ
ンダリングするために前記コンパイルされたシェーダの第１のシーケンスを識別することとをさらに含む、請求項１〜７のいずれか１項に記載の方法。
【請求項９】
前記性能基準は第１の性能基準を含み、前記複数のオンラインゲームセッションは、前記第１の性能基準とは異なる第２の性能基準に従ってレンダリングおよび実行され、前記方法はさらに、
前記第１の性能基準を、前記コンパイルされたシェーダの修正された第１のシーケンスと関連付けることと、
前記第２の性能基準を、前記コンパイルされたシェーダの第１のシーケンスと関連付けることとを含む、請求項１〜８のいずれか１項に記載の方法。
【請求項１０】
前記性能基準は第１の性能基準を含み、前記方法はさらに、
前記コンパイルされたシェーダの修正された第１のシーケンスを前記第１の性能基準と関連して前記メモリのシェーダキャッシュに格納することを含む、請求項１〜９のいずれか１項に記載の方法。
【請求項１１】
前記複数のオンラインゲームセッションを実行しつつ、
前記ゲームタイトルと関連付けられた前記複数のオンラインゲームセッションについて第２の性能基準を識別することと、
前記コンパイルされたシェーダの第１のシーケンスの性能を前記第２の性能基準に関して改良するためにコンパイルされたシェーダの第２のシーケンスを判断することと、
前記第２の性能基準と関連して、前記コンパイルされたシェーダの第２のシーケンスを前記シェーダキャッシュに格納することとをさらに含む、請求項１０に記載の方法。
【請求項１２】
前記使用統計は前記複数のオンラインゲームセッションの全消費電力を含み、前記第１の性能基準および前記第２の性能基準はそれぞれ、前記複数のオンラインゲームセッションの応答時間および電力使用量を最適化し、前記方法はさらに、
前記複数のオンラインゲームセッションの前記全消費電力が事前に定義された電力閾値を超えているという判断に従って、前記コンパイルされたシェーダの第２のシーケンスを選択し、前記コンパイルされたシェーダの第２のシーケンスを用いて、前記複数のオンラインゲームセッションの各々について前記複数の画像フレームをレンダリングすることを含む、請求項１１に記載の方法。
【請求項１３】
複数の性能基準の各々をコンパイルされたシェーダのそれぞれのシーケンスと関連付けるシェーダハッシュテーブルを確立することをさらに含み、前記確立することは、前記シェーダハッシュテーブルにおいて前記性能基準と前記コンパイルされたシェーダの第１のシーケンスとを関連付けることを含み、前記方法はさらに、
前記シェーダハッシュテーブルを前記メモリのシェーダキャッシュに格納することを含む、請求項１〜１２のいずれか１項に記載の方法。
【請求項１４】
前記使用統計はユーザ入力情報を含み、前記方法はさらに、
前記シェーダハッシュテーブルにおいて、前記コンパイルされたシェーダの第１のシーケンスの複数のバージョンを前記ユーザ入力情報と関連付けることを含む、請求項１３に記載の方法。
【請求項１５】
前記使用統計に従って前記シェーダハッシュテーブルをダイナミックにアップデートすることをさらに含み、前記アップデートすることは、前記シェーダキャッシュ内の前記コンパイルされたシェーダの第１のシーケンスを、前記コンパイルされたシェーダの修正された第１のシーケンスと置換えることを含む、請求項１３に記載の方法。
【請求項１６】
前記使用統計は、前記複数のオンラインゲームセッションの各々に対応する前記コンパイルされたシェーダの第１のシーケンスのユーザ入力、消費電力、１つ以上のゲームレイテンシ、コードサイズ、メモリ使用量およびキャッシュ使用量のうち少なくとも１つまたは全てを含む、請求項１〜１５のいずれか１項に記載の方法。
【請求項１７】
前記性能基準は、前記複数のオンラインゲームセッションを実行する過程における前記コンパイルされたシェーダの第１のシーケンスの全消費電力、コードサイズ、平均レイテンシ、全キャシュ使用量、および全メモリ使用量のうち１つ以上に対応する、請求項１〜１６のいずれか１項に記載の方法。
【請求項１８】
前記複数のオンラインゲームセッションは、前記ゲームタイトルについて、前記１つ以上のＣＰＵおよび前記１つ以上のＧＰＵによって処理されるオンラインゲームセッションの全てからサンプリングされる、請求項１〜１７のいずれか１項に記載の方法。
【請求項１９】
１つ以上のＣＰＵと、
複数のＧＰＵと、
前記１つ以上のＣＰＵおよび／または前記複数のＧＰＵによる実行のための１つ以上のプログラムを格納するメモリとを備え、前記１つ以上のプログラムは、請求項１〜１８のいずれか１項に記載の方法を実現するための命令を含む、サーバシステム。
【請求項２０】
サーバシステムの１つ以上のプロセッサに、請求項１〜１８のいずれか１項に記載の方法を実現するための命令を実行させる、プログラム。
【国際調査報告】
2021517997.tif 000025
2021517997.tif 000026
2021517997.tif 000027
2021517997.tif 000028
2021517997.tif 000029