Unity3d在iPhone上的性能表现

11

我非常有兴趣使用Unity3d来开发应用程序。 我喜欢的是可以一次性开发并将应用移植到多个平台(Mac/Windows/iPhone/Android),在我的Mac上的性能也相当不错。

这将是我第一次为iPhone编写应用程序,我很好奇未来可能遇到的性能问题。我想我肯定会在iPhone上使用Unity3d制作原型,但我想知道构建iPhone Unity3d应用程序是否像使用Objective-C编写的本地应用程序一样高效地使用了iPhone资源。

Unity3d网站似乎表明其算法已经优化,我认为如果我在Unity3d论坛中提出这个问题,那么我可能会得到这样的回答。理想情况下,我会很感兴趣听取那些在Unity3d和Objective-C中都制作过应用程序且能够比较两者的人的意见。

让我思考这个问题的讨论是关于iOS开发成本的一个问题,由Andrew和Peter Mortensen在Stack Overflow上回答,其中写道:“有一个比学习Cocoa更容易的开发iPhone应用程序的方法。”

5个回答

12

Unity有一些特定的资源可用于移动开发,包括专门为移动设备设计的资源、着色器等。

您肯定不希望将“未优化”的PC质量资源放入Unity项目中,并将其导出到iOS平台,否则会导致性能差/不可靠。您需要做的是使用与游戏相似质量的资源构建场景,然后在真实设备上测试性能。这将让您了解您的游戏在生产中可以期望哪种级别的性能。

请记住,iPhone、iPad、iPad2等的性能取决于您所做的事情和触及哪些功能。尽管Unity3D已经被大量优化以处理各种情况,但您肯定可以做一些像雾化这样的操作来推动填充率(这是该平台的已知限制),并最终导致可怕的性能。

如果您拥有引擎开发的正确技能集,设计特定的技术实现以满足您的具体要求,那么您可能能够纯粹地使用Objective-C构建应用程序,从而获得更好的性能。

您只需要决定是否要花时间编写技术或构建产品。选择Unity的大多数人之所以这样做,是因为您可以获得一款非常优秀的引擎,大多数人无法超越其性能(尝试构建自己的景观引擎),同时获得卓越的上市时间...实际上,在大多数情况下,上市时间才是真正重要的。


