Menggambar topeng mempengaruhi kinerja

Berikut adalah kode yang saya gunakan untuk menggambar topeng untuk UIView. Masalahnya adalah jika saya memiliki lebih dari 5 UIViews dengan mask di layar, hal itu mempengaruhi kinerja saat drag & drop UIViews: Bagaimana cara meningkatkan kode di bawah ini?:

+ (UIBezierPath *)roundedPathAtCenter:(CGPoint)center size:(CGSize)size corner:(CGFloat)corner
{
    NSInteger width = size.width;
    NSInteger height = size.height;

    UIBezierPath *path = [UIBezierPath bezierPath];

    // upper left corner
    [path moveToPoint: CGPointMake(center.x - width / 2.0f + corner / 2.0f, center.y - height / 2.0f + corner / 2.0f)];

    // path to top center
    [path addQuadCurveToPoint: CGPointMake(center.x, center.y - height / 2.0f) controlPoint: CGPointMake(center.x - width / 2.0f + corner, center.y - height / 2.0f)];

    // path to upper right
    [path addQuadCurveToPoint: CGPointMake(center.x + width / 2.0f - corner / 2.0f, center.y - height / 2.0f + corner / 2.0f) controlPoint: CGPointMake(center.x + width / 2.0f - corner, center.y - height / 2.0f)];

    // path to mid right
    [path addQuadCurveToPoint: CGPointMake(center.x + width / 2.0f, center.y) controlPoint: CGPointMake(center.x + width / 2.0f, center.y - height / 2.0 + corner)];

    // path to lower right
    [path addQuadCurveToPoint: CGPointMake(center.x + width / 2.0 - corner / 2.0f, center.y + height / 2.0f - corner / 2.0f) controlPoint: CGPointMake(center.x + width / 2.0f, center.y + height / 2.0f - corner)];

    // path to center bottom
    [path addQuadCurveToPoint: CGPointMake(center.x, center.y + height / 2.0f) controlPoint: CGPointMake(center.x + width / 2.0 - corner, center.y + height / 2.0)];

    // path to lower left
    [path addQuadCurveToPoint: CGPointMake(center.x - width / 2.0f + corner / 2.0f, center.y + height / 2.0f - corner / 2.0f) controlPoint: CGPointMake(center.x - width / 2.0f + corner, center.y + height / 2.0f)];

    // path to mid left
    [path addQuadCurveToPoint: CGPointMake(center.x - width / 2.0f, center.y) controlPoint: CGPointMake(center.x - width / 2.0f, center.y + height / 2.0 - corner)];

    // path to top left

    [path addQuadCurveToPoint: CGPointMake(center.x - width / 2.0f + corner / 2.0f, center.y - height / 2.0f + corner / 2.0f) controlPoint: CGPointMake(center.x - width / 2.0f, center.y - height / 2.0f + corner)];

    [path closePath];

    return path;
}

Tanpa menambahkan mask untuk UIViews, ini bekerja sangat cepat


person Serhii    schedule 21.03.2016    source sumber


Jawaban (2)


Ada dua teknik cepat untuk meningkatkan kinerja dalam situasi ini:

  1. Sebelum Anda mulai menyeret UIView, Anda dapat mengatur shouldRasterize dari layer dari view ke true, dan setelah selesai melepaskannya, pulihkan shouldRasterize ke false. Terkadang (terutama jika gambar yang diseret dapat berubah) hal ini berdampak buruk, namun mudah untuk dicoba dan Anda dapat melihat apakah ini meningkatkan kinerja.

  2. Pendekatan lainnya adalah dengan membuat snapshot secara manual (misalnya merender tampilan dengan klipingnya ke UIImage) dan mengganti tampilan dengan UIImageView, lalu menyeretnya, lalu saat Anda melepasnya, ganti dengan tampilan asli (jika Anda membutuhkannya; terkadang hanya snapshot yang Anda perlukan).

Saya mungkin menyarankan menonton video WWDC 2012 Kinerja Aplikasi iOS: Grafik dan Animasi yang menggambarkan beberapa teknik untuk mendiagnosis dan menyelesaikan masalah kinerja grafis. Video tersebut mungkin berumur beberapa tahun, namun sebagian besar tekniknya masih dapat diterapkan. Video Mengoptimalkan Grafik 2D dan Animasi mungkin juga menawarkan beberapa wawasan (meskipun saya menurut saya video lain mungkin lebih dapat diterapkan di sini).

Ngomong-ngomong, ada banyak trik lain untuk meningkatkan kinerja (misalnya saat menyeret tampilan, gunakan sentuhan prediktif; jika tampilan yang diseret menyertakan banyak transparansi, mungkin buat snapshot buram untuk menyeret; dll.), tapi mungkin coba cara di atas terlebih dahulu, dan lihat apakah itu meminimalkan masalah kinerja. Selain itu, pastikan Anda mengujinya pada perangkat target dan jangan mengandalkan pengujian di simulator, karena sering kali karakteristik kinerjanya sangat berbeda.

person Rob    schedule 21.03.2016

Animasi tampilan bertopeng pada dasarnya lambat, karena pohon render harus dihitung ulang pada setiap frame. Seperti yang Anda katakan dengan benar, tidak perlu banyak tampilan yang semuanya dianimasikan pada saat yang sama agar hal ini menjadi jelas (biasanya pada orang yang gagap). WWDC Apple telah mendedikasikan banyak video bagus untuk hal ini, biasanya dalam konteks pengguliran (misalnya tampilan tabel); Saya sarankan menonton beberapa video tersebut, yang juga menyarankan solusi.

Pada dasarnya, solusi terbaik mungkin adalah Jangan Lakukan Itu. Cobalah pendekatan lain, seperti menggambar tampilan Anda sehingga tampilan tersebut tergambar dalam bentuk yang benar (dengan bagian luarnya transparan). Hal ini mengurangi tekanan pada sistem gambar karena tidak ada masker untuk komposit. Misalnya untuk membuat tampilan lingkaran, gunakan tampilan gambar yang gambarnya berupa gambar lingkaran. Dan tentu saja tampilan buram akan lebih baik lagi, jika memungkinkan.

person matt    schedule 21.03.2016
comment
Omong-omong, Anda akan menemukan penggunaan template Instrumen Animasi Inti sangat membantu dalam mengukur dan menentukan penyebabnya di sini. - person matt; 21.03.2016