monogame 中的假多显示器全屏:形式不够大
Fake multi-monitor fullscreen in monogame: form can't be big enough
我 运行 一个三显示器设置,我正在 MonoGame 中制作我决定的图形演示(为什么不呢?让它能够在所有显示器上最大化!)所以我使用了这个代码:
graphics.IsFullScreen = false;
graphics.ApplyChanges();
//get dimensions of box that will cover all displays and set window to it.
int xPos = System.Windows.Forms.Screen.AllScreens.OrderBy(x => x.Bounds.X).Select(x => x.Bounds.X).First();
int yPos = System.Windows.Forms.Screen.AllScreens.OrderBy(y => y.Bounds.Y).Select(y => y.Bounds.Y).First();
form.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
form.Location = new System.Drawing.Point(xPos, yPos);
int xWidth = System.Windows.Forms.Screen.AllScreens.OrderByDescending(x => x.Bounds.X).Select(x => x.Bounds.X + x.Bounds.Width).First() - xPos;
int yHeight = System.Windows.Forms.Screen.AllScreens.OrderByDescending(y => y.Bounds.Y).Select(y => y.Bounds.Y + y.Bounds.Height).First() - yPos;
form.MaximumSize = new System.Drawing.Size(0, 0);
form.Width = xWidth;
form.Height = yHeight;
// graphics.PreferredBackBufferWidth = xWidth;
// graphics.PreferredBackBufferHeight = yHeight;
graphics.ApplyChanges();
Properties.Settings.Default.FakeFullScreen = true;
}
当然还有第二个撤消它的功能。
当我将其中一台显示器设置在其他显示器之上进行测试时,这工作正常,但是当我设置 windows 布局将它们并排放置(给出 5760x1080 的分辨率)时,我是在 graphics.ApplyChanges() 上抛出无效参数错误。所以我注释掉了图形代码并手动设置了表单宽度,发现显然我不允许表单宽度超过 4096 像素。
有办法解决这个问题吗?我愿意接受所有建议,包括有多个 window 并排绘制,但我需要一些代码来告诉我如何定位第二种形式。
拜托,谢谢。
这是 DirectX 9/Windows Phone 7 使用 "Reach Graphics Profile" 将纹理大小限制为 4096 x 4096。
最终显示的图像是所有spritebatches合成的单个纹理,大小不能超过最大纹理大小。
更正问题:
- 确保您的视频卡支持更大的纹理:运行 dxdiag.exe(大多数现代视频卡支持,只要有足够的内存)。
- 启用“hidef”配置文件以允许完整的 DX9、DX10 和 DX11 模式。
要启用 "Hidef",请修改您的 Game1.cs
构造函数,使用 this code:
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
graphics.GraphicsProfile = GraphicsProfile.HiDef;
graphics.ApplyChanges();
// any additional code goes here
}
另一种方法是使用 OpenGL,它会忽略图形配置文件并使用适合您的视频卡的最佳版本。
我 运行 一个三显示器设置,我正在 MonoGame 中制作我决定的图形演示(为什么不呢?让它能够在所有显示器上最大化!)所以我使用了这个代码:
graphics.IsFullScreen = false;
graphics.ApplyChanges();
//get dimensions of box that will cover all displays and set window to it.
int xPos = System.Windows.Forms.Screen.AllScreens.OrderBy(x => x.Bounds.X).Select(x => x.Bounds.X).First();
int yPos = System.Windows.Forms.Screen.AllScreens.OrderBy(y => y.Bounds.Y).Select(y => y.Bounds.Y).First();
form.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
form.Location = new System.Drawing.Point(xPos, yPos);
int xWidth = System.Windows.Forms.Screen.AllScreens.OrderByDescending(x => x.Bounds.X).Select(x => x.Bounds.X + x.Bounds.Width).First() - xPos;
int yHeight = System.Windows.Forms.Screen.AllScreens.OrderByDescending(y => y.Bounds.Y).Select(y => y.Bounds.Y + y.Bounds.Height).First() - yPos;
form.MaximumSize = new System.Drawing.Size(0, 0);
form.Width = xWidth;
form.Height = yHeight;
// graphics.PreferredBackBufferWidth = xWidth;
// graphics.PreferredBackBufferHeight = yHeight;
graphics.ApplyChanges();
Properties.Settings.Default.FakeFullScreen = true;
}
当然还有第二个撤消它的功能。
当我将其中一台显示器设置在其他显示器之上进行测试时,这工作正常,但是当我设置 windows 布局将它们并排放置(给出 5760x1080 的分辨率)时,我是在 graphics.ApplyChanges() 上抛出无效参数错误。所以我注释掉了图形代码并手动设置了表单宽度,发现显然我不允许表单宽度超过 4096 像素。
有办法解决这个问题吗?我愿意接受所有建议,包括有多个 window 并排绘制,但我需要一些代码来告诉我如何定位第二种形式。
拜托,谢谢。
这是 DirectX 9/Windows Phone 7 使用 "Reach Graphics Profile" 将纹理大小限制为 4096 x 4096。
最终显示的图像是所有spritebatches合成的单个纹理,大小不能超过最大纹理大小。
更正问题:
- 确保您的视频卡支持更大的纹理:运行 dxdiag.exe(大多数现代视频卡支持,只要有足够的内存)。
- 启用“hidef”配置文件以允许完整的 DX9、DX10 和 DX11 模式。
要启用 "Hidef",请修改您的 Game1.cs
构造函数,使用 this code:
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
graphics.GraphicsProfile = GraphicsProfile.HiDef;
graphics.ApplyChanges();
// any additional code goes here
}
另一种方法是使用 OpenGL,它会忽略图形配置文件并使用适合您的视频卡的最佳版本。