FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

wpfの描画の速度計測2

使用コードを見る

・WPFでの描画速度の計測

DrawingContextを使い1000回描画
使用メモリ 327680
経過時間   16151

DrawingContextを使わずに1000回描画
使用メモリ 278528
経過時間   14466

RenderTargetBitmapで1000回描画
使用メモリ 221184経過時間  181476

・結果
使用メモリ量を抑えるなら、RenderTargetBitmapを使おう

処理速度重視なら、DrawingContextを使わずに、
DrawingGroup.ChildrenにDrawingオブジェクトを直接追加

・個人的主観
DrawingGroup.ChildrenにDrawingオブジェクトを直接追加するのが、
高速処理しやすいと思う(個人的に)
スポンサーサイト

wpfの描画の速度計測

using System;
using System.Diagnostics;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;

namespace Project1
{
static class Program
{
[STAThread]
static void Main()
{
const int loop = 1000;

var dg = new DrawingGroup();
var dv = new DrawingVisual();

using (var dc = dv.RenderOpen())
{
dc.DrawRectangle(Brushes.Aqua, null, new Rect(0, 0, 50, 50));
}

MemoryAndTimeCheck(() =>
{
//DrawingContextを使い1000回描画
//使用メモリ 327680
//経過時間   16151
using (var dc = dg.Open())
{
for (var i = 0; i < loop; i++)
{
var brush = new VisualBrush(dv);

dc.DrawRectangle(brush, null, new Rect(0, 0, 100, 100));
}
}
});
dg.Children.Clear();
GC.Collect();

MemoryAndTimeCheck(() =>
{
//DrawingContextを使わずに1000回描画
//使用メモリ 278528
//経過時間   14466
for (var i = 0; i < loop; i++)
{
var brush = new VisualBrush(dv);
var drawing = new GeometryDrawing();

drawing.Geometry = new RectangleGeometry(new Rect(0, 0, 100, 100));
drawing.Brush = brush;

dg.Children.Add(drawing);
}
});
dg.Children.Clear();
GC.Collect();

MemoryAndTimeCheck(() =>
{
//RenderTargetBitmapで1000回描画
//使用メモリ 221184
//経過時間  181476

var image = new RenderTargetBitmap(100, 100, 96, 96, PixelFormats.Default);

for (var i = 0; i < loop; i++)
{
image.Render(dv);
}
});
dg.Children.Clear();
GC.Collect();
}

static void MemoryAndTimeCheck(Action act)
{
var start = 0l;
var end = 0l;

var sw = new Stopwatch();

start = GC.GetTotalMemory(false);

sw.Start();

act();

sw.Stop();
end = GC.GetTotalMemory(false);

Console.WriteLine("使用メモリ :" + (end - start));
Console.WriteLine("経過時間 : " + sw.ElapsedTicks);
Console.WriteLine();
}
}
}

DirectX9で描画したものをWPFに表示

using System;

using DX = SharpDX;
using DX3D9 = SharpDX.Direct3D9;
using System.Windows.Interop;
using System.Windows.Media;
using System.Windows;
using System.Windows.Media.Imaging;
using System.Windows.Controls;

namespace Project1
{
static class Program
{
[STAThread]
static void Main()
{
//画像ファイル
const string imageFile = "test1.png";

//WPFの設定
var window = new Window();
var content = new Image();
var image = new D3DImage(); //DirectX9で描画したものを表示するのに必要

//Direct3D9の設定
var direct = new DX3D9.Direct3D();
var pp = new DX3D9. PresentParameters(300, 300);
var device = new DX3D9.Device(direct, 0, DX3D9.DeviceType.Hardware, IntPtr.Zero, DX3D9.CreateFlags.HardwareVertexProcessing, pp);
var sprite = new DX3D9.Sprite(device);

var texture = DX3D9.Texture.FromFile(device, imageFile);

window.MouseDown += (sender, e) =>
{
//DirectX9で描画
device.BeginScene();
sprite.Begin(DX3D9.SpriteFlags.AlphaBlend);
device.Clear(DX3D9.ClearFlags.Target, DX.Color.Black, 0, 0);

sprite.Draw(texture, DX.Color.White);

sprite.End();
device.EndScene();
device.Present();
//DIrectX9での描画はここまで

//DirectX9で描画したものをWPFで表示
image.Lock();
image.SetBackBuffer(D3DResourceType.IDirect3DSurface9, device.GetBackBuffer(0, 0).NativePointer);
image.AddDirtyRect(new Int32Rect(0, 0, 300, 300));
image.Unlock();

};

content.Source = image;
window.Content = content;
window.ShowDialog();
}
}
}

WPFでゲームを作る時のメモ

   ○WPFの使用メモリを抑えたい時のためのメモ

・ウィンドウを表示する時は、WPFのWindowクラスを使わず、
WindowsフォームのFormクラスを使用する

http://mini09memo.blog.fc2.com/blog-entry-104.html
方法はこの上記URLの記事を参照

・HwndSourceクラスのRootVisualプロパティに代入する値は、
Panel派生クラスかFrameworkElement派生クラスのどちらか
(XAMLデザイナを使うなら前者、使わない場合は後者がいい)


ContentControl派生クラスとPage派生クラスは上記クラスより
2倍近くメモリ量があるため使う必要ない

・Visual派生オブジェクトをなるべく使わず(ブラシとして使うのもだめ)、
Drawing派生クラスを使う(できるなら全部)

・テキスト表示オブジェクトは、
TextBlockクラスのオブジェクトを使うより、
FrameworkElementを継承した
自作クラスを使うとメモリを抑えられる


  ○上記のことを意識して作ると、
普通に作るよりメモリ使用量を大きく抑えられる

「WPF」 フォームにWPF要素を表示

using System;
using System.Windows;
using System.Windows.Shapes;
using System.Windows.Media;
using System.Windows.Controls;
using System.Windows.Interop;

using System.Linq;

namespace Project1
{
internal static class Program
{
[STAThread]
private static void Main()
{
//フォームを作成
var form = new System.Windows.Forms.Form();

//表示するVisualオブジェクト
var visual = new TextBlock { Background = Brushes.Wheat, Text = "test" };

//フォームに子要素を追加するための構造体を作成
var hsp = new HwndSourceParameters(null, 200, 200);
//フォームのハンドルを指定
hsp.ParentWindow = form.Handle;
//ウィンドウスタイルを指定
//0x40000000は、子要素を作成
//0x10000000は、作成した子要素を見えるようにする
hsp.WindowStyle = 0x10000000 | 0x40000000;

//フォームに子要素を表示
var hwndSource = new HwndSource(hsp);
//表示するVisualオブジェクト
hwndSource.RootVisual = visual;

//ウィンドウに表示する文字列を変えられる
form.Text = "あいうえお";
//フォームの表示
form.ShowDialog();

}
}
}
プロフィール

みにおん

Author:みにおん
c#でゲームを作る人です
web小説なども書いています

低学歴で馬鹿なのパート従業員
ですが、よろしく

相互リンク・ブロとも募集中です
コメントなどご自由にどうぞ

ホームページを見る
Twitter(個人ページ)
PIXIV(個人ページ)

○自作ゲーム一覧
ふりーむ
フリーゲーム夢幻
100%ふりげストア

・web小説
最後の時の夢

最新記事
最新コメント
月別アーカイブ
カテゴリ
ブロとも一覧
検索フォーム
ブロとも申請フォーム

この人とブロともになる

RSSリンクの表示
リンク
アクセスランキング
QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。