4
这是一篇旧的帖子,但我觉得我应该回答一下,因为没有人真正理解它。
需要记住的是,Unity的内部核心工作完全是本机的。物理引擎以及与碰撞有关的所有内容。遮挡系统(阴影)。整个渲染引擎核心。所有这些都是用C/C++编写的,并且在任何平台上都以完全本机速度运行。AmitApollo说的不正确,虚幻引擎3与Unity相比并不更直接“本机”。无论是Unity、虚幻引擎3还是任何其他3D引擎(如Ogre或cocos3d),它们的核心渲染系统都是用C/C++编写的。其中一些引擎可能比其他引擎实现了某些内部渲染算法,并因此产生了更好的性能,但这与它们是否“本机”无关,因为它们的内部核心渲染系统对于所有这些引擎都是本机的。
物理引擎的内部工作也是用C/C++编写的,因此UE3和Unity中的物理引擎都以“完全本机速度”运行。
epicCitadel演示也不显示比iOS上的Unity更大的技术水平或性能。 Citadel演示的许多“视觉影响”仅仅来自于它是非常好的艺术品。 Citadel演示并没有推动任何比Unity在iOS上处理的更高顶点数更先进的着色器或照明技术。实际上,有更多的例子显示了Unity展示了比虚幻引擎3所展示的更先进的移动渲染技术。例如Shadowgun或BladeSlinger这样的游戏,都展示了比Unreal Engine 3展示的更先进的移动渲染技术。其中一些包括光探针、移动BRDF着色器、透明度和法线贴图以及良好实现的动态移动阴影等。在App Store中最成功的3D游戏大部分都是Unity游戏,因此Unity已经投入了大量的R&D(研究与开发)到Unity的移动渲染性能和功能中。
现在,Unity使用C#和Mono进行脚本编写。根据大多数估计,在iOS上运行速度比本机代码慢大约50%。但是您必须记住,您只在此代码中执行游戏逻辑。您不会在Unity中使用C#和Mono编写任何处理其内部渲染系统或物理系统工作的代码。您只在C#中编写游戏逻辑,然后与渲染和物理核心进行交互,然后以完全本机速度执行。Mono C#的执行速度比本机C++慢,但是如果您编写智能程序,我认为您会发现这根本不是问题,因为您只在Mono C#中执行游戏逻辑,而游戏逻辑并不一定需要占用CPU。据我的经验,纯粹使用Mono C#编写的游戏逻辑很难使iPad 2降至60fps以下。我从来没有受到过这样的限制。
如果我们要将其与虚幻引擎3进行比较,请记住,UE3也是为非本地语言编写游戏逻辑的,即UnrealScript。 UnrealScript是一种类似于Mono C#或Java的语言,其中UnrealScript被编译为字节码,然后在运行时进行解释。这意味着,就像Unity一样,游戏逻辑在UE3中也不是“本地”的。
现在,如果您在这里看看: http://lua-users.org/wiki/LuaVersusUnrealScript 这是一个比较UnrealScript和C ++在使用int进行简单算术运算时的基准测试。它显示unreal script的速度是C ++的1/4到1 / 20th。
然后再看看这里: http://www.codeproject.com/Articles/212856/Head-to-head-benchmark-Csharp-vs-NET 如果您向下滚动到C#与C ++简单算术基准测试。它显示Mono C#在执行简单的int算术运算时是C ++的3/4。在执行浮点数简单算术时,Mono C#的速度约为1/2。 int64和double基准测试对我们来说并不重要,因为通常您不会在iOS游戏逻辑的性能关键代码中使用它们。
现在,其他基准测试表明Mono C#有时具有与C ++相差1/20的性能。但这些是通过非常特定的测试进行的,实际上我能找到的最好的苹果与苹果基准测试是那些简单算术测试。
因此,实际上,由于Unity的脚本运行在Mono C#上,而UE3运行在UnrealScript上。 Unity实际上是可以为您提供在游戏逻辑代码中更好的性能的引擎。
虚幻引擎3比Unity更先进,或者在iOS上提供更好的性能或任何更大的图形能力的观念根本不是真实的。恰恰相反。
现在,如果您使用类似cocos3d之类的东西,您可能会获得更好的性能,因为您的游戏逻辑也可以用C ++编写原生代码。但是,使用像c#这样的脚本语言来执行游戏逻辑的好处远远超过了通常不是问题的性能损失。即使用脚本语言进行游戏逻辑的好处是它为您提供更快的设计迭代,这在做游戏时非常关键,因为事情可能很古怪,并且您经常必须重新编译和测试代码。
但是,在Unity中,使用专业版很容易编写本地代码插件。因此,如果您有需要以本地速度运行的性能关键代码片段,可以将其编写为C ++,将其编译为本地库,然后从Mono C#调用该库。

1
请注意,如果您的目标是所有iOS设备,则重型GPU图形之间的差异意味着iPhone 3GS到4之间存在显著的性能差异,然后从4、4S到iPad2和3。甚至新的iPhone5或iPad4上的某些游戏可能比它的前身运行更高的FPS。请记住保持多边形低,并且在您的地形中保持分辨率低,即使像素误差这样微小的东西也会产生巨大的影响。雾气总会产生压力。纹理>512x512可能会引起问题,同样的多个光源也是如此。没有光渲染要快得多,并烘焙阴影和亮点。我还发现,与最佳性能相比,以本机分辨率运行可能会妨碍性能(Unity 4)。Billboarding,Occlusion Culling也是您想要查找的主题。好看和运行缓慢之间有一条细线。
如果性能对您很重要,您可能需要完全不同的引擎。像虚幻引擎3这样的更直接的“本地”引擎具有惊人的功能。而且它可以在没有太多开销的情况下完成。例如,在iPhone 4或3GS上运行的Epic Citadel Demo应用程序。在Unity中,类似的东西会很慢,并且不会看起来那么性感。

0

在IOS上提高性能的一个有用资源是KGFSkyBox。

我们发现,Unity3D天空盒使用了高达6个绘制调用!这对于最多只能支持30DCs的设备来说是一个很大的问题!

我们通过实现KGFSkyBox来解决这个问题,如果您有地形(隐藏底部天空半球),则将绘制调用减少到1。如果您不使用地形,则KGFSkyBox将使用2个绘制调用,这仍然比6个好!

在此处查看: http://u3d.as/4Wg

如果您有任何问题或建议,请在此处与我们联系:support@kolmich.at


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接