Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 6877877
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 27, 20262026-05-27T04:39:14+00:00 2026-05-27T04:39:14+00:00

Given an UIImage and a CGRect , what is the most efficient way (in

  • 0

Given an UIImage and a CGRect, what is the most efficient way (in memory and time) to draw the part of the image corresponding to the CGRect (without scaling)?

For reference, this is how I currently do it:

- (void)drawRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGRect frameRect = CGRectMake(frameOrigin.x + rect.origin.x, frameOrigin.y + rect.origin.y, rect.size.width, rect.size.height);    
    CGImageRef imageRef = CGImageCreateWithImageInRect(image_.CGImage, frameRect);
    CGContextTranslateCTM(context, 0, rect.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);
    CGContextDrawImage(context, rect, imageRef);
    CGImageRelease(imageRef);
}

Unfortunately this seems extremely slow with medium-sized images and a high setNeedsDisplay frequency. Playing with UIImageView‘s frame and clipToBounds produces better results (with less flexibility).

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-27T04:39:15+00:00Added an answer on May 27, 2026 at 4:39 am

    I guessed you are doing this to display part of an image on the screen, because you mentioned UIImageView. And optimization problems always need defining specifically.


    Trust Apple for Regular UI stuff

    Actually, UIImageView with clipsToBounds is one of the fastest/simplest ways to archive your goal if your goal is just clipping a rectangular region of an image (not too big). Also, you don’t need to send setNeedsDisplay message.

    Or you can try putting the UIImageView inside of an empty UIView and set clipping at the container view. With this technique, you can transform your image freely by setting transform property in 2D (scaling, rotation, translation).

    If you need 3D transformation, you still can use CALayer with masksToBounds property, but using CALayer will give you very little extra performance usually not considerable.

    Anyway, you need to know all of the low-level details to use them properly for optimization.


    Why is that one of the fastest ways?

    UIView is just a thin layer on top of CALayer which is implemented on top of OpenGL which is a virtually direct interface to the GPU. This means UIKit is being accelerated by GPU.

    So if you use them properly (I mean, within designed limitations), it will perform as well as plain OpenGL implementation. If you use just a few images to display, you’ll get acceptable performance with UIView implementation because it can get full acceleration of underlying OpenGL (which means GPU acceleration).

    Anyway if you need extreme optimization for hundreds of animated sprites with finely tuned pixel shaders like in a game app, you should use OpenGL directly, because CALayer lacks many options for optimization at lower levels. Anyway, at least for optimization of UI stuff, it’s incredibly hard to be better than Apple.


    Why your method is slower than UIImageView?

    What you should know is all about GPU acceleration. In all of the recent computers, fast graphics performance is achieved only with GPU. Then, the point is whether the method you’re using is implemented on top of GPU or not.

    IMO, CGImage drawing methods are not implemented with GPU.
    I think I read mentioning about this on Apple’s documentation, but I can’t remember where. So I’m not sure about this. Anyway I believe CGImage is implemented in CPU because,

    1. Its API looks like it was designed for CPU, such as bitmap editing interface and text drawing. They don’t fit to a GPU interface very well.
    2. Bitmap context interface allows direct memory access. That means it’s backend storage is located in CPU memory. Maybe somewhat different on unified memory architecture (and also with Metal API), but anyway, initial design intention of CGImage should be for CPU.
    3. Many recently released other Apple APIs mentioning GPU acceleration explicitly. That means their older APIs were not. If there’s no special mention, it’s usually done in CPU by default.

    So it seems to be done in CPU. Graphics operations done in CPU are a lot slower than in GPU.

    Simply clipping an image and compositing the image layers are very simple and cheap operations for GPU (compared to CPU), so you can expect the UIKit library will utilize this because whole UIKit is implemented on top of OpenGL.

    • Here’s another thread about whether the CoreGraphics on iOS is using OpenGL or not: iOS: is Core Graphics implemented on top of OpenGL?

    About Limitations

    Because optimization is a kind of work about micro-management, specific numbers and small facts are very important. What’s the medium size? OpenGL on iOS usually limits maximum texture size to 1024×1024 pixels (maybe larger in recent releases). If your image is larger than this, it will not work, or performance will be degraded greatly (I think UIImageView is optimized for images within the limits).

    If you need to display huge images with clipping, you have to use another optimization like CATiledLayer and that’s a totally different story.

    And don’t go OpenGL unless you want to know every details of the OpenGL. It needs full understanding about low-level graphics and 100 times more code at least.


    About Some Future

    Though it is not very likely happen, but CGImage stuffs (or anything else) doesn’t need to be stuck in CPU only. Don’t forget to check the base technology of the API which you’re using. Still, GPU stuffs are very different monster from CPU, then API guys usually explicitly and clearly mention them.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

UIImage has a method called 'stretchableImageWithLeftCapWidth' which scales an image horizontally without scaling the
Given a UIImage of any dimension, I wish to generate a square icon sized
Given a specific DateTime value, how do I display relative time, like: 2 hours
Given a Python object of any kind, is there an easy way to get
Given a (source) patch file, what's the easiest way to apply this patch on
When converting PDF Pages into UIImages I receive memory warnings all the time. It
Given an image G with dimensions w x h , how can I surround
CGSize cgs = CGSizeMake(250.0, 300.0); UIGraphicsBeginImageContext(cgs); CGRect rectangle = CGRectMake(0,0,cgs.width,cgs.height); UIImage *myImage = [UIImage
As far as I have understood so far, every time I draw something in
When sharing an image in an iPhone, we are given an opportunity to pick

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.