可能开发iphone的同学不多,但里面讲到的一些优化思路同样也能适用于pc开发,大家可以借鉴。本人翻译水平有限,欢迎指正呵呵!

Unity iPhone开发入门 (一)

为iPhone开发
为iPhone这样的硬件设备开发游戏,需要一种不同的方法(相对家用PC市场)。该设备的硬件标准,不是快速或强大的计算机专用的视频卡。正因为如此,您得以新的思路去开发游戏。Unity的iPhone版本将有一些不同的功能。

遮挡筛选

Unity iPhone包含支持遮挡筛选,这能完美的挤压高性能对于复杂场景和太多的物体。若要了解更多关于如何遮挡筛选工作,请访问遮挡筛选功能页面。

. Net 1.1中(没有泛型)

Unity 的iPhone目前只支援 .Net 1.1。这意味着没有泛型或其他的.NET 2.0的高级功能。当您启动现有的项目,使用泛型,将收到编译错误。您不得使用泛型或其他 .NET 2.0功能。

强制类型的JavaScript 
Unity iPhone的JavaScript中动态变量是不可用的。这类似增加#pragma到您的脚本,但是它是默认的。这将极大地提高性能在iPhone上。当您启动一个现有的Unity项目,其中使用了动态类型,您会收到编译错误。您可以轻松地解决这些动态类型问题,依靠给你的错误提示或利用类型推理。

地形引擎

地形引擎不支持苹果的iPhone 。地形引擎是建立与运行在现代的PC GPU上,不能缩水到iPhone上面
。使用自订的低多边形和遮挡筛选是建立地形在iPhone上的最佳方法。

没有OggVorbis音频解压缩

Ogg动态解算的代价是很昂贵的对于iPhone的处理器,所以被禁用鸟。当编译iPhone程序时
,您将收到编译错误如果您有任何项目的音频文件设置为使用OggVorbis压缩。你可以在置入设置中选择使用这些文件的非压缩音频方式。背景音乐可以使用MP3或m4a压缩音频文件。谘询文件AudioClip更多信息使用的音频压缩在iPhone 中。

PVRTC不支持DXT纹理压缩

Unity iPhone不支持DXT纹理。置入设置中,选择PVRTC纹理压缩这是iPhone上原生支持的方式。它可以压缩纹理,减少内存占用和程序打包体积。(貌似这个显示加速芯片跟当年的DC类似,都是一个公司出的)。

---------------------------------------------------------------------------------------------分割-----------------------------------

使用加速度感应
检测设备方向
您随时可以使用内置的 iphoneInput.orentation 属性检测设备方向。不过,如果您需要更好的控制它,也可以使用自己的底层过滤方式处理这种情况。

在加速计信号感应方面使用底层过滤方式检测设备的方向,比计算最近一次的方向平均值要好。这是因为最近值将对比旧数据视为更重要,还因为它容易执行,并且稍微更有效。(this is because recent data would be treated as more important than older data, and because it's easier to implement and it's slightly more efficient.)

private const float AccelerometerUpdateInterval = 1.0f / 60.0f;

private const float LowPassFilterFactor = AccelerometerUpdateInterval / LowPassKernelWidthInSeconds; // tweakable

private Vector3 lowPassValue = Vector.zero; // should be initialized with 1st sample

Vector3 LowPassFilter(Vector3 newSample) {

lowPassValue = Math.Lerp(lowPassValue, newSample, LowPassFilterFactor);

return lowPassValue;

}

lowPassKernelWidthInSeconds有更大的价值,其中较慢的过滤值将靠拢当前输入采样(反之依然)。你将能够使用LowPassFilter代替avgSamples()。

我想尽可能精确地读取加速度传感器。该怎么做?
读取iphoneInput.accelemrometer变量不等于采样硬件。简而言之,unity以60Hz的频率对硬件采样然后将结果纳入变量中。在现实中,事情变的更加复杂。加速计通过NSTimer内部进行控制。它并不执行在恒定的时间间隔,而是根据cpu负载情况而变化。例如你能在一帧得到2次采样,而在另一帧只得到1次。下面列出的是一个时间间隔以毫秒为单位的加速计采样数据。采样间隔120Hz,当一个测试场景运行在30fps,和简单的代码模拟约20毫秒每帧的的cpu负载。

