Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在UIView上快速绘制UIImage图像_Ios - Fatal编程技术网

Ios 在UIView上快速绘制UIImage图像

Ios 在UIView上快速绘制UIImage图像,ios,Ios,在我的应用程序中,我必须在视图上实时绘制一些图像,这些图像的位置和缩放比例会随着时间的推移而频繁变化。这些图像是字典中包含的图像的子集。以下是代码,略作总结: -(void)drawObjects:(NSArray*)objects withImages:(NSDictionary*)images <etc> { // Get graphic context and save it CGContextRef context = UIGraphicsGetCurrent

在我的应用程序中,我必须在视图上实时绘制一些图像,这些图像的位置和缩放比例会随着时间的推移而频繁变化。这些图像是字典中包含的图像的子集。以下是代码,略作总结:

-(void)drawObjects:(NSArray*)objects withImages:(NSDictionary*)images <etc>
{
    // Get graphic context and save it
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);

    // Display objects in reverse order
    for (int i = [objects count] - 1; i >= 0; i--) {
        MyObject *object = [objects objectAtIndex:i];

        // Check if object shall be visible
        if (<test to check whether the image shall be visible or not>) {

            // Get object image
            UIImage* image = <retrieve image from "images", based on a key stored in "object">;

            // Draw image
            float x = <calculate image destination x>;
            float y = <calculate image destination y>;
            float imageWidth = <calculate image destination width>;
            float imageHeight = <calculate image destination height>;
            CGRect imageRect = CGRectMake(x - imageWidth / 2, y - imageHeight / 2, imageWidth, imageHeight);
            [image drawInRect:imageRect];
        }
    }

    // Restore graphic context
    CGContextRestoreGState(context);
}
-(void)drawObjects:(NSArray*)带有图像的对象:(NSDictionary*)图像
{
//获取图形上下文并保存它
CGContextRef context=UIGraphicsGetCurrentContext();
CGContextSaveGState(上下文);
//按相反顺序显示对象
对于(int i=[objects count]-1;i>=0;i--){
MyObject*object=[objects objectAtIndex:i];
//检查物体是否可见
如果(){
//获取对象图像
UIImage*image=;
//画图
浮点数x=;
浮动y=;
浮动图像宽度=;
浮动图像高度=;
CGRect imageRect=CGRectMake(x-图像宽度/2,y-图像高度/2,图像宽度,图像高度);
[image drawInRect:imageRect];
}
}
//还原图形上下文
CGContextRestoreGState(上下文);
}
我的问题是这个代码很慢;当图像数量约为15(iPhone4,iOS4.3.5)时,执行循环大约需要700到800毫秒。我做了一些实验,似乎瓶颈是drawInRect调用,因为如果我排除它,一切都会加速


有人有什么建议吗?

你的首要答案是:运行仪器,看看这其中的哪一部分实际需要时间。(是的,很可能是drawInRect:但可能是“获取图像”您没有显示)。

问题是(我认为)您实际上是在每一帧中绘制(创建屏幕表示)图像,因为
drawInRect:
不知道您想重用上一帧中显示的图像。但你不需要这样。只需绘制一次,然后对其进行变换以更改其位置和大小

UIKit让这变得简单:只需为
UIImageView
设置帧,图像就会显示在您想要的位置和大小,而无需重新渲染图像数据


您可能可以通过存储UIImageView本身来进一步优化这一点,这样就不必在每次需要显示它们时都重新创建它们。Istead只需相应地设置其
hidden
属性。

您是否尝试过使用UIImageView并设置其框架?我没有详细了解iOS渲染管道,但这种重新编译可能比每次重新渲染图像都要快。这只是一个想法。您是否尝试过创建一个上下文,在屏幕外绘制,然后在屏幕上显示(UIGraphicsPopContext和uigraphicsposhcontext),并使用GCD在后台绘制整个图形?绘图甚至可以在后台线程中进行吗?UIKit无法在背景中绘制。问题是(我认为)您实际上在每一帧中绘制图像。但你不需要这样。您只需要绘制一次,然后对其进行变换。UIKit使这变得简单:只需为UIImageView设置帧,图像将显示在您想要的位置和大小,(可能),而无需重新渲染图像数据。如果使用UIImageView可以缓解此问题,您可能可以通过存储UIImageView本身来进一步优化它,这样就不必在每次需要显示时都重新创建它们;所以我可以确认我的陈述。无论如何,谢谢你的建议。现在我使用UIImageView而不是UIImage,并按照fzwo的建议对它们进行预存储,效果很好。啊,也许我错过了你问题的这一部分。UIImageView绝对是为快速图像绘制而优化的(我想它直接使用CALayer)。顺便说一句,你可以画一个线程,但它需要进入位图上下文。“我不认为这能帮你节省什么,因为你仍然需要画它。”乔治·巴切西,很高兴能帮上忙:)