【问题标题】:Can I speed up my use of Core Graphics to draw moving triangles every 1/10th of a second我可以加快使用 Core Graphics 以每 1/10 秒绘制移动三角形的速度吗
【发布时间】:2010-01-29 01:50:34
【问题描述】:

我最近在我的应用程序中添加了一些 Core Graphics 元素,但它的速度显着变慢,使它几乎毫无用处。我不确定我是否只是没有有效地使用 Core Graphics(如何让它更快?)或者这个问题是否是使用 Core Graphics 所固有的。在此描述之后,我的代码如下:

有在屏幕上移动的气泡(在 x 和 y 中)。每个气泡在屏幕底部都有一个相应的图像,该图像也沿 x 和 y 方向移动。我正在使用 Core Graphics 从语音气泡中绘制一个三角形,终止于底部图像。屏幕上可以同时出现 10 个以上的三角形,它们都在移动。每 1/10 秒就会触发一个计时器,计算所有物体的位置,并在我构建的三角形对象上调用 setNeedsDisplay

三角形对象的代码:

- (void)drawRect:(CGRect)rect {
    // Drawing code
 // Drawing code
 CGContextRef ctx = UIGraphicsGetCurrentContext(); //get the graphics context
 CGContextSetRGBStrokeColor(ctx, 1.0, 0, 0, 1); //there are two relevant color states, "Stroke" -- used in Stroke drawing functions and "Fill" - used in fill drawing functions

 //Create an array of points for triangle  
 CGPoint leftTrianglePoint;
 CGPoint rightTrianglePoint;
 rightTrianglePoint = CGPointMake(pointBlob.x, (pointBlob.y + 10.0));
 leftTrianglePoint = CGPointMake(pointBlob.x, (pointBlob.y - 10.0));

 CGPoint triangleArray [] =
 {
  pointGrid,
  rightTrianglePoint,
  leftTrianglePoint,
 pointGrid,};

 //Add lines to the context
 CGContextAddLines( ctx, triangleArray, 4);
 //draw the path

 //color the context - using a function for gray, to matche the saved blobs
 CGContextSetGrayFillColor(ctx, 0.0, .7);

 //Now fill the path 
 CGContextFillPath(ctx);
}

如何加快速度/提高效率,让我的图形再次顺畅移动?

【问题讨论】:

    标签: iphone objective-c core-animation performance core-graphics


    【解决方案1】:

    不想这么说,但放弃 Core Graphics 并使用 OpenGL 来做。 OpenGL 喜欢三角形。它会以高速为您每秒传输数千个。很多人认为 OpenGL 只适用于 3D 的东西,但你在 2D 中所做的事情也非常适合它。

    【讨论】:

    • 呃。你的答案很可怕,尽管它与我找到的其他一些资源相匹配。感谢您的快速回复(即使它不是我想要的灵丹妙药)
    • 这并不难。用于 iPhone 的 OpenGL 2D 教程的谷歌。有一堆好的。抱歉,手边没有链接。
    【解决方案2】:

    正如 Kendall 建议的那样,如果您只需要移动三角形,请在 UIView 或 CALayer 中绘制一次,并为这些项目的位置和/或旋转设置动画。使用 Core Graphics 每帧重绘三角形会非常慢,因为每次绘制时都需要重新缓存图层或视图的图层。

    但是,听起来您需要为三角形的实际形状设置动画。为此,我建议查看新添加的(在 iPhone OS 3.0 和 Snow Leopard 中)类CAShapeLayer。您可以设置该图层要绘制的路径(带有填充和描边),然后使用 CABasicAnimation 将其平滑地设置为不同的路径(具有相同数量的控制点)。这个herehere有例子。

    【讨论】:

    • 谢谢布拉德。这就是我开始做的事情,试图避免将 OpenGL 添加到我们的架构中——现在我在使用 CABasicAnimation 时遇到了一点困难。见这里:stackoverflow.com/questions/2233601/…
    【解决方案3】:

    如果您想简化 OpenGL 端口,请尝试使用像 Cocos2D 这样的 OpenGL 库。

    但是,在我看来,您可以通过仅绘制一次单独的 CALayers 并简单地移动它们来大大加快您的代码速度(因为您的所有三角形的大小似乎都是固定的,只是位置不同)。我强烈建议您查看 Core Graphics 书籍。

    【讨论】:

    • 所以三角形的大小不是固定的——我应该更清楚一点——pointGrid、leftTrianglePoint 和 rightTrianglePoint 总是在不断变化。大小和角度总是在变化
    • 另一件要考虑的事情是 - 你有十个不同的 UIViews with drawRect 吗?如果您可以将它们全部绘制在一个视图中,那也会更有效率。似乎画的东西并不多。另外,您确定您的时间仅每 1/10 秒触发一次,而不是更频繁...
    猜你喜欢
    • 2012-08-13
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多