ইউআইআইমেজ চিত্রটি নামিয়ে দেওয়া হচ্ছে নামযুক্ত: এফইউডি


117

ফেব্রুয়ারী ২০১৪ সম্পাদনা করুন: নোট করুন যে এই প্রশ্নটি আইওএস ২.০ থেকে এসেছে! তখন থেকে চিত্রের প্রয়োজনীয়তা এবং হ্যান্ডলিং প্রচুর পরিমাণে সরানো হয়েছে। রেটিনা চিত্রগুলি বড় করে এগুলিকে আরও জটিল করে তোলে। আইপ্যাড এবং রেটিনা চিত্রগুলির জন্য অন্তর্নির্মিত সমর্থন সহ, আপনার অবশ্যই আপনার কোডটিতে চিত্রনাম ব্যবহার করা উচিত

আমি দেখছি অনেক লোক imageNamedখারাপ বলছেন তবে সমান সংখ্যক লোক বলছে পারফরম্যান্স ভাল - বিশেষত যখন রেন্ডারিং করা হয় UITableView। দেখুন এই তাই প্রশ্ন বা উদাহরণস্বরূপ এই নিবন্ধটি iPhoneDeveloperTips.com উপর

UIImageএর imageNamedপদ্ধতি লিক তাই এটা ভাল এড়ানো হলেও সাম্প্রতিক রিলিজে সংশোধন করা হয়েছে ব্যবহার করেছিলেন। আমি আমার চিত্রগুলি ক্যাশে করার জন্য সিস্টেমটি কোথায় বিশ্বাস করতে পারি এবং যেখানে আমার অতিরিক্ত মাইল যেতে হবে এবং নিজেই এটি করা দরকার সে বিষয়ে যুক্তিযুক্ত সিদ্ধান্ত নিতে আমি ক্যাশেগরি অ্যালগরিদম আরও ভালভাবে বুঝতে চাই। আমার বর্তমান বুনিয়াদি বোঝাপড়া এটি ফাইল নাম দ্বারা রেফারেন্স করা সহজ NSMutableDictionaryof UIImagesএটি বড় হয় এবং যখন স্মৃতিশক্তি শেষ হয় তখন এটি অনেক ছোট হয়।

উদাহরণস্বরূপ, কেউ কি নিশ্চিতভাবে জানতে পারে যে পিছনের চিত্রটির ক্যাশে imageNamedসাড়া দেয় না didReceiveMemoryWarning? এটি অসম্ভব বলে মনে হচ্ছে যে অ্যাপল এটি করবে না।

আপনার যদি ক্যাচিং অ্যালগরিদম সম্পর্কে কোনও অন্তর্দৃষ্টি থাকে তবে দয়া করে এটি এখানে পোস্ট করুন।


2
আমিও. মনে হয় SO এর মত এত প্রতিভা পূর্ণ নয়।
রোগ

দেখে মনে হচ্ছে আপনি এটি তদন্ত করতে কিছু সময় ব্যয় করেছেন। আপনি কি এমন কোনও পরীক্ষা-নিরীক্ষা করেছেন যা সর্বশেষতম কোকো-টাচ সংস্করণের সাথে নামযুক্ত ইউআইআইমেজ চিত্রটির কোনও নেতিবাচক প্রভাব দেখায়? একটি ইউআইটিএবলভিউ তৈরি করুন এবং প্রচুর (বহু হাজার) সারি যুক্ত করুন এবং দেখুন যখন প্রতিটি সারিতে বিভিন্ন চিত্র প্রদর্শন করা হয় তখন কর্মক্ষমতা হ্রাস পায় কিনা। সম্ভবত তখন লোকেরা আপনার অনুসন্ধানগুলিতে মন্তব্য করতে পারে।
স্টেফানবি

