【问题标题】:Monotouch - Display a series of images (too slow)Monotouch - 显示一系列图像(太慢)
【发布时间】:2013-03-16 05:38:13
【问题描述】:

我需要在 iOS 中将一系列图像显示为动画(使用 Monotouch)。使用 800x600 尺寸的图像,我可以让它们在我的 iPad 3 上显示的最快速度是 160 毫秒(6.25 fps)。我希望它在 15-30fps 范围内(每张图像

    public override void Draw (RectangleF rect)
    {
        base.Draw (rect);
        var cgimg = UIImage.FromFile (filename).CGImage;
        CGContext g = UIGraphics.GetCurrentContext();
        g.DrawImage (new RectangleF (0, 0, cgimg.Width, cgimg.Height), cgimg);
    }

将它们渲染为电影不会提供我想要的交互速度(来回擦洗帧)

这是否超出了硬件限制? (它似乎不应该是)。我需要使用 openGL 还是 Monogame?

【问题讨论】:

    标签: ios opengl-es uiview xamarin.ios cgcontext


    【解决方案1】:

    好的,这里有一些帮助:

    1. 您不应该在绘图函数中加载UIImage,因为这种情况经常发生。将其设置为类中的成员变量,该时间将在对象的生命周期内发生一次,例如其构造函数LayoutSubviews,或设置filename 变量等。
    2. 您也可以用同样的方式缓存CGImage
    3. 在您的 Draw 方法中的 CGContext 周围添加一个 using 语句。

    我认为通过做这些事情你可以获得更好的性能。

    【讨论】:

    • 感谢您的提示。如果 iOS 有足够的内存,我可以缓存所有图像,但可能会太多(已用内存的演出)。是的,在所有情况下使用 using 语句都是一个好主意。
    【解决方案2】:

    在尝试了 OpenGL 之后,我最终直接绘制到了视图层。 Instruments 说使用这种技术处理 800x600 图像的速度为 24 FPS。 (iPad 3 上的 iOS 6.1)

    this.Layer.Contents =  UIImage.FromFile( {filename}).CGImage;
    SetNeedsDisplay ();
    

    这表现得很好,与我的预期差不多。如果图像第二次显示,性能将提高到 40+ FPS(我假设正在进行缓存)。

    【讨论】:

    • 您仍然不应该在每次渲染屏幕时都调用UIImage.FromFile。这是您最大的性能问题。
    • 我必须调用 FromFile,因为可能太多图片无法加载到内存中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-21
    • 2015-12-14
    • 2019-02-12
    • 2012-06-29
    • 1970-01-01
    • 2020-06-24
    • 2014-03-05
    相关资源
    最近更新 更多