سؤال

وسألت من قبل عن دفع بكسل، وتمكنت الآن للحصول على بعيدا بما فيه الكفاية للحصول على الضوضاء لتظهر على الشاشة. وإليك كيف الحرف الأول:

CGDataProviderRef provider;
bitmap = malloc(320*480*4);
provider = CGDataProviderCreateWithData(NULL, bitmap, 320*480*4, NULL);
CGColorSpaceRef colorSpaceRef;
colorSpaceRef = CGColorSpaceCreateDeviceRGB();
ir = CGImageCreate(
320,
480,
8,
32,
4 * 320,
colorSpaceRef,
kCGImageAlphaNoneSkipLast,
provider,
NULL,
NO,
kCGRenderingIntentDefault
);

إليك كيف تجعل كل الإطار:

for (int i=0; i<320*480*4; i++) {
bitmap[i] = rand()%256;
}
CGRect rect = CGRectMake(0, 0, 320, 480);
CGContextDrawImage(context, rect, ir); 

والمشكلة هي هذا هو بفظاعة بطيئة بفظاعة، حول 5FPS. أعتقد طريقي لنشر المخزن المؤقت يجب أن تكون خاطئة. هل من الممكن أن تفعل ملء الشاشة الرسومات بكسل القائم أن أتمكن من تحديث في 30fps، دون استخدام رقاقة 3D؟

هل كانت مفيدة؟

المحلول

وبطء يكاد يكون من المؤكد في توليد الضجيج. إذا قمت بتشغيل هذا في الآلات عليك ربما نرى أن طن من الوقت ينفق يجلس في حلقة الخاص بك.

وثمة مسألة أخرى أصغر حجما هي فضاء لوني الخاص بك. إذا كنت تستخدم فضاء لوني على الشاشة، عليك تجنب تحويل فضاء لوني التي يحتمل أن تكون مكلفة.

إذا يمكنك استخدام CoreGraphics الروتينية للرسم الخاص بك، وكنت أفضل أن يخدمها خلق CGLayer للسياق الرسم بدلا من إنشاء كائن جديد في كل مرة.

والمكون bytesPerRow مهم لأداء أيضا. وينبغي أن يكون عاملا من 32 IIRC. هناك بعض التعليمات البرمجية المتاحة ربط النص يوضح كيفية حساب ذلك .

ونعم، لأداء الخام، برنامج OpenGL.

نصائح أخرى

وأظن القيام 614400 يكتب (320*480*4) ذاكرة، وتوليد رقم عشوائي، وجعل وجوه جديدة كل إطار يتباطأ أنت إلى أسفل.

هل حاول مجرد كتابة نقطية ثابتة على الشاشة ورؤية مدى السرعة التي هي؟ هل ربما حاول التنميط رمز؟ هل أنت أيضا بحاجة إلى تقديم CGRect جديدة في كل مرة؟

إذا كنت ترغب فقط لإعطاء تأثير من العشوائية، وربما هناك حاجة لتجديد نقطية كاملة في كل مرة.

لمعرفتي، ومن المفترض أن يكون برنامج OpenGL أسرع طريقة للقيام الرسومات على اي فون. وهذا يشمل 2D و 3D. ويدعم A UIView بطبقة الرسوم المتحركة الأساسية، التي ينتهي الرسم مع برنامج OpenGL على أي حال. فلماذا لا تخطي الرجل الأوسط.

ويمكنك تجنب هذه الرحلة من خلال CGContextDrawImage عن طريق تعيين CGImageRef ل-[CALayer setContents:]، وأن يكون عادلا تأكد من عدم لتحرير الصور النقطية في حين كنت لا تزال تستخدم ذلك.

[[view layer] setContents:(id)ir];

<سوب> نعم، أعرف أن هذا هو العمر، عثر عليه من جوجل

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top