আসলে, আমি এতটা এক্সপেরিমেন্টও করি নি। আমি ইমেজনাম ব্যবহার করি এবং যদিও আমি এখনও এই অ্যাপ্লিকেশনটিকে মেমরির অনুকূল করে তুলতে পারি নি, তবে মেমরি হগ হিসাবে ইমেজ নেমে সরাসরি আমি চিহ্নিত করতে পারি এমন কিছু আমার কাছে নেই। আমি এখানে ব্লগের কয়েকটি পোস্টে ইমেজড নেমেড সম্পর্কে অভিযোগ জানিয়েছি এবং আমি অ্যাপল বোর্ডগুলিতে অনুরূপ প্রশ্ন জিজ্ঞাসা করেছি যা আরও ক্রিয়া পেয়েছে। আমি সময় পেলে এখানে একটি সংক্ষিপ্তসার পোস্ট করব এবং লিঙ্ক করব যখন আমার কাছে সময় হবে এবং অনুভূত হবে যে এটির যে উত্তর পেয়েছে তা অ্যান ছিল।
রোগ

উত্তর:


85

tldr: চিত্রযুক্ত নাম ঠিক আছে। এটি স্মৃতি ভালভাবে পরিচালনা করে। এটি ব্যবহার করুন এবং উদ্বেগ বন্ধ করুন।

নভেম্বর 2012 সম্পাদনা করুন : নোট করুন যে এই প্রশ্নটি আইওএস ২.০ থেকে এসেছে! তখন থেকে চিত্রের প্রয়োজনীয়তা এবং হ্যান্ডলিং প্রচুর পরিমাণে সরানো হয়েছে। রেটিনা চিত্রগুলি বড় করে এগুলিকে আরও জটিল করে তোলে। আইপ্যাড এবং রেটিনা চিত্রগুলির জন্য অন্তর্নির্মিত সমর্থন সহ, আপনার অবশ্যই আপনার কোডটিতে চিত্রনাম ব্যবহার করা উচিত। এখন, উত্তরোত্তর জন্য:

বোন থ্রেড অ্যাপল দেব ফোরামে কিছু ভাল ট্রাফিক লাভ করেন। বিশেষত রিনসউইন্ড কিছু কর্তৃত্ব যুক্ত করেছিলেন।

আইফোন ওএস ২.০-তে এমন কিছু সমস্যা রয়েছে যেখানে চিত্রটির নাম দেওয়া হয়েছে: মেমরির সতর্কতার পরেও ক্যাশে সাফ হবে না। একই সময়ে + ইমেজ নামকরণ: ক্যাশের জন্য নয়, বরং সুবিধার্থে প্রচুর ব্যবহার পেয়েছে, যা সম্ভবত সমস্যাটি যতটা হওয়া উচিত ছিল তার চেয়ে বেশি বাড়িয়ে তুলেছে।

যে সতর্কতা যখন

গতির সম্মুখভাগে, কী চলছে তা নিয়ে একটি সাধারণ ভুল ধারণা রয়েছে। সর্বাধিক জিনিসটি যা + ইমেজনামড করে: উত্স ফাইলটি থেকে চিত্রের ডেটা ডিকোড করা হয় যা প্রায় সবসময় উল্লেখযোগ্যভাবে ডেটা আকারকে স্ফীত করে তোলে (উদাহরণস্বরূপ, একটি স্ক্রিন আকারের পিএনজি ফাইল সংকোচনের সময় কয়েক ডজন কেবি ব্যবহার করতে পারে, তবে অর্ধ এমবি ব্যবহার করে সঙ্কুচিত - প্রস্থ * উচ্চতা * 4)। বিপরীতে + চিত্রউইথ কনটেন্টস অফফাইলে: প্রতিবারের চিত্রের প্রয়োজন হয় সেই চিত্রটিকে সঙ্কুচিত করবে। আপনি যেমন কল্পনা করতে পারেন, আপনার যদি একবারে কেবলমাত্র চিত্রের ডেটা প্রয়োজন হয়, আপনি এখানে চিত্রের ক্যাশেড সংস্করণটি ঝুলানো ব্যতীত আর কিছুই পান না, এবং সম্ভবত আপনার প্রয়োজনের চেয়ে বেশি সময়ের জন্য এটি থাকতে পারে। তবে, আপনার যদি এমন একটি বড় চিত্র থাকে যা আপনার প্রায়শই পুনরায় চিত্র আঁকার প্রয়োজন, তবে বিকল্পগুলি রয়েছে, যদিও আমি প্রাথমিকভাবে সুপারিশ করব এটি হ'ল বড় চিত্রটি পুনরায় আঁকানো এড়ানো :) :)

