我已成功使用Farseer使用XNA开发我的一款游戏.游戏就像Windows和WP7中的魅力一样.我目前正致力于使用Monotouch和Monogame在IOS中移植我的游戏.我已成功编译和使用Farseer,而不是我的游戏的第一个版本移植到Monotouch和Monogame.一切都很好,除了表演.iPhone设备上的游戏运行速度要慢得多.我做了一些代码调查,似乎主要的瓶颈是Farseer.当它需要连接一个固定装置(圆圈)来管理超过5-6个实体时,它变得非常慢.
阅读文档我注意到要调整Farseer我可以更改Setting static class中的值:
性能
为了充分利用引擎,您应该尝试遵循以下指南:
启用睡眠 睡眠使您可以拥有世界上大量的身体.它还可以增加发动机的稳定性,因为一堆物体中的小运动不会在堆叠中扩散.睡眠的身体几乎没有头顶,因此建议启用它.
禁用CCD 连续碰撞检测可防止隧道效应,但会降低性能.如果你没有隧道问题,你应该一起禁用CCD.
最小化位置和速度迭代 的次数大量的迭代使得引擎以性能为代价更加稳定.您应该调整值以适合您的游戏.
坏消息是如果我改变那个类的任何值,似乎什么也没发生.我尝试更改值如下:
EnableDiagnostics = false
VelocityIterations = 6
PositionIterations = 2
ContinuousPhysics = false
Run Code Online (Sandbox Code Playgroud)
我也尝试使用较低的值,如VelocityIterations = 1,但似乎没有任何改变....
任何人都已更改设置类值以提高性能?
我目前正在使用梦幻般的monogame框架编写游戏.我无法正确对触摸输入作出反应.当用户水平或垂直拖动时,我想每次拖动执行一次动作.问题是每次拖动都会多次发出手势.这是我的代码:
var gesture = default(GestureSample);
while (TouchPanel.IsGestureAvailable)
gesture = TouchPanel.ReadGesture();
if (gesture.GestureType == GestureType.VerticalDrag)
{
if (gesture.Delta.Y < 0)
return new RotateLeftCommand(_gameController);
if (gesture.Delta.Y > 0)
return new RotateRightCommand(_gameController);
}
if (gesture.GestureType == GestureType.HorizontalDrag)
{
if (gesture.Delta.X < 0)
return new RotateLeftCommand(_gameController);
if (gesture.Delta.X > 0)
return new RotateRightCommand(_gameController);
}
Run Code Online (Sandbox Code Playgroud)
出于本示例的目的,我已将所有此代码移动到一个块中.然后返回的RotateRightCommand或RotateLeftCommand由调用代码执行,该调用代码在屏幕上旋转对象.整个代码块在monogame的更新循环中运行.我认为我在重置触摸输入方面缺少一些东西,这就是我为一次拖动返回3或4个RotateCommands的原因.我究竟做错了什么?
MonoGame(一个基本上将XNA引入Windows Phone 8的框架)具有前缀的所有名称空间,Microsoft.Xna.Framework我相信最小化将XNA应用程序移植到MonoGame时所需的代码更改量.
我的问题是,我希望访问Microphone该类,因为尚未在MonoGame中创建,我必须在官方的Microsoft XNA类中从内部使用它,这需要取出明确的强制删除标准Microsoft.XNA.Framework.dll引用. .csproj,我的MonoGame模板已设置为避免冲突,这很好用,现在Microphone可以访问,但这样做我在Microsoft标准问题和MonoGame中存在的几个关键类之间产生了歧义.
我收到的错误是:
不明确的参考:
Microsoft.Xna.Framework.Color
Microsoft.Xna.Framework.Color
这显然是因为除了标准的Microsoft发布的XNA库之外,我还引用MonoGame.Framework.dll了命名空间的命名空间,从而产生了这种模糊性.但是,在所有情况下,我都希望访问MonoGame版本.
任何想法如何我可以明确地告诉编译器使用Color和Vector2类的MonoGame版本而不是官方的微软版本?
任何using Color = Microsoft.Xna.Framework明显的尝试都不会起作用,因为它们在编译的dll中都被标记为相同!
我有一个C#应用程序,包含一个带有多个数据透视表的Pivot.正常的数据透视表正确卸载并且不会泄漏内存.在其中的两个项目中,我有Drawingsurfaces,我使用Monogame来渲染3d模型.在卸载和装载他们的枢轴时,我试图完全破坏,然后完全重新创建"游戏"实例(主要是因为Monogame不允许你现在绘制到两个表面,因为他们使用了大量的内存,并且对他们两个来说都不够).
我的问题在于,当我处理加载时创建的Xamlgame时,它不释放它使用的所有内存.这意味着每次重新创建Xamlgame时,它都会开始使用越来越多的内存,直到不再剩下来为止.因此,我想知道是否有任何C#方法可以完全处理加载对象时使用的所有内存.
任何Monogame特定方式也将受到赞赏.目前我首先处理我的顶点和索引缓冲区,然后我清除了我的顶点和索引列表,然后我处理了我的Basiceffect和我的Graphicsdevicemanager,然后我在"游戏"本身上调用dispose,最后我创建了变量包含等于null的"游戏".
PS.如果您曾在XNA中完成此操作,那么您也可以帮助我,因为语法基本相同.
编辑(可能是MonoGame bug):
我现在已经设法正确清理所有缓冲区等.但是我的BasicEffect仍然存在内存泄漏.我已经尝试将其处理并使其为null,但不管它每次重新加载我的轴时它只是继续使用越来越多的内存.
我几天来一直在与这些问题作斗争,浏览网络,但没有任何帮助我解决它:我在Visual Studio 2012上创建一个MonoGame应用程序,但在尝试加载纹理时,我遇到以下问题:
无法加载Menu/btnPlay资产!
我已设置内容目录:Content.RootDirectory ="Assets"; 此外,文件btnPlay.png还具有以下属性:构建操作:内容和复制到输出目录:如果较新则复制.
我的构造函数和LoadContent函数是完全空的,但看看自己:
public WizardGame()
{
Window.Title = "Just another Wizard game";
_graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Assets";
}
protected override void LoadContent()
{
// Create a new SpriteBatch, which can be used to draw textures.
_spriteBatch = new SpriteBatch(GraphicsDevice);
Texture2D texture = Content.Load<Texture2D>("Menu/btnPlay");
_graphics.IsFullScreen = true;
_graphics.ApplyChanges();
}
Run Code Online (Sandbox Code Playgroud)
我很乐意提供任何帮助!我对这个问题非常绝望....
我在Xamarin中有一个现有的解决方案,用于我正在开发的应用程序.但是我需要做一些3D渲染作为其中的一部分.
我看过MonoGame但是我看不到任何方法可以直接将它作为另一个活动导入,这样我就可以使用标准的Android API轻松切换到它.
是否有另一个更容易使用的库,因为我没有任何3D建模经验,除了乱搞Unity.
我正在使用Xamarin/Monogame开发游戏,我需要在他们点击我的输入控件时在移动设备上打开键盘.我认识到我可以Keyboard.GetState()在使用模拟器和键盘时捕获输入,但真正的用户将拥有物理设备,我需要打开屏幕键盘才能输入信息.我没有在任何描述这个的文档中看到任何内容,但很难相信我是第一个碰到这个问题的人.我在输入时查看了Xamarin/Monogame的文档,并且我已经阅读了这篇StackOverflow文章.如果您需要更多信息来帮助我解决此问题,请与我们联系.在此先感谢您的帮助.
以下帖子看起来与我的问题类似,但最终它看起来与所有细节看起来并不完全一样,所以我打电话来防止声称它的相同.
我在Xamarin Studio中关注这个monogame教程(目前在第2步):
当我在步骤2结束时运行生成的单一游戏应用程序时,当我点击试图加载播放器内容的代码行时,我得到以下异常(粘贴在最后).我将播放器内容文件设置正确AFAIK,将其复制到输出文件夹,但我假设它以某种方式未正确部署到Andriod虚拟机(AVM),我无法弄清楚如何检查部署内容.我拉起Android Monitor来探索AVM,并试图弄清楚它的位置,但我没有任何运气搞清楚......文件未找到异常似乎很清楚AVM上运行的是什么找到内容文件...但我无法弄清楚如何纠正它.
任何帮助将不胜感激,谢谢!
我遇到这个问题的来源和项目都在这里
我看到的例外如下: [MonoDroid] UNHANDLED EXCEPTION:Microsoft.Xna.Framework.Content.ContentLoadException:无法将Graphics\player资产加载为非内容文件!---> Microsoft.Xna.Framework.Content.ContentLoadException:打开流错误.---> Java.IO.FileNotFoundException:抛出了类型'Java.IO.FileNotFoundException'的异常.[MonoDroid的]在Android.Runtime.JNIEnv.CallObjectMethod(IntPtr的jobject,IntPtr的jmethod,Android.Runtime.JValue [] PARMS)[0x00000]在:0 [MonoDroid的]在Android.Content.Res.AssetManager.Open(System.String文件名)[0x00000]在:0 [MonoDroid的]在Microsoft.Xna.Framework.TitleContainer.OpenStream(System.String名)[0x00000]在:0 [MonoDroid的]在Microsoft.Xna.Framework.Content.ContentManager.OpenStream(系统.String assetName)[0x00000] in:0 [MonoDroid] ---托管异常堆栈跟踪结束--- [MonoDroid] java.io.FileNotFoundException:android.content.res中的Content/Graphics/player.xnb [MonoDroid] .AssetManager.openAsset(Native Method)[MonoDroid]在android.content.res.AssetManager.open(AssetManager.java:315)[MonoDroid]在android.content.res.AssetManager.open(AssetManager.java:289)[MonoDroid ]在mono.java.lang.RunnableImplementor.n_run(本机方法)[MonoDroid]在mono.java.lang.RunnableImplementor.run(RunnableImplementor.java:29)[MonoDroid]在android.os.Handler.handleCallba ck(Handler.java:605)[MonoDroid]在android.os.Handler.dispatchMessage(Handler.java:92)[MonoDroid]在Android.os.Looper.loop(Looper.java:137)[MonoDroid]. app.ActivityThread.main(ActivityThread.java:4424)[MonoDroid] at java.lang.reflect.Method.invokeNative(Native Method)[MonoDroid] at java.lang.reflect.Method.invoke(Method.java:511)[ MonoDroid]在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:784)[MonoDroid] at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)[MonoDroid] at dalvik .system.NativeStart.main(Native Method)[MonoDroid] [MonoDroid] ---内部异常堆栈跟踪结束--- Microsoft.Xna.Framework.Content.ContentManager.OpenStream(System.String assetName)[MonoDroid] [ 0x00000] in:0 [MonoDroid] at Microsoft.Xna.Framework.Content.ContentManager.ReadAsset [Texture2D](System.String assetName,System.Action1 recordDisposableObject)[0x00000] in:0 [MonoDroid] ---内部异常结束堆栈跟踪--- [MonoDroid]在Micr SampleShooter.Game1上的Microsoft.Xna.Framework.Content.ContentManager.Load(字符串)<0x000c3> [MonoDroid]中的osoft.Xna.Framework.Content.ContentManager.ReadAsset(string,System.Action1)<0x0042c> [MonoDroid]. LoadContent()在Microsoft.Xna.Framework.Game.Initialize <0x0018b> [MonoDroid的]()<0x0023f> [MonoDroid的]在SampleShooter.Game1.Initialize()<0x00037> [MonoDroid的]在Microsoft.Xna.Framework.Game.在Microsoft.Xna.Framework.Game.DoUpdate(Microsoft.Xna.Framework)的Microsoft.Xna.Framework.AndroidGamePlatform.BeforeUpdate(Microsoft.Xna.Framework.GameTime)<0x0002b> [MonoDroid]上的DoInitialize()<0x00037> [MonoDroid] .GameTime)<0x0002f> [MonoDroid]在Microsoft.Xna.Framework.Game.Tick()<0x00493> …
我刚开始使用这个Mono和.NET的东西,在阅读了一些关于F#之后,我决定尝试在F#和MonoGame上关注这个简单的游戏教程:
http://bruinbrown.wordpress.com/2013/10/06/making-a-platformer-in-f-with-monogame/
在整理出我从博客上复制粘贴的代码的许多语法错误之后,我得到了以下代码:
module desnovro
open Microsoft.Xna.Framework
open Microsoft.Xna.Framework.Graphics
type Game1 () as x =
inherit Game()
do x.Content.RootDirectory <- "Content"
let graphics = new GraphicsDeviceManager(x)
let mutable spriteBatch = Unchecked.defaultof<SpriteBatch>
override x.Initialize() =
do spriteBatch <- new SpriteBatch(x.GraphicsDevice)
do base.Initialize()
()
override x.LoadContent() =
()
override x.Update (gameTime) =
()
override x.Draw (gameTime) =
do x.GraphicsDevice.Clear Color.CornflowerBlue
()
[<EntryPoint>]
let main argv =
use g = new Game1()
g.Run()
printfn "Desnovro!!!"
0
Run Code Online (Sandbox Code Playgroud)
在MonoDevelop解决方案中,我创建了一个F#项目,其中引用了:
我正在制作一个简单的游戏作为最终项目.它将在窗口中显示一个.bmp框架,我无意在游戏运行时调整窗口大小,所以我想修复窗口的大小.问题是当我运行在visual studio 2012中选择monogame游戏创建的项目时,它以全屏模式启动.我尝试使用此代码修复它:
_graphics.IsFullScreen = false;
_graphics.PreferredBackBufferWidth = 640;
_graphics.PreferredBackBufferHeight = 480;
_graphics.Applychanges();
Run Code Online (Sandbox Code Playgroud)
我把它放在主游戏类的构造函数和初始化函数中,但它什么也没做.我正在使用monogame 3.0.
monogame ×10
c# ×7
xamarin ×3
xna ×3
android ×2
iphone ×2
mono ×2
xamarin.ios ×2
.net ×1
f# ×1
farseer ×1
fullscreen ×1
monodevelop ×1
windows-8 ×1