首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >画得比SlimDX还快?

画得比SlimDX还快?
EN

Code Review用户
提问于 2013-08-18 10:42:40
回答 1查看 1.4K关注 0票数 -1

以下是SlimDX版本:

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

                var 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;
                sprite = new SlimDX.Direct3D9.Sprite(device);


   SlimDX.Windows.MessagePump.Run(form, () =>
                        {
                            sprite.Begin(SlimDX.Direct3D9.SpriteFlags.None);
                            device.BeginScene();
                            Stoptimer = Stopwatch.StartNew();
                            Stoptimer.Start();
                            var tx = SlimDX.Direct3D9.Texture.FromStream(device, ms, 0, 0, 0, SlimDX.Direct3D9.Usage.None, SlimDX.Direct3D9.Format.X8R8G8B8, SlimDX.Direct3D9.Pool.Managed, SlimDX.Direct3D9.Filter.None, SlimDX.Direct3D9.Filter.None, 0);

                            Stoptimer.Stop();
                            System.Console.WriteLine(Stoptimer.ElapsedMilliseconds.ToString());
                            sprite.Draw(tx, Color.Transparent);
                            sprite.End();
                            tx.Dispose();
                            device.EndScene();
                            device.Present();
 });

这是非常缓慢的高分辨率,也没有那么快,在较低的。我不太明白为什么,正如我想的,它会更快,因为它使用GPU。

这是绘图版本:

代码语言:javascript
运行
复制
newImage = Image.FromStream(ms);
gmp.DrawImage(newImage, 0, 0);

只是在循环内部(SlimDX在消息泵中有自己的循环)。

你能告诉我为什么画画更快吗?据我所知,使用面板之类的绘图很慢,因为它是为了完全兼容而设计的,并且没有为硬件加速进行优化。

这应该是不断地重绘,因为一个新的图像将始终到达(ms是从一个memorystream,然后放入一个内存流,当收到)。

我基本上要求对代码进行分析。

EN

回答 1

Code Review用户

发布于 2015-11-06 13:11:51

您似乎在计时这段代码:

代码语言:javascript
运行
复制
 var tx = SlimDX.Direct3D9.Texture.FromStream(device, ms, 0, 0, 0, SlimDX.Direct3D9.Usage.None, SlimDX.Direct3D9.Format.X8R8G8B8, SlimDX.Direct3D9.Pool.Managed, SlimDX.Direct3D9.Filter.None, SlimDX.Direct3D9.Filter.None, 0);

此代码正在加载一个纹理,而不是渲染场景。因此,要修复:

  1. 将纹理加载移到消息泵之外(纹理应该加载一次)。
  2. 计时你的抽签呼叫sprite.Draw(tx, Color.Transparent);代替。
票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/29919

复制
相关文章

相似问题

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