【问题标题】:Need SlimDX to display images quickly需要 SlimDX 快速显示图像
【发布时间】:2013-08-07 14:37:05
【问题描述】:

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

由于 SlimDX 使用 Directx,而 DirectX 使用 GPU,我应该可以很快完成。据我了解,GPU 处理图像的速度比 CPU 快得多。

我正在这样做:

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();
});

并初始化所有内容:

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. 非常慢;图片框要快得多
  2. 图片显示不正确(已放大)

【问题讨论】:

    标签: c# image latency slimdx


    【解决方案1】:

    您需要缓存纹理,因为每帧都制作它们很慢。例如

    公共类 CacheObjects { 静态列表缓存SCBrushes = new List();

    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 个纹理...渲染很快,对象创建很慢。

    public void LoadTexture () {
    //Load the next 5 here
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-17
      • 2019-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-26
      • 1970-01-01
      相关资源
      最近更新 更多