?
accelerator dt = 1.0ms

?
accelerator dt = 0.5ms

?
accelerator dt = 0.4ms

?
accelerator dt = 26.5ms

?
accelerator dt = 0.8ms

?
accelerator dt = 12.7ms

?
accelerator dt = 5.6ms

您可以访问所有方向的测量在加速计执行期间。下面的代码将简单计算一个平均值对前一帧收集的所有加速计事件。

float period = 0;

Vector3 acc = Vector3.zero;

foreach (iPhoneAccelerationEvent evnt in iPhoneInput.accelerationEvents)

{

acc += evnt.acceleration * evnt.timeDelta;

period += evnt.timeDelta;

}

if (period > 0)

acc *= 1.0/period;

Unique ID
有一些设备属性你可以读取用于处理各种案例。从检查客户是否运行于特定的iphone os版本,到合并device名称以某种方式应用到你的游戏中等等。这些属性是

?
iPhoneSettings.uniqueIdentifier

?
iPhoneSettings.name

?
iPhoneSettings.model

?
iPhoneSettings.systemName

?
iPhoneSettings.systemVersion

iPhone Stripping Level(专业版功能)

尺寸优化的方法如下:

A)在程序集剥离级别(at Strip assemblies level):脚本对字节代码进行分析,根据收集的资料,没有被引用的类和方法将被移除,dll也被AOT step排除。此优化主要减少二进制码和相应的dll尺寸。这个功能是安全的,没有不良反映。

B)在Use micro mscorlib 级别:
使用特别的袖珍版本mscorlib,有些组件将被预先移除,例如:Security, Reflection.Emit, Remoting, non Gregorian calendars, etc 因此内部组件的互相依存程度降到最低。此优化主要减少二进制代码和micorlib尺寸。这个功能和某些系统部件不兼容,要小心使用。

c)在Strip ByteCode级别(剥离字节代码):额外的.NET DLLs(储存在数据文件夹)将被卸下只剩元数据。这是可能的因为所有代码已经在ATO中预编译并且联接到主代码。

注解:如果你选择B级,那么意味着优化方案A也被实现,如果你选择C级,那么A和B一级的优化也包括在内

iphone 脚本调用优化(专业版功能)
慢和安全:默认mono内部调用操作,支持例外(exception)。
快和不支持例外(Fast and Exceptions Unsupported):快速mono内部调用执行,但例外(exception)是不支持的,所以使用时要当心。典型的情况下它是可用的:应用程序调用大量unityEngine并且不抛出任何例外。此选项可节省1-4ms每帧。

Using .NET libraries
我们建议尽量少的保留对库引用,因为1MB的.NET CIL 能转化为3-4MB ARM代码。例如 应用程序引用System.dll 和 System.xml.dll,这意味着附加的6MB ARM代码如果不使用剥离功能。在某点上的应用程序将到达极限时,连接器连接code.x会有麻烦。如果您多留心应用程序的大小,你能发现C#是更适合你的语言代码,它比 Boo或Javascript依赖性更小。

未支持的项目

一般性的:
。不支持iphone simulator。使用iphone Remote 程序在iphone上快速开发、部署和运行你的项目。
。不支持Ogg音频压缩。

图形:

。Pixel shaders iphone硬件不支持,但你能使用纹理混合。
。DXT纹理压缩不支持,使用PVRTC代替。
。非平方纹理不支持。
。地形engine不支持。

电话功能:
。iphone 摄像头、定位服务、沉默开关(silent switch),麦克输入和震动不直接支持,但可以使用定制的ObjectC代码访问这些功能。

