去年开始做空间计算应用的开发,主要是基于Apple Vision Pro的visionOS平台。
本以为有iOS开发经验,做visionOS应该不难。结果真正上手之后才发现,空间计算和传统的2D开发完全是两回事。新的交互范式、新的设计原则、新的技术栈,到处都是坑。
这几个月,踩了不少坑,熬了不少夜。这篇文章,我想把这些踩坑经历分享出来,从手势交互、空间布局、性能优化到平台限制,聊聊空间计算开发的真实体验。希望能给正在做或者打算做空间计算开发的朋友一些参考,少走一些弯路。
坑一:手势交互和2D完全不同
第一个大坑,就是手势交互。
做iOS开发的时候,手势很简单:点击、滑动、捏合,就那么几种,而且都是在屏幕平面上操作。但空间计算的交互完全不一样,用户是在三维空间中用眼睛和手来操作的。
visionOS的核心交互是"眼动+捏合":眼睛看哪里,光标就到哪里,然后拇指和食指捏合,就相当于点击。听起来简单,但实际做起来问题很多。
第一个问题是,眼动追踪的精度。虽然Vision Pro的眼动追踪已经很准了,但在小按钮、密集列表的场景下,还是会选错。用户想看A按钮,结果光标跳到了B按钮上。我们一开始把按钮做得和iOS一样大,结果用户经常点错。后来把按钮放大,增加间距,才好了一些。
第二个问题是,手势的学习成本。很多新用户不知道怎么操作,需要引导。我们的应用一开始没有引导,很多用户拿到手不知道怎么用,反馈很差。后来加了一个新手引导,用动画演示基本的手势操作,用户体验好了很多。
第三个问题是,手势的疲劳。长时间抬手操作,手臂会酸。我们的应用有一个功能需要用户频繁抬手操作,测试的时候很多用户反馈累。后来改成了尽量用眼睛注视+偶尔捏合的方式,减少抬手的频率,才解决了这个问题。
第四个问题是,多种手势的冲突。visionOS支持很多手势:捏合、拖动、旋转、缩放,还有自定义手势。如果设计不好,手势之间会冲突。比如,我们有一个可拖动的窗口,窗口里有一个可旋转的3D模型,用户想拖动窗口,结果变成了旋转模型。后来通过增加操作模式切换,才解决了冲突问题。
经验总结:空间计算的交互设计,要从2D的思维转变到3D的思维。按钮要大,间距要宽,操作要简单,减少抬手,做好引导。不要把iOS的交互直接搬过来,要重新设计。
坑二:空间布局不是简单的3D化
第二个大坑,是空间布局。
一开始我以为,空间计算就是把2D界面放到3D空间里,把窗口浮在空中就行了。但实际做起来发现,空间布局有很多讲究。
第一个问题是,窗口的位置和大小。在visionOS中,窗口可以放在用户周围的任意位置,但放哪里、放多大,直接影响用户体验。我们一开始把窗口放在用户正前方,大小和iPad差不多,结果用户觉得太近了,有压迫感。后来把窗口放远一些,调大一些,用户才觉得舒服。
还有,不同的功能适合不同的空间位置。比如,主要的操作界面放在正前方,辅助信息可以放在侧面,通知类的内容可以放在上方或下方。合理的空间布局,能让用户自然地找到需要的内容,不需要频繁转头。
第二个问题是,3D模型的展示。空间计算的一个优势是能展示3D模型,但3D模型的展示也有坑。比如,模型太大了,用户看不全;太小了,细节看不清。我们的应用展示一个建筑模型,一开始模型太大,用户需要后退才能看全,但Vision Pro的空间是有限的,后退太多就出了追踪范围。后来给模型加了缩放和自动调整大小的功能,才解决了这个问题。
还有模型的初始位置和朝向。用户打开应用的时候,模型应该出现在用户面前合适的位置,朝向用户。如果模型出现在用户身后或者侧面,用户找不到,体验就很差。我们一开始没注意这个,有用户反馈说"打开应用什么都没有",后来才发现模型出现在了身后。
第三个问题是,多窗口的协作。空间计算可以同时打开多个窗口,但多窗口的布局和协作很复杂。比如,两个窗口重叠了怎么办?用户移动一个窗口,另一个窗口要不要跟着动?窗口之间怎么传递数据?这些问题,2D开发中也有,但在3D空间中更复杂。
我们的应用有一个主窗口和一个详情窗口,一开始两个窗口是独立的,用户移动主窗口,详情窗口不动,结果两个窗口离得很远,操作很不方便。后来改成了详情窗口跟随主窗口,保持相对位置,才好了一些。
经验总结:空间布局要考虑用户的舒适度和自然习惯。窗口位置、大小、距离都要经过测试,不要凭感觉设计。3D模型要考虑可见性和可达性,多窗口要考虑协作关系。
坑三:性能优化比想象中难
第三个大坑,是性能优化。
空间计算应用对性能要求很高,因为要实时渲染3D场景,还要处理眼动和手势追踪。帧率必须稳定在90fps以上,否则用户会觉得卡顿,甚至头晕。
第一个问题是,3D模型的面数太多。我们一开始用了一个很精细的3D模型,面数有几百万,结果帧率直接掉到了30fps,卡得不行。后来才知道,Vision Pro虽然性能不错,但也扛不住这么高的面数。我们把模型减面到几十万,用法线贴图模拟细节,帧率才恢复正常。
经验是,空间计算的3D模型要做专门的优化:控制面数、用LOD(细节层次)、合并网格、压缩纹理。不要把影视级的模型直接拿过来用,要针对实时渲染做优化。
第二个问题是,渲染顺序和透明度。3D场景中,透明物体的渲染很耗性能,而且容易出渲染错误。我们的场景中有几个半透明的玻璃材质,结果帧率上不去,而且有时候玻璃后面的物体会消失。后来把透明材质改成了不透明,或者用假的透明效果(比如贴图),才解决了问题。
第三个问题是,动态阴影。实时阴影很耗性能,尤其是多个光源的情况下。我们一开始开了实时阴影,结果帧率不稳定。后来改成了烘焙阴影(把阴影预先烘焙到贴图里),只对动态物体用简单的实时阴影,性能好了很多。
第四个问题是,内存管理。Vision Pro的内存是共享的,应用能用的内存有限。我们一开始加载了很多高清纹理,结果应用闪退了,才发现是内存不够。后来做了纹理压缩、按需加载、及时释放,才解决了内存问题。
第五个问题是,发热和续航。空间计算应用很耗性能,设备容易发热,发热之后会降频,导致卡顿。我们的应用用久了就会变卡,一开始以为是代码问题,后来发现是设备发热降频了。解决方法是持续优化性能,降低GPU和CPU的负载,同时避免长时间高负载运行。
经验总结:空间计算的性能优化是一个系统工程,从模型、纹理、渲染到内存,每个环节都要优化。要尽早做性能测试,不要等开发完了再优化,那时候可能要推翻重来。
坑四:平台限制和文档不足
第四个大坑,是平台的限制和文档不足。
visionOS是一个新平台,虽然苹果提供了开发工具和文档,但和iOS比起来,还很不完善。
第一个问题是,API的限制。visionOS的SwiftUI和UIKit有很多API是不支持的,或者行为不一样。比如,一些iOS上常用的控件,在visionOS上没有,或者样式不一样。我们一开始用了一些iOS的API,结果编译报错,或者运行起来行为异常。后来才发现,这些API在visionOS上不支持,需要用visionOS特有的API替代。
第二个问题是,文档不完整。很多API的文档很简略,只有一个函数签名,没有详细说明和示例。有些特性,文档里提了一句,但不知道怎么用。我们遇到过一个问题,查了半天文档也没找到答案,最后是在开发者论坛上看到别人的讨论才解决的。
第三个问题是,模拟器和真机的差异。visionOS的模拟器能做基本的测试,但很多功能(比如眼动追踪、手势识别、空间感知)在模拟器上体验不好,必须用真机测试。但Vision Pro很贵,不是每个人都有。我们开发的时候,大部分时间用模拟器,关键功能用真机测试,结果模拟器上没问题的功能,真机上出了问题,来回调试很费时间。
第四个问题是,审核规则不明确。App Store的审核规则,visionOS的部分还在完善中。我们的应用提交审核的时候,因为一些细节被拒了,而这些细节在审核指南里没有明确说明。后来和审核团队沟通了几次,才搞清楚要求。
经验总结:新平台的开发,要做好踩坑的准备。仔细阅读平台的开发指南和HIG(人机界面指南),多关注开发者论坛和社区,尽早用真机测试,不要完全依赖模拟器。
坑五:用户体验的细节
第五个大坑,是用户体验的细节。
空间计算是一个全新的交互方式,很多在2D平台上理所当然的事情,在空间计算中需要重新考虑。
第一个问题是,舒适度。空间计算应用如果设计不好,用户会觉得头晕、眼睛疲劳。比如,物体移动太快、画面闪烁、景深变化太剧烈,都会导致不适。我们的应用有一个动画效果,物体快速从远处飞到近处,测试的时候有用户反馈头晕。后来把动画改慢,加了缓动效果,才好了一些。
还有,文字的大小和对比度。在3D空间中,文字太小或者对比度不够,用户看不清。我们一开始用了和iOS一样的字体大小,结果用户反映看不清。后来把字体调大,增加对比度,才解决了问题。
第二个问题是,空间感知。Vision Pro能感知用户周围的环境,应用可以利用这些信息。比如,把虚拟物体放在真实的桌面上,或者让虚拟人物站在房间里。但空间感知的数据不是100%准确的,有时候平面检测会出错,虚拟物体会飘在空中或者陷进桌子里。我们加了手动调整位置的功能,让用户可以自己修正。
第三个问题是,社交场景。空间计算的一个重要场景是多人协作,但多人空间计算的开发很复杂。比如,多个用户看到的虚拟物体位置要一致,用户之间的交互要同步,网络延迟要低。我们做了一个简单的多人协作功能,光是同步状态就花了很多时间,网络延迟的问题也花了不少功夫优化。
第四个问题是,隐私。空间计算涉及用户的空间数据、眼动数据、手势数据,这些都是敏感信息。苹果对隐私的要求很高,应用必须明确告知用户收集了什么数据,用来做什么,而且不能收集不必要的数据。我们在开发的时候,因为隐私说明不够清楚,被审核拒了一次,后来修改了隐私政策才通过。
经验总结:空间计算的用户体验,要从"人"的角度出发,考虑舒适度、自然性、隐私等因素。细节决定成败,一个小问题可能就会让用户觉得不舒服,甚至放弃使用。
踩坑之后的收获
踩了这么多坑,熬了这么多夜,收获也是有的。
第一个收获是,对新交互范式的理解。空间计算不是2D的延伸,而是一种全新的交互方式。它有自己的设计原则、技术特点和用户期望。理解了这些,才能做出好的空间计算应用。
第二个收获是,解决问题的能力。新平台的开发,没有现成的答案,很多问题需要自己摸索。这个过程虽然痛苦,但确实锻炼了解决问题的能力。现在遇到新问题,我不会慌了,会一步步分析、排查、解决。
第三个收获是,对未来的信心。空间计算虽然现在还不成熟,设备也贵,应用也少,但我能看到它的潜力。在教育、医疗、设计、娱乐等领域,空间计算能带来革命性的体验。我相信,随着技术的进步和设备的普及,空间计算会像智能手机一样,改变我们的生活。
给新手的建议
最后,给打算做空间计算开发的朋友几个建议。
第一,先买设备或者借设备。空间计算的开发,真机测试是必须的。模拟器只能做基本的开发,很多体验必须用真机才能感受到。如果条件允许,尽早入手一台Vision Pro,或者参加苹果的开发者实验室,用真机测试。
第二,从简单的应用开始。不要一上来就做复杂的3D游戏或者多人协作,先做一个简单的2D窗口应用,熟悉平台的基本开发流程和交互方式。然后逐步增加3D内容、手势交互、空间感知等功能。
第三,认真学习HIG。苹果的Human Interface Guidelines(人机界面指南)是空间计算设计的圣经,里面详细说明了设计原则、交互方式、控件使用等。认真读一遍,能避免很多低级错误。
第四,加入开发者社区。空间计算的开发者社区还在成长中,遇到问题可以在论坛、Discord、Twitter上交流。很多问题,社区里已经有人遇到过并解决了,不用自己从零开始摸索。
第五,保持耐心。新平台的开发,坑多、文档少、工具不完善,遇到问题是正常的。不要灰心,耐心排查,慢慢积累经验。随着平台的成熟,开发会越来越顺利。
写在最后
空间计算是一个充满挑战和机遇的领域。
踩坑的过程虽然痛苦,但每解决一个问题,就会有一份成就感。而且,在一个新平台的早期入局,能积累宝贵的经验,等平台成熟的时候,你就是先行者了。
如果你对空间计算感兴趣,不要犹豫,动手开始做吧。哪怕只是做一个简单的小应用,也比只看不动强。在实践中学习,在踩坑中成长,这是掌握新技术的最好方式。
希望我的踩坑经历,能给你一些参考。如果你也在做空间计算开发,有什么经验或者问题,欢迎在评论区交流。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录