ক্যাশের সাধারণ আচরণের ক্ষেত্রে, এটি ফাইলের উপর ভিত্তি করে ক্যাশে করে (সুতরাং + চিত্রনামের দুটি উদাহরণ: একই নামের সাথে একই ক্যাশেড ডেটার উল্লেখ করা উচিত) এবং আপনি আরও চিত্রের মাধ্যমে অনুরোধ করার সাথে সাথে ক্যাশে গতিশীলভাবে বৃদ্ধি পাবে am + + imageNamed :. আইফোনের ওএসে 2.xa বাগ মেমরির সতর্কতা পাওয়ার পরে ক্যাশে সঙ্কুচিত হওয়া থেকে বাধা দেয়।

এবং

আমার বোধগম্যতা হল যে + চিত্রনামযুক্ত: ক্যাশে আইফোন ওএস 3.0 এ মেমরির সতর্কতাগুলিকে সম্মান করবে। আপনি যখন চান্স পাবেন তখন এটি পরীক্ষা করুন এবং বাগগুলি প্রতিবেদন করুন যদি আপনি দেখতে পান যে এটি তেমন নয়।

তাই সেখানে যদি আপনি এটি আছে. ইমেজ নামকরণ: আপনার উইন্ডোজগুলি ছিন্ন করতে বা আপনার শিশুদের হত্যা করবে না। এটি বেশ সহজ তবে এটি একটি অপটিমাইজেশন সরঞ্জাম। দুঃখজনকভাবে এটির নামকরণ করা হয়েছে এবং ব্যবহারের মতো সমান কোনও সমতুল্য নেই - তাই লোকেরা এটিকে অতিরিক্ত ব্যবহার করে এবং যখন এটি কেবল তার কাজটি করে তখন বিচলিত হয়

আমি এটি সংশোধন করতে ইউআইআইমেজে একটি বিভাগ যুক্ত করেছি:

