C# 在SdlDotNet中使用Video.Screen代替表面对象

C# 在SdlDotNet中使用Video.Screen代替表面对象,c#,sdl,sdl.net,C#,Sdl,Sdl.net,我看过的每个SDL或SdlDotNet教程都使用定义的曲面作为主屏幕。比如说 private static Surface videoscreen; videoscreen = SetVideoMode(800, 600, 16, false, false, false, true); videoscreen.Fill(Color.Black); videoscreen.Blit(sprite); videoscreen.Update(); 然而,当我试图用SdlDotNet构建一个游戏时,我

我看过的每个SDL或SdlDotNet教程都使用定义的曲面作为主屏幕。比如说

private static Surface videoscreen;
videoscreen = SetVideoMode(800, 600, 16, false, false, false, true);
videoscreen.Fill(Color.Black);
videoscreen.Blit(sprite);
videoscreen.Update();
然而,当我试图用SdlDotNet构建一个游戏时,我注意到我可以简单地使用Video.Screen来执行我通常在表面屏幕上执行的任何操作。例如:

Video.SetVideoMode(800, 600, 16, false, false, false, true);
Video.Screen.Fill(Color.Black);
Video.Screen.Blit(sprite);
Video.Screen.Update();

为什么每个人仍然使用定义的曲面?我假设在我的小游戏中没有遇到过性能或稳定性方面的问题,但我想知道,以防以后遇到麻烦。

我知道这篇文章很旧,但是!如果你仍然感兴趣,以下是我对这个主题的看法:

Video.SetVideoMode()
方法返回的
Surface
对象与
Video.Screen
属性不相等,但它们都使用相同的句柄,即指向图形数据的指针。 我想说这主要是风格的问题,两者都是在主显示屏上工作的有效方法

  • Video.SetVideoMode()
    导致Video.cs中出现以下内容:

    public static Surface SetVideoMode(int width, int height, int bitsPerPixel, bool resizable, bool openGL, bool fullScreen, bool hardwareSurface, bool frame)
    {
        /* ... */
        return new Surface(Sdl.SDL_SetVideoMode(width, height, bitsPerPixel, (int)flags), true);
    }
    
    /// <summary>
    /// Gets the surface for the window or screen,
    /// must be preceded by a call to SetVideoMode
    /// </summary>
    /// <returns>The main screen surface</returns>
    public static Surface Screen
    {
        get
        {
            return Surface.FromScreenPtr(Sdl.SDL_GetVideoSurface());
        }
    }
    
    。。。在Surface.cs中调用以下内部构造函数:

    internal Surface(IntPtr handle, bool isVideoMode)
    {
        this.Handle = handle;
        this.isVideoMode = isVideoMode;
    }
    
    internal static Surface FromScreenPtr(IntPtr surfacePtr)
    {
        return new Surface(surfacePtr);
    }
    
    internal Surface(IntPtr handle)
    {
        this.Handle = handle;
    }
    
  • 或者,这是Video.cs中的
    Video.Screen
    属性定义:

    public static Surface SetVideoMode(int width, int height, int bitsPerPixel, bool resizable, bool openGL, bool fullScreen, bool hardwareSurface, bool frame)
    {
        /* ... */
        return new Surface(Sdl.SDL_SetVideoMode(width, height, bitsPerPixel, (int)flags), true);
    }
    
    /// <summary>
    /// Gets the surface for the window or screen,
    /// must be preceded by a call to SetVideoMode
    /// </summary>
    /// <returns>The main screen surface</returns>
    public static Surface Screen
    {
        get
        {
            return Surface.FromScreenPtr(Sdl.SDL_GetVideoSurface());
        }
    }
    
    。。。依次调用Surface.cs中的以下内部构造函数:

    internal Surface(IntPtr handle, bool isVideoMode)
    {
        this.Handle = handle;
        this.isVideoMode = isVideoMode;
    }
    
    internal static Surface FromScreenPtr(IntPtr surfacePtr)
    {
        return new Surface(surfacePtr);
    }
    
    internal Surface(IntPtr handle)
    {
        this.Handle = handle;
    }
    
如果比较
Video.SetVideoMode()
Video.Screen
返回的
曲面
对象的句柄,您将看到它们是相等的,这是确保实际使用相同数据所需要知道的全部

希望这有帮助

资料来源: