在Objective-C中调用方法/属性的性能开销正在扼杀我的iOS应用程序的性能; Xcode探查器(又名,Instruments)将70%的延迟归因于objc_msgSend
,_retain
和_release
。
在我的代码中,到目前为止,我对XROpenGL
类的实例方法renderSprite(XRSprite)
进行了大约1100次调用,这是renderSprite(XRSprite,int,int,int)
的重载方法,后者又调用了不少于5个其他方法方法,其中许多方法来自XRSprite
的访问属性。可以想象,发送的消息很多。
除了用C ++重写代码的关键部分外,我还有其他选择吗?
答案 0 :(得分:2)
每帧有6,600个电话吗?为了便于讨论,我将假设为60 FPS,总呼叫数为396,000,仅用于显式方法调用。如果你假设悲观情况,objc_msgSend的开销(相对于C函数调用)仍然只有O(100)个周期。所以在现代的iDevice上,你只需要大约4%的CPU时间。没什么大不了的。您可能会为每次调用获得一个或两个相应的版本,但保留/释放相对较快,因此我们再次讨论单位数百分比。这种性质的“运行时开销”高达~10%并不被认为是恶劣的,一般来说,虽然它不是最佳的。
所以,我给你的问题是:
显然是的,您可以在C ++中重写密钥代码。但对于中级绘图代码,您不应该这样做; C ++通常留给低级构造,如向量和四元数以及其他类似的原语。