【问题标题】:Blitting to a transparent SDL surface incurs big performance lossBlitting 到透明的 SDL 表面会导致很大的性能损失
【发布时间】:2013-08-30 22:20:03
【问题描述】:

我正在使用 SDLDotNet.dll 6.1.1(我认为是 SDL 1.2)。每当我连续快速闪到透明表面时(例如,当玩家快速点击时)它的 FPS 会下降约 5 fps(从 350 fps 下降到 5 fps)

这是我的表面:

    ChunkSurface = new Surface(256, 256) {Transparent = true};

和我的代码来更新一个块

            if (ReRerenderPartial)
            {
                foreach (Point poin in ReRenderPoints)
                {
                    int ChunkX = poin.X;
                    int ChunkY = poin.Y;
                    int Block = Blocks[ChunkX, ChunkY];
                    var b = BaseBlock.blockList.Find(Block);
                    if (b.Surface().Transparent)
                    {
                        ChunkSurface.Fill(new Rectangle(new Point(poin.X * 16, poin.Y * 16), new Size(16, 16)), Color.Black);
                    }
                    if (Block > 0)
                    {
                        ChunkSurface.Blit(b.Surface(), new Point(poin.X*16, poin.Y*16));
                    }
                }
            }

如果我将透明设置为 false,则在快速单击(并需要重新渲染)时不会丢失 FPS,但如果设置为 true,则会降低 FPS。导致 FPS 丢失的两个函数是 Fill & Blit

如果你想看到它的实际效果,我的 repo 是 @https://github.com/Snowl/PlataJumperSDL 相关文件是 Chunk.cs

【问题讨论】:

    标签: c# sdl


    【解决方案1】:

    我的错,我没有清除渲染点列表,导致很多点在不需要重新渲染时被渲染,随着需要渲染的点数量增加。

    ReRenderPoints = new List<Point>();
    

    在我的渲染函数结束时修复了它。

    还是谢谢。

    【讨论】:

    • 我不知道 C# 是如何管理指针的,但是在 C++ 中,您需要在指针附加到新的内存段之前调用 delete 以避免内存泄漏(数据留在内存中的某个位置)。
    猜你喜欢
    • 1970-01-01
    • 2012-04-13
    • 2018-09-03
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多