FC2ブログ

スポンサーサイト

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

DirectX9での矩形描画


using System;
using System.Xml;

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;
using System.Runtime.InteropServices;

namespace Project1
{

//四角形を描画するのに必要な構造体
struct DrawingData
{
//X値
public float X;
//Y値
public float Y;
//Z値。今回使いません
public float Z;
//色の数値
public int Color;

//描画用データの指定
public DrawingData(float x, float y, float z, DX.Color color)
{
this.X = x;
this.Y = y;
this.Z = z;
this.Color = color.ToBgra();
}
}


static class Program
{
[STAThread]
static void Main()
{
//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);

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


//描画する関数
//第一引数に、DX3D9.PrimitiveType.TriangleFanを指定し、
//第二引数に、2を指定することで、矩形を描画できる
//
//第三引数には、描画データを指定した配列を代入
device.DrawUserPrimitives(DX3D9.PrimitiveType.TriangleFan, 2, new DrawingData[]
{
//四角形を描画
//
//今回は灰色の四角形を描画
//始点が100,100で、横幅は100、縦幅は100の矩形
new DrawingData(100, 100, 0, DX.Color.Gray),
new DrawingData(200, 100, 0, DX.Color.Gray),
new DrawingData(200, 200, 0, DX.Color.Gray),
new DrawingData(100, 200, 0, DX.Color.Gray),
});


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の描画の速度計測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();
}
}
}
プロフィール

みにおん

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

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

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

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

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

・web小説
最後の時の夢

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

この人とブロともになる

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