2016-03-06 20 views
6

私は、3Dパネル(Planerator)でTextBlockを入れていると私はそれをアニメーション化するStoryboardを使用しました。WPF 2D:パフォーマンスの問題

視野が1の場合はすべて正常ですが、視野を50以上に設定すると、フレームレートが急激に低下し、レンダリングが不安定になります。

私はCompositionTarget.renderingを使用しました。

以下の画像を参照してください。

enter image description here

enter image description here

私は優れた性能を持つ3Dビューの2Dアニメーションにする必要があります。

どうすればこの問題を解決できますか教えてください。私はWPFを離れてDirectXに行くべきですか?

UPDATE 1:

私は、3D空間でONE 2Dtextを移動したいのですが、パフォーマンスが悪い(レンダリングはそれが途切れている滑らかではない)

これはa sample projectです。

UPDATE 2:

これはcokeman19の回答に基づいてsample project更新されたバージョンです。 (パフォーマンスは〜10枚のフレームを改善してきた、しかし、私はレンダリングを完璧する必要があります)

UPDATE 3:

は最後に、私はcokeman19の答えとthis pageの内容の助けを借りて、許容可能なパフォーマンスを得ました。

+1

実際に3Dアニメーションをたくさん作成する予定がある場合は、dxを使用して、wpfで直接アニメーションを作成するとパフォーマンスが向上します。 –

+1

XAMLを投稿できますか? – auburg

+1

私はたいていそれを嫌いですが、現時点では実際のプロジェクトやそれに近いものは何も言いません。 私はあなたがどこかで余りに多くの再描画やグラフィックスがロジックにリンクしすぎていると思います。どんなレンダリングでも何らかの作業をしなければなりません。 また、この記事をチェックしてください https://blogs.msdn.microsoft.com/karstenj/2006/10/16/wpf-3d-performance-troubleshooting/ –

答えて

3

サンプルアプリの副産物であるかどうかはわかりませんが、Planerator.CreateVisualChild()未満の場合は、GeometryModel3D.BackMaterialを設定する必要はありません。参考のために:

VisualBrush vb = new VisualBrush(_logicalChild); 
SetCachingForObject(vb); // big perf wins by caching!! 
Material backMaterial = new DiffuseMaterial(vb); 
... 
GeometryModel3D backModel = new GeometryModel3D() { ..., BackMaterial = backMaterial }; 

BackMaterialはビジュアルツリーに属していない論理子、周りVisualBrushラッパーですので、レンダリングは、ここで意味をなすようには見えません。また、論理子(LayoutInvalidationCatcherクラス)はビジュアル子のラッパーで、既にを使用してレンダリングされており、frontModel.Visualに設定されています。

BackMaterialの作成と設定のコードを削除すると、FPSは最大55になります。

また、オプションの場合、次のように設定すると、FPSの品質が著しく低下することなく60まで戻されます。

RenderOptions.SetEdgeMode(_viewport3d, EdgeMode.Aliased); 

アップデート:私は作ることができた

唯一の他の利得は、あなたのニーズにappliableではないかもしれないBitmapCacheからCacheModeを設定することでした。

frontModel.CacheMode = new BitmapCache(20) { EnableClearType = false }; 

私の最も遅いマシンでも、最大のFPSが可能ですが、いくつかの欠点があります。テキスト要素のズームレベルは非常に高く、このテクニックは(UIElement自体をアニメートするのではなく)アニメーションで使用する画像を作成するため、スケールレベルを20に設定しなければなりません。視覚的には知覚できません。もちろんこれにはメモリの意味もあります。

+0

あなたは本当にありがとう多く。 The BackMaterialは必要ありません。 しかし、10フレームしか改善されていないという変更がありました。 (60まで) 私は、3D空間で2Dtextをアニメートして60フレームを達成することを期待しています。 私はより良い応答を待っています。 サンプルソースコードが推奨事項に従って更新されました。 –

+0

もう1つの追加オプションを含めるように答えを更新しました。 – cokeman19

+0

私は 'BitmapCache'がとても効果的だとは思わなかったし、誤って' TextBlock'に適用するべきだと思っていました。 (私は、フォントサイズを大きくしてスケールのレベルを下げても良い結果が得られました) 私はあなたの答えを受け入れることができます。ありがとうございました 。 –

関連する問題