2

SDL プログラムを作成していますが、長方形の幅を取得する必要がある場合があります。私がこのようなことをすると:

        int VideoWidth = Video.Screen.Width; //Expensive operation
        int VideoHeight = Video.Screen.Height;

        int ChunksRendered = 0;
        foreach (Chunk c in Chunks)
        {
            if (c.X + 256 + DeferredX > 0 && c.X + DeferredX < VideoWidth)
            {
                if (c.Y + 256 + DeferredY > 0 && c.Y + DeferredY < VideoHeight)
                {
                    BlitSurface.Blit(c.Render(ref Textures, ref BlitSurface), new Point(c.X + DeferredX, c.Y + DeferredY));
                    ChunksRendered++;
                }
            }
        }

私のマシンでは約 550 FPS が得られますが、これを行うと:

        int ChunksRendered = 0;
        foreach (Chunk c in Chunks)
        {
            if (c.X + 256 + DeferredX > 0 && c.X + DeferredX < Video.Screen.Width)
            {
                if (c.Y + 256 + DeferredY > 0 && c.Y + DeferredY < Video.Screen.Height)
                {
                    BlitSurface.Blit(c.Render(ref Textures, ref BlitSurface), new Point(c.X + DeferredX, c.Y + DeferredY));
                    ChunksRendered++;
                }
            }
        }

私は約200 FPSしか得られません。プロファイリングすると、これが速度低下の原因であることは明らかですが、なぜこの変数を取得するのにそれほどコストがかかるのでしょうか?

4

1 に答える 1

5

おそらくVideo.Screen、この速度低下の原因はプロパティ アクセサーです。を使用している場合SdlDotNet.dll、そのプロパティのコードは次のとおりです。

public static Surface Screen
{
    get
    {
        return Surface.FromScreenPtr(Tao.Sdl.Sdl.SDL_GetVideoSurface());
    }
}

これは、プロパティにアクセスするSurfaceたびに、1 つの外部 dll 関数が呼び出され、1 つのオブジェクトが作成されることを意味します。Video.Screen

WidthまたはHeightのプロパティへのアクセスSurfaceも、次のコードの呼び出しが含まれるため、コストがかかります。

internal Tao.Sdl.Sdl.SDL_Surface SurfaceStruct
{
    get
    {
        if (this.disposed)
        {
            throw new ObjectDisposedException(this.ToString());
        }
        GC.KeepAlive(this);
        return (Tao.Sdl.Sdl.SDL_Surface) Marshal.PtrToStructure(base.Handle, typeof(Tao.Sdl.Sdl.SDL_Surface));
    }
}
于 2013-05-26T01:32:17.183 に答える