脚本:
。动态javascript功能像 duck typing ,“eval”函数等等都不支持。因为所有代码在构建期间已经被提供编译。使用#program 严格你的脚本,强制编译器报告一个动态功能错误。
。 .NET2.0功能(包括泛型)不支持。
。.NET socket 在 unity iphone standard版中不支持
。system.dll &system.Xml在标准版中不支持。
。视频流通过WWW class当前不支持
。HTTPS在当前WWW class 中不支持。
。7,额外的.NET组件支持(实际数量取决于有多少种不同的脚本语言使用在项目中)。建议保持.NET组件依赖程度到尽可能低的水平,因为它极大的影响最终的二进制代码和封装发布尺寸。

-----------------------------------------123---------------------------------------------------------------------------------------

本节的内容是说明iphone开发一些最常见和重要的问题。

先决条件 
我刚收到iPhone开发的许可,但我之前从来没有为iPhone开发。我该怎么办呢? 
答:下载的SDK ,启动和运行苹果开发者网站,建立您的team,devices和provisioning。我们提供了基本的步骤列表让你开始。

用unity建造的游戏可否运行在iPhone的模拟器? 
答:不可以。iPhone模拟器对于unity不是非常有用,因为它没有模拟iPhone所有的交互方式,而且它模拟的性能和运行在iPhone上是不一样的。您可以直接在unity内部测试游戏,iPhone将作为一个遥控器使用,当它运行在iphone的远程应用端(unity remote)上时。然后当您准备好要测试性能和优化游戏时,就将其直接发布(publish)到iPhone中。

unity Remote
我该怎样使用unity Remote? 
答:在您的unity iPhone安装目录,您会看到一个文件夹,名为“unity Remote” 。这包含了XCode项目,您可以运行和编译unity Remote安装到您iphone上。安装后,请确保您的设备和开发机是通过WiFi连接到同一网络。在unity 运行时启动iphone Remote,并在出现的列表中选择您的计算机。现在,只要您点击编辑器中的播放模式,您的iphone设备将作为一个远程控制端用来开发和测试游戏。

我在
xcode里产生了一个奇怪的错误,当部署unity Remote到设备时 
答:unity Remote的identifiler和您提供的provisioning profile不匹配。您必须手动更改此签名在您XCode项目。identifiler必须和您提供的provisioning profile相符。

