2012-01-12 117 views
1

我正在做的是將2張圖片合併成單張圖片。drawInRect性能太慢

這是代碼。

UIGraphicsBeginImageContext(CGSizeMake(1024, 768)); 

[image1 drawInRect:CGRectMake(0, 0, 512, 768)]; 
[image2 drawInRect:CGRectMake(512, 0, 512, 768)]; 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

但是drawInRect似乎太慢了。

有沒有更快的方式來合併圖像?

+0

你爲什麼試圖合併兩個圖像? 「太慢」是什麼意思?你正在推動很多像素。 – 2012-01-12 04:33:05

+0

合併圖像的最快方式是避免在不需要時合併它們。例如,您可以合併一次,緩存結果並重新使用該圖像,直到其中一個預合併圖像發生更改。 – dasblinkenlight 2012-01-12 04:37:01

+0

@KevinBallard因爲我需要它。 – Umgre 2012-01-12 04:43:31

回答

3

選項0 - 確保只在需要繪製時繪製,而且只繪製需要繪製的東西。


選項1

如果您知道目標大小(也許self.frame.size?),你可以創建兩個源圖像(扁平化)的目標大小避免插一個圖像。這樣可以:

  1. 減少需要
  2. (如果你希望它看起來良好的CPU)
  3. 看更好地降低你必須提請
  4. 避免插補圖像數量的內存 - 複合可以使用高質量插值。

當然,這隻有當複合材料的變化頻率低於它必須繪製時纔有意義。

選項2

即使你想兩個圖像,你知道它們的大小不會改變,只是他們調整到他們必須(當然,監視內存的使用情況,如果你正在擴大它們)繪製的大小。

選項3

如果這不是一個選項,你可以改變CGContext的狀態,並減少插值質量。如果您習慣於類似的CALayer轉換,您可能會對低質量或無插值滿意。

+1

OP是否編輯該問題?這似乎正在回答一個不同的問題(插值是從哪裏來的?)。我只是遇到了一個問題,發現iOS drawInRect的速度非常慢(逐個像素地繪製圖像,將其保存到磁盤,將其作爲新文件重新加載(從磁盤!)並顯示它,調用drawInRect :.這是瘋了) – Adam 2012-05-10 17:36:25

+0

@亞當不,編輯的問題。拉伸/調整大小時使用了許多顏色的插值。重點在於調整大小非常耗時,但有一些質量選項和方法可以避免並儘量減少調整大小的速度。 – justin 2012-05-10 19:50:01

1

你可以做的一件事不是實現-drawRect:完全不是,而是有兩個CALayers與你的兩個圖像作爲它們的內容,然後把一個放在另一個的前面。不知道這會更快,但我認爲這很可能(因爲CA可以在GPU上異步處理繪圖)。