2017-03-03 10 views
1

私は自分のゲームでレンダリングのスピードを上げようとしていましたが、それはもっと遅くすることしかできず、どうしたのか分かりません。私は2Dのゲームでいくつかの地形を描いていますので、さまざまなテクスチャの画面全体に長いストリップを想像してください。極限の金属のレンダリング速度

以前の実装では、様々なテクスチャを照合し、それらを繰り返してテクスチャに関連付けられた三角形を異種の方法で描画します。これは、描画呼び出しが1トン増え、いくつかのユニフォームを複数回私たちが端を包み込むならば、プロセス全体を通して。

私がしたことは、すべてのテクスチャをまとめることでしたので、それらを変更する必要はなく、すぐに大きな三角形を描くことができました。これにより、ドローカウントが約4000から1000未満(Xcodeのキャプチャフレームツールで測定)に低下しましたが、フレームが非常に遅くなりました。同じシーンが同じ数の三角形でレンダリングされていますが、fpsは約40から10になりました。

一度に5つまたは6つの三角形しか持たない単純なdrawPrimitives(.Triangle ...の数千を超える前は、毎回100以上の三角形を描画する数百の呼び出しがあります。

たとえば、[drawPrimitives:3 vertexStart:1944 vertexCount:348 instanceCount:116]これを行うには1.93msかかると報告しています。

フレームキャプチャでは、これらの呼び出しを100回描画するので、2 + ms!なぜそんなに長い!それは約3マイクロ秒でクワッドをすることができるので私を奇妙に襲ってしまうので、スケーリングすればこのストリップはたったの2分の1を取ると思うでしょう。私は、三角形を準備するコードをプロファイリングし、より高速です。私が指すことができる唯一の事は実際のdrawPrimitivesコールですが、なぜそれが今や不調になっているのか理解できません。

なぜ4倍のドローコールがあり、フレームレートが3倍長くなるのですか?なぜこれが遅いのか、私は何が欠けているのですか?私はより効率的です!

編集ここ シェーダコードである:これらの構造体は、例えばとして定義され、迅速側に同一であるれる

vertex TerrainFragmentIn terrainVertex(const device TerrainVertex* verts [[ buffer(0) ]], 
          uint v_id [[ vertex_id ]], 
          constant Constants &mvp [[buffer(1)]], 
          constant ModelMatrix &modelMat [[buffer(2)]] 
          ) { 
    TerrainVertex vert = verts[v_id]; 

    TerrainFragmentIn outVertex; 
    outVertex.position = mvp.viewProjectionMatrix * modelMat.modelMatrix * float4(vert.position.x,vert.position.y,0,1); 
    outVertex.shadow = vert.shadow; 
    outVertex.uv = vert.tex; 
    return outVertex; 
} 

fragment float4 terrainFragment(TerrainFragmentIn inFrag [[stage_in]], 
          texture2d<float, access::sample> colorTexture [[ texture(0) ]], 
          sampler colorSampler [[ sampler(0) ]]) { 
    float4 color = colorTexture.sample(colorSampler, inFrag.uv); 
    color *= float4(inFrag.shadow,inFrag.shadow,inFrag.shadow,1.0); 

    return color * 2; 
} 

struct TerrainVertex { 
    float2 position [[ attribute(0) ]]; 
    float2 tex  [[ attribute(1) ]]; 
    float shadow [[ attribute(2) ]]; 
}; 

struct Constants { 
    float4x4 viewProjectionMatrix; 
}; 

struct ModelMatrix { 
    float4x4 modelMatrix; 
}; 

90との間のほぼない状態変化があります%コール DrawCalls

各三角は約2です0x30ピクセル。これらの呼び出しでは、私はブレンドを行っていません。私は実際に私がキャプチャで診断や警告/エラーを受けていたらいいのに、悲しいことには何もしません。私は10.12.3を実行しているrMPBでテストしています。私はまだiOSで試していない。あなたのスクリーンショットで

答えて

1

インスタンス数がdrawPrimitivesにあなたの呼び出しで120

で示していますが、あなたはプリミティブ数(それはそれのように見える)としてinstanceCountパラメータを設定しています。もしあなたがそうであれば、それぞれの描画呼び出しは120 * 120 = 14400の三角形をレンダリングしています。なぜなら、毎回三角形のプリミティブを描画しているときに描画コールを統合するとフレームレートが悪化しているからです。

インスタンシングを使用していない場合(シェーダーがそうでないと示唆している場合)は、instanceCountを1に設定する必要があります。

+1

それでした! 6/9 fpsから60に変わった!驚くばかり。私は三角形の数とvertsの数を入れなければならなかったのは奇妙に思えました。あなたが何か愚かなことをしているように、警告を発したなら、これを呼ぶべきではない!私は1回以上投票できることを願っています!本当にありがとう – utahwithak

関連する問題