// header omitted
// Before you waste time editing this, please remember that a semi colon at the end of a method definition is valid and a matter of style.
+ (UIImage*)imageFromMainBundleFile:(NSString*)aFileName; {
    NSString* bundlePath = [[NSBundle mainBundle] bundlePath];
    return [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@", bundlePath,aFileName]];
}

রিন্সউইন্ড আপনার নিজস্ব অনুকূলিত সংস্করণ তৈরি করতে কয়েকটি উদাহরণ কোডও অন্তর্ভুক্ত করেছে। আমি দেখতে পাচ্ছি না এটি মূলধারার পক্ষে মূল্যবান তবে এখানে এটি সম্পূর্ণতার জন্য।

CGImageRef originalImage = uiImage.CGImage;
CFDataRef imageData = CGDataProviderCopyData(
     CGImageGetDataProvider(originalImage));
CGDataProviderRef imageDataProvider = CGDataProviderCreateWithCFData(imageData);
CFRelease(imageData);
CGImageRef image = CGImageCreate(
     CGImageGetWidth(originalImage),
     CGImageGetHeight(originalImage),
     CGImageGetBitsPerComponent(originalImage),
     CGImageGetBitsPerPixel(originalImage),
     CGImageGetBytesPerRow(originalImage),
     CGImageGetColorSpace(originalImage),
     CGImageGetBitmapInfo(originalImage),
     imageDataProvider,
     CGImageGetDecode(originalImage),
     CGImageGetShouldInterpolate(originalImage),
     CGImageGetRenderingIntent(originalImage));
CGDataProviderRelease(imageDataProvider);
UIImage *decompressedImage = [UIImage imageWithCGImage:image];
CGImageRelease(image);

এই কোডটির সাথে বাণিজ্যটি হ'ল ডিকোডযুক্ত চিত্রটি আরও মেমরি ব্যবহার করে তবে রেন্ডারিং দ্রুত হয়।


দেখে মনে হচ্ছে আইওএস 11 এ, [ইউআইআইমেজ ইমেজ নামকরণ] চিত্রগুলি এক্সক্যাসেট ক্যাটালগ থেকে আসা অবস্থায় ক্যাশে থেকে চিত্রগুলি উচ্ছেদ করছে না। স্মৃতিশক্তি হারিয়ে যাওয়ার কারণে এটি ক্র্যাশ হয়ে যায়।
জুরাজ আনাস

5

আমার অভিজ্ঞতায়, ইমেজনমেড দ্বারা নির্মিত চিত্রের ক্যাশে মেমরির সতর্কতার প্রতিক্রিয়া জানায় না। আমার কাছে দুটি অ্যাপ্লিকেশন রয়েছে যেগুলি মেমো ম্যানেজমেন্ট হিসাবে যতটা পাতলা পাতলা ততই পাতলা ছিল তবে মেমের অভাবের কারণে অনিবার্যভাবে ক্র্যাশ হয়েছিল। আমি যখন ইমেজগুলি লোড করতে ইমেজ নেম ব্যবহার করা বন্ধ করলাম তখন উভয় অ্যাপ্লিকেশন নাটকীয়ভাবে আরও স্থিতিশীল হয়ে উঠল।

আমি স্বীকার করব যে উভয় অ্যাপ্লিকেশন কিছুটা বড় চিত্র লোড করেছে, তবে এমন কিছুই যা সম্পূর্ণরূপে সাধারণের বাইরে থাকবে না। প্রথম অ্যাপ্লিকেশনটিতে, আমি কেবল ক্যাচিং পুরোপুরি এড়িয়ে গিয়েছিলাম কারণ সম্ভবত কোনও ব্যবহারকারী দু'বার একই চিত্রটিতে ফিরে আসার সম্ভাবনা ছিল না। দ্বিতীয়টিতে, আপনি যা বলেছিলেন ঠিক সেভাবেই আমি একটি সাধারণ ক্যাচিং ক্লাস তৈরি করেছি - ইউআইআইমেজেসগুলিকে একটি এনএসউটেবলড অভিধানে রেখে এবং তারপরে আমি যদি কোনও স্মৃতি সতর্কতা পাই তবে এর বিষয়বস্তুগুলি ফ্লাশ করছি। যদি ইমেজ নামকরণ করা হয়: এটির মতো ক্যাশে থাকত, তবে আমার কোনও পারফরম্যান্স আপগ্রেড দেখা উচিত হয়নি। এই সমস্তগুলি ২.২ এ চলছিল - আমি জানি না এটির সাথে কোনও 3.0 টি প্রভাব রয়েছে কিনা I

আপনি আমার প্রথম অ্যাপ্লিকেশন থেকে এই সমস্যাটি সম্পর্কে আমার অন্যান্য প্রশ্নটি এখানে পেতে পারেন: ইউআইআইমেজ ক্যাশে করা সম্পর্কে স্ট্যাকওভারফ্লো প্রশ্ন

অন্য একটি নোট - ইন্টারফেসবিল্ডার কভারগুলির নীচে চিত্রযুক্ত নাম ব্যবহার করে। আপনি যদি এই সমস্যার মধ্যে চলে যান তবে কিছু মনে রাখবেন।


আমি ঠিক একই আচরণ দেখেছি এবং ফাইলটি পড়ে সরাসরি সমাধান করেছি। এছাড়াও, যখন আমি একটি খুব বড় চিত্র লোড করার চেষ্টা করি তখন এটি ঘটে - 11,456 x 3,226 px, 15MB। আমার তত্ত্বটি হ'ল ইমেজনামেড ক্যাশে অপারেশনের মাধ্যমে সিস্টেমটি মেমরির পার্ট-ওয়ে হয়ে চলেছে। এবং এই কেসটির জন্য কোনও হ্যান্ডলিং নির্মিত হয়নি।
ডগওয়েদার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.