如果你有一个授权的AppID,上面标有星号作为结束(例如######. com.mycompany .* ),你可以跳过这一段。如果您没有创建AppID,那么你就必须在iphone开发中心的program portal中建立一个。转到program portal,选择AppIDs选项卡上,单击添加编号按钮(右上角) ,输入*在app id名称和您通常使用的签名(例如com.mycompany )之后 。添加新AppID到你的provisioning profile中,请下载并重新安装它。不要忘了之后重新启动XCode。如果您有任何麻烦请查询如何配置授权章节。

打开iphone Remote 项目在XCode中 。在菜单中选择项目“project->Edit Active Target”unity Remote“ ,将打开一个”unity Remote“信息窗口。选择Properties选项卡。更改identifiler属性字段com.unity3d.UnityRemote为您的AppID。其次是“ UnityRemote ” 。例如,如果您provisioning profile包含######. com.mycompany .* 这个AppID,当更改identifiler字段为com.mycompany.UnityRemote 。在Build菜单中选择清除所有目标,然后编译并再次安装unity Remote。 
(不要忘了要更改identifiler,然后才能安装unity Remote到您的设备上)

unity特性 
我如何使用触摸屏和加速度计? 
答:在scripting reference中,你会找到一些iPhoneInput类,还有iPhoneSettings和其他一些。这些新增的iPhone类负责钩起设备指定功能。

难道iPhone支持unity的地形引擎? 
答:在unity iPhone中目前不支持地形。在iPhone上您需要绘制low poly地形。地形系统没有这个功能,所以使用low poly是更好的选择。

我现有的粒子系统运行在iPhone上时很慢。我应该怎么办? 
答: iPhone拥有相对较低的fillrate 。如果您的粒子效果覆盖大部分的屏幕,而且是multiple layers的-这样即使最简单的shader,也能让iphone傻眼。我们建议把您的粒子效果baking成纹理序列图。然后在运行时可以使用1-2个粒子,通过动画纹理来显示它们。这种方式可以取得很好的效果,以最小的代价。

我是否可以在游戏中,使用复杂的物理仿真? 
答:iPhone运算物理仿真代价很高,我们建议您尽可能少使用它们。物理需要做很多浮点数运算不适合iPhone的ARM处理器。如有可能,完全避免使用MeshColliders,但必要时它们是可用的。要提高性能,使用一个低的固定帧率在 Edit“Time”->"Fixed delta Time"。建议控制在10-30。在降低物理帧速率的同时,可以使用刚体插值以实现平滑的动作效果。为了实现完全流畅的帧率而不卡机,最好是选择Fixed deltaTime value base,使您的游戏在iPhone上获得一个平均的帧率 。建议要么1:1或一半的帧速率。例如,如果您获得每秒30张,您应该使用15或30 fps为物理固定刷新率( 0.033或0.066 )

使用UnityGUI的考虑 
使用UnityGUI将会对我的游戏性能产生什么影响吗? 
答: 当有许多交互控制时,UnityGUI的使用代价是相当昂贵的,。理想的方法是限制使用UnityGUI游戏菜单,或在游戏运行中尽量少用GUI控制。重要的是要注意,每个对象脚本的OnGUI ( )调用将需要更多的处理器时间,即使它是一个空OnGUI ( )块。最好的方法是禁止此脚本调用GUI元件,如果它没有使用。为此,您可以标记脚本为Enabled=false。

UnityGUI 有没有其他的使用技巧? 
尽可能少尝试使用GUILayout。如果您的GUILayout不是都从一个OnGUI调用,您可以停用所有GUILayout渲染使用MonoBehaviour.useGUILayout =false;这能双倍提高GUI图形渲染性能。最后,尽量少用GUI元件,在绘制三维场景的同时。

设备的图形性能 
什么是网格量化? 
答:在iPhone中内存带宽是另一个宝贵的资源,(因为CPU和GPU需要共享带宽) 。 iPhone支持32 ,16和8bit类型的vertex components。量化网格图形数据到这些指定类型,可以尽量压缩顶点数据尺寸(鉴于它可以容忍一些用户指定错误)。由于访问数据量的减少,可以提高性能。

我可以在iphone上使用bumpmapped 吗? 
答: iPhone拥有介于TNT2和GeForce1之间的片段处理能力。它可以加或乘两个纹理在一起,但法线贴图只能歇菜。

基本的顶点计数原则是什么? 
答:为了实现每秒30张在iPhone上,你应该让每帧顶点计数明显低于7000个。每个场景顶点数量则没有限制。只要您确保不超过7000个顶点在同一可见画面中,就能保证unity的高帧率。使用新的遮挡筛选功能,可以确保只有7000顶点可见。

Xcode 
我收到了很多编译错误Xcode 。这是怎么回事? 
答:请确认您选择了“Device”模式,而不是“simulator”。

有时,当我点击“Build and go” ,我看到奇怪的错误。 
答:这是一个Xcode的Bug ,并且不破坏您的项目。只要按一下确定以绕过消息,您的游戏应该功能完全正常。

我该如何设定我的应用程序图标在iphone主页屏幕? 
答:你需要从Xcode中处理这个 。有一些简单的步骤如下:

创建您的57x57像素png图像。
将其命名为“ Icon.png ” ,并将其放置在Xcode项目的根目录 
在Xcode ,右键单击该项目文件中“Group&File” 
选择Add...->Existing files并添加您的图片。 
找到Info.plist在Xcode ,双击它 
改变“Icon file”属性值为“ Icon.png ”

如何设置启动画面为我的应用(只支持unity iPhone专业版) 
答:你需要在Xcode中实现 。有一些简单的步骤如下:

创建一个320x480像素的png图片 
其命名为“ Default.png ” ,并将其放置在Xcode项目的根目录 
在Xcode ,右键单击该项目文件中“Group&File” 
选Add...->Existing Files并添加您的图片。

Unity iPhone开发入门相关推荐

  1. Unity3D iPhone开发入门 (转)iPhoneSettings.

    From: http://www.j2megame.com/html/xwzx/ty/2363.html 作者:Unity3D大中华社区 日期:2011年07月13日 来源:Unity3D大中华社区 ...

  2. iPhone开发入门守则:Objective-C编码规范--系列教程

    iPhone开发入门守则:Objective-C编码规范(1) iPhone开发入门守则:Objective-C编码规范(2) iPhone开发入门守则:Objective-C编码规范(3) iPho ...

  3. iPhone开发入门(1)----程序员眼中的iPhone

    自去年 iPhone 面世以来,开创了移动设备内容服务的一种新的模式--程序商店(App Store).它极大地降低了移动设备应用程序开发的成本,即使普通人也能进入这个市场.就像在PC上开发应用程序一 ...

  4. iPhone开发入门(10)— 设备上运行程序

    博主:易飞扬 原文链接 : http://www.yifeiyang.net/introduction-to-iphone-development-10-devices-running-the-pro ...

  5. iPhone开发入门(1)—-程序员眼中的iPhone

    http://blog.csdn.net/itudou_2010/article/details/5492272 iPhone开发入门(1)--程序员眼中的iPhone 博主:易飞扬 原文链接 : h ...

  6. iPhone开发入门

    首先我们得成为注册ADC会员,这个是免费的,并且可以获得很多开发资料. http://developer.apple.com/iphone/program/start/register/ 上面是注册地 ...

  7. 图解iPhone开发入门教程

    现在的智能手机越来越风行了,其中尤以Apple的iPhone和Google的Android系统最为流行,这里我将向大家介绍iPhone开发的基础知识.为了便于初学者尽快上手,我尽量以代码加截图的方式加 ...

  8. unity游戏开发入门-spine

    好久没写了,过来写一下,本文章针对代码(示例Lua)控制Spine(一种2D美术资源),这里主要针对SkeletonAnimation形式,说明方式使用代码注释记录. 代码每块全博客衔接 1.spin ...

  9. unity游戏开发入门-Resources动态加载图片

    问题:unity的Resources动态加载就不必多说了,这里出现的问题是当我把图片放入Resources文件夹后,使用Resources.Load(datapath)却并没有出现图片. 分析:由于你 ...

最新文章

  1. Open Drug Discovery Toolkit
  2. python compileall 打包发布
  3. 腾讯十周年,看看你的QQ是什么时候注册的?
  4. 泛型的作用是什么?——Java系列学习笔记
  5. HTTP 200 OK和HTTP 304 Not modified的由来
  6. python实现倒n字形排列_Leetcode问题库——Z形变换(Python),补充X形变换,字形
  7. 前端学习(3189):react简介
  8. 从头开始建立神经网络翻译及扩展
  9. 文件系统FastDFS和阿里云OSS
  10. Q-learning原理及其实现方法
  11. python需要学哪些基础知识_零基础学Python应该学习哪些入门知识
  12. 基于STM32+华为云IOT设计的酒驾监控系统
  13. 一篇爽文带你全面了解mysql的索引
  14. excel批量提取网页标题
  15. vue2中的mixin
  16. 【问题思考总结】为什么基础解系中两个自由变量对应两个线性无关的解?
  17. 2016世界人工智能大会 AI领袖共启智能+新纪元
  18. 汉谟塔C语言,巴别塔的故事
  19. 【业务架构】价值实现、价值定位、价值创造
  20. Win10操作系统语言中文转英文设置步骤

热门文章

  1. html微信气泡插件,微信加上个性化插件工具,瞬间逼格满满
  2. ubuntu 我喜欢的快捷键
  3. Linux下通过开源软件fail2ban进行远程登录防护
  4. mysql 保存表情包
  5. 查询读者的借阅信息mysql_MySQL数据库命令行【篇章九】之数据库综合查询(SELECT)...
  6. 我玩的王者荣耀(一)——鲁班
  7. Python学习打卡【Task3】异常处理
  8. SST-Calib:结合语义和VO进行时空同步校准的lidar-visual外参标定方法(ITSC 2022)
  9. 5G时代要来了?5G到底什么样?
  10. 安卓高级8 支付宝支付