- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我的应用程序在我的 iPad 上运行。但它的表现非常糟糕——我的速度低于 15fps。谁能帮我优化一下?
它基本上是一个轮子(派生自 UIView),包含 12 个按钮(派生自 UIControl)。
当用户旋转它时,按钮会动态展开和收缩(例如,12 点钟位置的按钮应该始终是最大的)
所以我的轮子包含:
- (void) displayLinkIsCallingBack: (CADisplayLink *) dispLink
{
:
// using CATransaction like this goes from 14fps to 19fps
[CATransaction begin];
[CATransaction setDisableActions: YES];
// NEG, as coord system is flipped/fucked
self.transform = CGAffineTransformMakeRotation(-thetaWheel);
[CATransaction commit];
if (BLA)
[self rotateNotch: direction];
}
…根据最近的触摸输入计算轮子的新旋转。这里已经有一个性能问题,我正在一个单独的线程中解决:iOS Core-Animation: Performance issues with CATransaction / Interpolating transform matrices
此例程还检查滚轮是否完成了另一个 1/12 圈,如果完成则指示所有 12 个按钮调整大小:
// Wheel.m
- (void) rotateNotch: (int) direction
{
for (int i=0; i < [self buttonCount] ; i++)
{
CustomButton * b = (CustomButton *) [self.buttons objectAtIndex: i];
// Note that b.btnSize is a dynamic property which will calculate
// the desired button size based on the button index and the wheels rotation.
[b resize: b.btnSize];
}
}
现在是实际调整大小的代码,在 button.m 中:
// Button.m
- (void) scaleFrom: (float) s_old
to: (float) s_new
time: (float) t
{
CABasicAnimation * scaleAnimation = [CABasicAnimation animationWithKeyPath: @"transform.scale"];
[scaleAnimation setDuration: t ];
[scaleAnimation setFromValue: (id) [NSNumber numberWithDouble: s_old] ];
[scaleAnimation setToValue: (id) [NSNumber numberWithDouble: s_new] ];
[scaleAnimation setTimingFunction: [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionEaseOut] ];
[scaleAnimation setFillMode: kCAFillModeForwards];
scaleAnimation.removedOnCompletion = NO;
[self.contentsLayer addAnimation: scaleAnimation
forKey: @"transform.scale"];
if (self.displayShadow && self.shadowLayer)
[self.shadowLayer addAnimation: scaleAnimation
forKey: @"transform.scale"];
size = s_new;
}
// - - -
- (void) resize: (float) newSize
{
[self scaleFrom: size
to: newSize
time: 1.];
}
我想知道问题是否与排队的多个 transform.scale 操作的开销有关——每个按钮调整大小需要一整秒才能完成,如果我快速旋转轮子,我可能每秒旋转几圈;这意味着每个按钮每秒调整大小 24 次。
** 创建按钮层 **
我想拼图的最后一 block 是查看按钮的 contentsLayer。但是我试过了
contentsLayer.setRasterize = YES;
应该有效地将其存储为位图。因此通过设置,代码实际上动态调整了 12 个位图的大小。
我无法相信这会超出设备的极限。然而,core animation instrument 告诉我的不是这样;当我旋转方向盘时(通过在圆圈中拖动我的手指),它报告 ~15fps。
这不好:我最终需要在每个按钮内放置一个文本层,这将进一步降低性能(...除非我使用上面的 .setRasterize 设置,在这种情况下它应该是相同的).
一定是我做错了什么!但是什么?
编辑:这里是负责生成按钮内容层(即带阴影的形状)的代码:
- (CALayer *) makeContentsLayer
{
CAShapeLayer * shapeOutline = [CAShapeLayer layer];
shapeOutline.path = self.pOutline;
CALayer * contents = [CALayer layer];
// get the smallest rectangle centred on (0,0) that completely contains the button
CGRect R = CGRectIntegral(CGPathGetPathBoundingBox(self.pOutline));
float xMax = MAX(abs(R.origin.x), abs(R.origin.x+R.size.width));
float yMax = MAX(abs(R.origin.y), abs(R.origin.y+R.size.height));
CGRect S = CGRectMake(-xMax, -yMax, 2*xMax, 2*yMax);
contents.bounds = S;
contents.shouldRasterize = YES; // try NO also
switch (technique)
{
case kMethodMask:
// clip contents layer by outline (outline centered on (0, 0))
contents.backgroundColor = self.clr;
contents.mask = shapeOutline;
break;
case kMethodComposite:
shapeOutline.fillColor = self.clr;
[contents addSublayer: shapeOutline];
self.shapeLayer = shapeOutline;
break;
default:
break;
}
if (NO)
[self markPosition: CGPointZero
onLayer: contents ];
//[self refreshTextLayer];
//[contents addSublayer: self.shapeLayerForText];
return contents;
}
如您所见,我正在尝试所有可能的方法,我正在尝试两种制作形状的方法,并且分别切换 .shouldRasterize
** 妥协 UI 设计以获得可接受的帧率 **
编辑:现在我尝试禁用动态调整大小行为,直到轮子进入新位置,并设置 wheel.setRasterize = YES。所以它有效地在手指下方旋转一个预渲染的 UIView(它确实占据了大部分屏幕)(它很乐意这样做 @~60fps),直到轮子停止,此时它执行这个滞后的调整大小动画( @<20fps).
虽然这给出了一个可以接受的结果,但我不得不以这种方式牺牲我的 UI 设计似乎很疯狂。我确信我一定做错了什么。
编辑:我刚刚尝试手动调整按钮的大小;即在每个按钮中放置一个显示链接回调,并动态计算此给定帧的预期大小,使用 CATransaction 明确禁用动画,就像我对滚轮所做的一样,设置新的转换矩阵(从预期大小生成比例转换)。除此之外,我还设置了按钮内容层 shouldRasterize = YES。所以它应该简单地将每帧 12 个位图缩放到一个本身旋转的 UIView 上。令人惊讶的是,这太慢了,它甚至使模拟器停止运行。这绝对比使用核心动画的动画功能自动执行慢 10 倍。
最佳答案
我没有开发 iPad 应用程序的经验,但我有一些优化视频游戏的经验。所以,我不能给出确切的答案,但我想给出一些优化方面的提示。
Do not guess. Profile it.
您似乎试图在不分析代码的情况下进行更改。更改一些可疑代码并祈祷并没有真正起作用。您应该通过检查每个任务花费的时间
时间以及它们需要运行的频率
来分析您的代码。尝试分解您的任务并放置分析代码以测量时间
和频率
。如果您可以测量每个任务使用了多少内存
,或者多少其他系统资源,那就更好了。根据证据而不是你的感觉找到你的瓶颈。
对于您的具体问题,您认为当您开始调整大小时程序变得非常慢。但是,您确定吗?它可能是别的东西。在我们拥有实际的分析数据之前,我们无法确定。
Minimize problematic area and measure real performance before making changes.
分析后,您就有了瓶颈候选者。如果您仍然可以将原因分解为几个小任务,那就去做并分析它们,直到您不能再分解为止。然后,通过重复运行它们几千次来尝试测量它们的精确性能。这很重要,因为您需要在进行任何更改之前了解性能(速度和空间),以便您可以将其与 future 的更改进行比较。
对于您的具体问题,如果调整大小确实是问题所在,请尝试检查它的执行方式。执行一次调整大小调用需要多长时间?您需要多久调整一次大小才能完成您的工作?
Improve it. How? It depends.
现在,您有了有问题的代码块及其当前性能。你现在必须改进它。如何?好吧,这真的取决于问题是什么。你可以搜索更好的算法
,如果你可以延迟计算直到你真正需要执行,你可以做lazy fetching
,或者你可以做over-eager evaluation
如果您过于频繁地执行相同的操作,则通过缓存一些数据。您越了解原因,就越容易改善它。
对于您的具体问题,这可能只是操作系统 ui 功能的限制。通常,调整按钮大小不仅是调整按钮本身的大小,而且还会使
整个区域或其父窗口小部件无效,以便每个 ui 内容都可以正确呈现。调整按钮的大小可能很昂贵,如果是这种情况,您可以通过简单地使用基于图像的方法而不是基于 OS ui 的系统来解决问题。如果来自 OS API 的图像操作还不够,您可以尝试使用 OpenGL。但是,同样,直到我们实际试用它们并分析
这些替代方案时,我们才知道。祝你好运! :)
关于performance - iOS/核心动画 : Performance tuning,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5003616/
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 8年前关闭。 Improve t
暂时忘记能力的定义,只关注能力的“检查”(使用“授权!”),我看到 CanCan 添加了大约 400 毫秒,用于简单地检查用户是否具有特定的能力主题/模型。 这是预期的吗(我假设不是)?或者,有没有可
我正在阅读有关 Swift 的教程 ( http://www.raywenderlich.com/74438/swift-tutorial-a-quick-start ),它预定义为不显式设置类型,因
这主要是由于对 SQL 问题的回答。由于性能原因,有意省略了 UDF 和子查询。我没有包括可靠性并不是说它应该被视为理所当然,但代码必须工作。 性能永远是第一位的吗?提供了许多以性能为主要优先事项的答
我已经编写了一个简单的测试平台来测量三种阶乘实现的性能:基于循环的,非尾递归的和尾递归的。 Surprisingly to me the worst performant was the loop o
我已将 ui-performance 插件应用到我的应用程序中。不幸的是,在开发模式下运行应用程序时它似乎不起作用。例如,我的 javascript 导入是用“vnull”版本呈现的。 例如 不会
我有一个我操作的 F# 引用(我在各处添加对象池以回收经常创建和删除的短期对象)。我想运行结果报价;现在我使用了 F# PowerPack,它提供了将引用转换为表达式树和委托(delegate)的方法
我正在尝试在 Spark 服务器上运行 SparklyR 库中的机器学习算法。 1 个簇 8 核 24G内存 Ubuntu 16.04 星火2.2 独立配置 1名师傅/2名 worker 每个执行器的
我有一个数据库(准确地说是在 postgres 上运行),具有以下结构: user1 (schema) | - cars (table) - airplanes (table, again) .
我的应用程序在我的 iPad 上运行。但它的表现非常糟糕——我的速度低于 15fps。谁能帮我优化一下? 它基本上是一个轮子(派生自 UIView),包含 12 个按钮(派生自 UIControl)。
在完成“Scala 中的函数式编程原则”@coursera 类(class)第 3 周的作业时,我发现当我实现视频类(class)中所示的函数联合时: override def union(tha
我正在重构我的一个 Controller 以使其成为一项服务,我想知道不将整个服务容器注入(inject)我的 Controller 是否会对性能产生影响。 这样效率更高吗: innova.path.
我有一个要显示的内容很大的文件。例如在显示用户配置文件时, 中的每个 EL 表达式需要一个 userId 作为 bean 的参数,该参数取自 session 上下文。我在 xhtml 文件中将这个 u
我非常了解 mipmapping。我不明白(在硬件/驱动程序级别)是 mipmapping 如何提高应用程序的性能(至少这是经常声称的)。在执行片段着色器之前,驱动程序不知道要访问哪个 mipmap
这个问题在这里已经有了答案: 10年前关闭。 Possible Duplicate: What's the (hidden) cost of lazy val? (Scala) Scala 允许定义惰
一些文章建议现在 build() 包含在 perform() 本身中,而其他人则建议当要链接多个操作时使用 build().perform()一起。 最佳答案 build() 包含在 perform(
Postgres docs说 For best optimization results, you should label your functions with the strictest vol
阅读Zero-cost abstractions看着 Introduction to rust: a low-level language with high-level abstractions我尝
我想在 MQ 服务器上部署 SSL,但我想知道我当前的 CPU 容量是否支持 SSL。 (我没有预算增加 CPU 内核和 MQ PVU 的数量) 我的规范: Windows 2003 服务器 SP2,
因此,我在 Chrome 开发者工具 的性能 选项卡内的时间 部分成功地监控了我的 React Native 应用程序的性能。 突然在应用程序的特定重新加载时,Timings 标签丢失。 我已尝试重置
我是一名优秀的程序员,十分优秀!