ダレトク実況3
WPFのGridで矩形を重ね合わせして、下(奥)のレイヤーのRenderTransformをずらして半透明の影をつけた。
<Grid> <!--影の部分--> <Grid Background="#40000000" RenderTransformOrigin="0.5,0.5"> <Grid.RenderTransform> <TransformGroup> <ScaleTransform/> <SkewTransform/> <RotateTransform/> <TranslateTransform X="5" Y="5"/> </TransformGroup> </Grid.RenderTransform> </Grid> <!--エンティティ本体--> <Grid Background="#FEFEFE"> <Grid.RowDefinitions> <RowDefinition MinHeight="40"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <Grid Grid.Row="0"> -- snip --
ま、1個だけ出しても半透明もくそもないね。
拡大縮小と移動の座標変換どうするっかなあ。
ワールド座標系とスクリーン座標系の変換だけ持って、左上オフセットさせた奴をWPFのRenderTransformに食わせるとかイケるかな。
public class Transform2D { public float OffsetX { get; set; } public float OffsetY { get; set; } public float Scale { get; set; } PointF WorldToLocal(PointF world) { return new PointF(world.X * Scale, world.Y * Scale); } PointF LocalToWorld(PointF world) { return new PointF(world.X / Scale, world.Y / Scale); } }
クリッピングもWPF任せやとするとクリッピング領域(≒画面上で描画されてる範囲)もいらんわなあ。
ここいらは本番はDirect2Dで描くつもりなんで、実はテキトー
実際問題この辺ってWPFに完全に乗っかるのが良いのか、Direct2Dなりで自前レンダリングすれば良いのかの答えは自分では持ってない。
けど、完全にWPFに乗っかって最後の最後でパフォーマンスでないとか、こういう描画はWPF苦手とかってなったときにつぶしがきかないんで自前レンダリングをイメージしとく方が無難。
こういうところがゲームとかCADとかの面倒くさいとこなのよねえ。でも、そこだけ。それ以外はWPFバンザイなのな。
位置の考慮は無しで、ズームだけ実装。
等倍
1/10ぐらい?
3.5倍ぐらいかな。
位置を考慮すんのもそない大変や無いのよ、実は。
描画とスケーリング(拡大縮小)をWPF任せにするなら、エンティティの座標をWorldToLocal変換するだけ。
さらに、CanvasコントロールをScrollViewerでくるんじゃえばオフセットの考慮もWPF任せで行ける。
くっそ重い。うちのオンボードグラフィックじゃこんな感じなのか。
5000エンティティどころか1000エンティティでも帰ってこない。上のスクショは200エンティティぐらい。
現実的に実用する場合にはエンティティ同士を重ねて配置することはないので半透明の影は不要。
どうしても影が欲しけりゃ不透明の灰色の影で十分。(俺っちはそれだと嫌やけど、WPFで半透明の影でも俺っちは嫌なので同じレベル)
不透明で灰色の影にしたら2000エンティティで2〜5FPS(Frames Per Sec)ぐらいでる。(俺っちの感覚)
けど、アプリのメモリ使用量が500MBとか超えてくる。これじゃあダメ。
ズームインした状態なら自前でクリッピングして見えてるオブジェクトに制限できるけど、結局ズームアウトしたら2000個出すのは同じなので意味がない。
もちろん、全部自前版はTextBoxがエンティティ数 x 4なので無茶苦茶やってるってことだけは明記しとく。
先人や関係各所に迷惑かけずに無邪気にアップ出来んのこの辺までかな?
なのでTDrawProto1はこの辺でおしまい。ここまでのは公開しています。当然、やっつけ仕事ですが。
https://github.com/fuku518/TDrawProto1/tree/develop
以上