我见过的每个SDL或SdlDotNet教程都使用已定义的Surface作为主屏幕。例如
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来执行我通常在Surface屏幕上执行的任何操作。例如:
Video.SetVideoMode(800, 600, 16, false, false, false, true);
Video.Screen.Fill(Color.Black);
Video.Screen.Blit(sprite);
Video.Screen.Update();
为什么每个人仍然使用已定义的Surface?我假设在我的小游戏范围内我没有遇到某种性能或稳定性问题,但我想知道以后我可能会遇到麻烦。
答案 0 :(得分:1)
我知道帖子很旧但是!如果你仍然感兴趣,这是我对这个主题的看法:
Surface
方法和Video.SetVideoMode()
属性返回的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);
}
...在Surface.cs中调用以下内部构造函数:
internal Surface(IntPtr handle, bool isVideoMode)
{
this.Handle = handle;
this.isVideoMode = isVideoMode;
}
或者,这是Video.cs中的Video.Screen
属性定义:
/// <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 static Surface FromScreenPtr(IntPtr surfacePtr)
{
return new Surface(surfacePtr);
}
...反过来在Surface.cs中调用以下内部构造函数:
internal Surface(IntPtr handle)
{
this.Handle = handle;
}
如果您比较Surface
和Video.SetVideoMode()
返回的Video.Screen
个对象的句柄,您会发现它们是相同的,这是您需要知道的所有内容,以确保您实际上是使用相同的数据。
希望这有帮助!
来源: