首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >需要SlimDX快速显示图像

需要SlimDX快速显示图像
EN

Stack Overflow用户
提问于 2013-08-07 14:37:05
回答 1查看 1.3K关注 0票数 0

我需要非常快地显示图像(约60 FPS)。Picturebox/Panel没有在更高的分辨率下完成这项工作,所以我现在转向SlimDX,我希望这是正确的选择。

由于SlimDX使用Directx,而DirectX使用GPU,所以我应该能够非常快地完成它。据我理解,GPU处理图像的速度比CPU快得多。

我是这样做的:

代码语言:javascript
运行
复制
MessagePump.Run(form, () =>
{
    device.BeginScene();
    sprite.Begin(SlimDX.Direct3D9.SpriteFlags.None);
    tx = SlimDX.Direct3D9.Texture.FromStream(device, (new MemoryStream(reader.ReadBytes(reader.ReadInt32()))), SlimDX.Direct3D9.Usage.None, SlimDX.Direct3D9.Pool.Managed);
    sprite.Draw(tx, Color.Transparent);

    sprite.End();
    device.EndScene();
    device.Present();
});

并初始化所有内容:

代码语言:javascript
运行
复制
var form = new RenderForm("Test");
form.Width = 1280;
form.Height = 720;
SlimDX.Direct3D9.PresentParameters presentParams = new SlimDX.Direct3D9.PresentParameters
{
 BackBufferWidth = form.Width,
 BackBufferHeight = form.Height,
 DeviceWindowHandle = form.Handle,
 PresentFlags = SlimDX.Direct3D9.PresentFlags.None,
 BackBufferCount = 0,
 PresentationInterval = SlimDX.Direct3D9.PresentInterval.Immediate,
 SwapEffect = SlimDX.Direct3D9.SwapEffect.Discard,
 BackBufferFormat = SlimDX.Direct3D9.Format.A8R8G8B8,
 Windowed = true,
};

device = new SlimDX.Direct3D9.Device(new SlimDX.Direct3D9.Direct3D(), 0, SlimDX.Direct3D9.DeviceType.Hardware, form.Handle, SlimDX.Direct3D9.CreateFlags.HardwareVertexProcessing, presentParams);
device.Viewport = new SlimDX.Direct3D9.Viewport(0, 0, form.Width, form.Height);
    SlimDX.Direct3D9.Sprite sprite;
    SlimDX.Direct3D9.Texture tx;
    sprite = new SlimDX.Direct3D9.Sprite(device);
    tx = new SlimDX.Direct3D9.Texture(device, form.Width, form.Height, 0, SlimDX.Direct3D9.Usage.None, SlimDX.Direct3D9.Format.X8R8G8B8, SlimDX.Direct3D9.Pool.Managed);

这方面有两个问题:

  1. 它非常慢,picturebox要快得多
  2. 它不正确地显示图像(它被放大)

EN

回答 1

Stack Overflow用户

发布于 2014-01-15 03:48:00

你需要缓存纹理,因为它们的每一个帧都是缓慢的。例如。

公共类CacheObjects {静态列表cacheSCBrushes =新列表();

代码语言:javascript
运行
复制
public static SolidColorBrush GetColorBrush(Color4 Color, Direct2D.RenderTarget renderTGT)
{
     // ERROR: Not supported in C#: OnErrorStatement

    SolidColorBrush returnBrush = null;
    bool found = false;
    foreach (void br_loopVariable in cacheSCBrushes) {
        br = br_loopVariable;
        if (br.Color.Red == Color.Red) {
            if (br.Color.Green == Color.Green) {
                if (br.Color.Blue == Color.Blue) {
                    if (br.Color.Alpha == Color.Alpha) {
                        found = true;
                        returnBrush = br;
                        exit for;
                    }
                }
            }
        }
    }
    if (!found) {
        returnBrush = new SolidColorBrush(renderTGT, Color);
        cacheSCBrushes.Add(returnBrush);
    }
    return returnBrush;
}


public static void ClearCache()
{
    foreach (void Brush_loopVariable in cacheSCBrushes) {
        Brush = Brush_loopVariable;
        Brush.Dispose();
    }
}

}

如果这是不可能的,那么在一个独立的线程中,加载下一个5 textures...Rendering是快速的,对象创建是缓慢的。

代码语言:javascript
运行
复制
public void LoadTexture () {
//Load the next 5 here
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18106289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档