2016-11-17 10 views
1

Vulkanでは、シェーダで使用するレイアウトの記述子セットを割り当てるためにディスクリプタプールが使用されていますが、vkCreateDescriptorPoolに渡されたVkDescriptorPoolCreateInfoには、ディスクリプタタイプを含むオブジェクトがたくさん入っているフィールドpPoolSizesがあります。数。このVkDescriptorPoolCreateInfo.pPoolSizesの理解は正しいですか?

ドキュメンテーションはやや曖昧ですが、特定のディスクリプタプールにはディスクリプタセットで割り当てられたディスクリプタの特定の所定の量しか持たないということですか?もしそうなら、私は事前にどれくらいの数が必要かをどのように判断するのですか?それがなくなるとどうなりますか?

答えて

3

あなたのディスクリプタプールの理解は正しいです。

もしそうなら、私は事前にどれくらいの数を必要とするかをどのようにして決定するのですか?

これは、あなたとあなたのアプリケーションのニーズに左右されます。

アプリケーションが完全に柔軟でフリーフォームである必要がある場合は、必要に応じてディスクリプタプールを動的に作成する必要があります。あなたのアプリケーションがシーンがどのように見えるかについての先見性があれば、アプリケーションはそのような体操を必要としません。

多くの深刻なVulkanアプリケーションは、シーン内のオブジェクトの数に基づいて記述子セットの数を避けるようにしています。プッシュ定数および/または動的UBO/SSBO記述子は、ディスクリプタ自体を変更することなく、異なるオブジェクトごとの状態を使用することを可能にする。多くのオブジェクトのテクスチャは、アレイテクスチャにまとめて、またはハードウェア、テクスチャの配列に応じてバンドルすることができます。完璧な世界では

、タイプ(たとえば、肌のメッシュ)の全てのメッシュは、そのオブジェクトの右のマトリックス/テクスチャデータをフェッチするために、いくつかのオブジェクトごとの状態を使用して、まったく同じ記述子セットでレンダリングすることができます。

しかし、それはどのようにレンダリングされます。このようなアプリケーションは、レンダリングするオブジェクトの種類、オブジェクトごとのデータの外観などを堅固に制御します。他のアプリケーションでは、さまざまなニーズがあります。

バルカンはツールです。どのように使用するかはまったくあなた次第です。

不足するとどうなりますか?

次に、そのプールからさらに多くのディスクリプタを割り当てることはできません。別のディスクリプタセットを割り当てる必要がある場合は、別のプールを作成する必要があります。

0

私のアプローチは、最初に記述子のNを割り当てるクラスを持つことでした。実行すると、N * 2エントリを持つ別のプールが作成されます。それはサイズが倍増し続けるでしょう。それは単純なリンクリストを使用し、割り当てになると、最初のものを試してから、それがいっぱいになったら次のものに移動します。

これはすべて非常に効率が悪いですから、2番目のプールを作成しなければならない場合は、コードの実行をアシストしてください。そうすれば、Nの値を選択して、 (しかし、予期せぬ状況によって何とかそれができたら、それは正しくレンダリングされます)。

当時、私は仕様を呪っていることを覚えていて、ディスクリプタプールがコマンドプールのように自動的に成長することを願っています。それでも、彼らは彼らのような理由があると私は想像しています。

関連する問題