背景:我正在为DirectX使用SlimDX C#包装器,并使用Sprite类(传统上来自底层dll中的Direct3DX扩展)绘制了许多2D精灵。我同时在屏幕上绘制了数百个精灵,性能非常棒 - 在我的四核上,它在我的整个游戏中使用了3-6%的处理器,包括10,000+对象的逻辑,ai第二个线程上的例程等等。很明显精灵正在使用全硬件加速进行绘制,一切都是应有的。

问题:当我开始向Line类引入调用时出现问题。一旦我绘制4行(对于拖动选择框),处理器使用率就会猛增至13-19%。这只有四行!

我尝试过的事情:

  1. 关闭和打开线路抗锯齿。
  2. 关闭GLLines。
  3. 手动调用line.begin和line.end围绕我的绘图调用。
  4. 省略对line.begin和line.end的所有调用。
  5. 确保我对line.draw的调用不在sprite.begin / sprite.end块中。
  6. 在sprite.begin / sprite.end块内调用line.draw。
  7. 渲染4行,或渲染300。
  8. 关闭所有精灵和文字渲染,只留下4行的线条渲染(看看这是否是某种模式改变的问题)。
  9. 以上的大多数组合。
  10. 一般来说,这些都不会对性能产生重大影响。 #3将处理器使用率降低了2%,但即便如此,它仍然比应有的高8%或更高。最奇怪的是,来自上面的#7对性能的影响绝对没有 - 它与4行一样慢,只有300行。我唯一可以想到的是,由于某种原因,这是在软件中运行,和/或它导致显卡在某种绘图模式之间不断地来回切换。

    矩阵方法:

    如果有人知道对上述问题有任何解决方法,那么我很乐意听到它!

    但是我假设这可能只是一般在directx中的一个问题,所以我一直在追求另一条路线 - 制作我自己的基于精灵的线。基本上,我有一个1px的白色图像,我正在使用漫反射颜色并转换绘制线条。这在性能方面起作用 - 绘制<!>“行<!>”的300;这样就让我处理了我在四核上寻找的3-6%处理器利用率性能范围。

    我的像素拉伸线技术存在两个问题,我希望有人能够更多地了解变换可以帮助我。这是我当前的水平线代码:

        public void DrawLineHorizontal( int X1, int X2, int Y, float HalfHeight, Color Color )
        {
            float width = ( X2 - X1 ) / 2.0f;
            Matrix m = Matrix.Transformation2D( new Vector2( X1 + width, Y ), 0f, new Vector2( width, HalfHeight ),
                Vector2.Zero, 0, Vector2.Zero );
            sprite.Transform = m;
    
            sprite.Draw( this.tx, Vector3.Zero, new Vector3( X1 + width, Y, 0 ), Color );
        }
    

    这是有效的,因为它在屏幕上的大部分正确位置绘制大多数正确尺寸的线条。然而,事情似乎向右移动,这很奇怪。我不太确定我的矩阵方法是否正确:我只想将1x1精灵水平缩放一定量的像素,并垂直缩放不同的量。然后我需要能够定位它们 - 中心点很好,我认为这是我必须要做的,但如果我可以通过左上角定位它会更好。这似乎是一个简单的问题,但我对矩阵的了解相当薄弱。

    这将是纯粹的水平和纯垂直线为我工作,这是大部分的战斗。我可以忍受这一点,并在我目前正在使用斜线的位置使用其他类型的图形。但是,如果有一种方法可以使用这种拉伸像素方法绘制成角度的线条,那将是非常好的。换句话说,例如,从1,1到7,19画一条线。对于矩阵旋转等,似乎这是可行的,但我不知道除了猜测和开始之外甚至还可以从哪里开始检查,这将永远。

    非常感谢任何和所有帮助!

有帮助吗?

解决方案

这听起来像是一个管道失速。您正在渲染精灵和渲染线之间切换一些模式,这会强制图形卡在开始使用新图元之前清空其管道。

在添加线条之前,是否已经渲染了所有精灵,或者是否已经使用其他模式在屏幕上显示其他元素?

其他提示

好吧,经过多次实验,我已经设法让水平线工作了。这工作没有我以前见过的奇怪的抵消;同样的原则也适用于垂直线。这比线类具有更好的性能,所以这就是我将用于水平和垂直线的方法。这是代码:

    public void DrawLineHorizontal( int X1, int X2, int Y, float HalfHeight, Color Color )
    {
        float width = ( X2 - X1 );
        Matrix m = Matrix.Transformation2D( new Vector2( X1, Y - HalfHeight ), 0f, new Vector2( width, HalfHeight * 2 ),
            Vector2.Zero, 0, Vector2.Zero );
        sprite.Transform = m;

        sprite.Draw( this.tx, Vector3.Zero, new Vector3( X1, Y - HalfHeight, 0 ), Color );
    }

我想要一个适用于角度线的版本(如上所述)。有什么建议吗?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top