हर फ्रेम को परफेक्ट बनाना
(tonsky.me)- UI लगभग एकमात्र सतह है जिससे उपयोगकर्ता ऐप की गुणवत्ता को परखते हैं, और किसी भी क्षण स्क्रीनशॉट लेने पर स्क्रीन की स्थिति समझ में आने वाली होनी चाहिए, तभी भरोसा बनता है
- उच्च-गुणवत्ता वाला UI इस बात का संकेत है कि डेवलपर ने उसे निखारने में समय लगाया है, और यह भी एक तार्किक heuristic बनता है कि कोड क्वालिटी को भी उसी तरह निखारा गया होगा
- वास्तविक मानक यह है कि स्क्रीन ट्रांज़िशन के बीच सफेद फ्लैश, partial loading, loading के दौरान relayout, state messages में असंगति, और गलत animation न हों
- शुरुआत और अंत की स्थिति अच्छी होने पर भी अगर बीच के फ्रेम बिगड़े हों, तो यह components के unsynced होने का एहसास देता है, और Photos के उदाहरण की तरह ऐसे ट्रांज़िशन में भी झूठा अहसास पैदा कर सकता है जहाँ वास्तव में कोई बदलाव नहीं हुआ हो
- animation को ट्रांज़िशन समझने में मदद करनी चाहिए, और सिर्फ शुरुआत व अंत नहीं बल्कि बीच के हर फ्रेम को नियंत्रित करने पर ही UI एक precision tool जैसा बनता है
मुख्य सिद्धांत
- Wayland का स्पष्ट लक्ष्य “every frame is perfect” आधुनिक GPU stack की जटिलता के बीच नियंत्रण वापस पाने का एक तकनीकी लक्ष्य है
- यही सिद्धांत UI पर भी लागू होता है, और ऐप के किसी भी क्षण का स्क्रीनशॉट लेने पर स्क्रीन स्वाभाविक और सुसंगत दिखनी चाहिए
- उपयोगकर्ता कोड नहीं देख सकते, इसलिए UI ही ऐप की गुणवत्ता को परखने की एकमात्र सतह बन जाता है
- अगर UI अच्छी तरह polished है, तो यह संकेत देता है कि डेवलपर ने polishing में समय लगाया है, और इससे यह धारणा बनती है कि कोड भी लगभग उसी स्तर तक निखारा गया होगा
वास्तविक मानक और उदाहरण
- परफेक्ट फ्रेम के लिए स्क्रीन के बीच सफेद फ्लैश नहीं होना चाहिए, और न ही content का partial loading state या loading के दौरान layout reshuffling होना चाहिए
- UI के अंदरूनी states सुसंगत होने चाहिए; ऐसा नहीं होना चाहिए कि एक हिस्सा “1 update available” कहे और दूसरा हिस्सा “Checking for updates...”
- animation को अक्सर भुला दिया जाता है; शुरुआत और अंत की स्थिति अच्छी होने पर भी अगर बीच का हिस्सा अटपटा हो, तो बीच का स्क्रीनशॉट ऐसा फ्रेम बन जाता है जो समझ में नहीं आता
- Safari के उदाहरण में placeholder text बीच से चलता है, लेकिन cursor बाईं ओर की स्थिति से animate होता है, जिससे दोनों components के बीच sync न होने का एहसास पैदा होता है
- Photos के उदाहरण में Crop और Adjust modes के बीच स्विच करते समय फोटो तुरंत अपनी जगह पर चली जाती है, लेकिन crop border animate होता रहता है, जिससे mode switch के दौरान कुछ सूक्ष्म रूप से बदलने का झूठा एहसास बनता है
- search UI के उदाहरण में ट्रांज़िशन को समझाने में मदद करने वाला animation उल्टा magnifying glass की movement को ट्रैक करना मुश्किल बना देता है
- Youtube के उदाहरण में एक rectangle को एक जगह से दूसरी जगह ले जाने जैसे सरल काम में भी अजीब movement दिखती है, और वजह चाहे जो हो, नतीजा परफेक्ट न होने वाला फ्रेम ही होता है
- Preview ऐप की zoom animation सहित, मुख्य बात यह है that केवल शुरुआत और अंत की स्थिति ही नहीं, बल्कि उनके बीच के हर क्षण पर भी ध्यान देना चाहिए
2 टिप्पणियां
Hacker News की राय
लेखक ने जो कुछ उदाहरण दिए हैं, उनमें से कुछ वाकई खराब animation हैं, लेकिन लेख की बुनियादी धारणा से सहमत होना मुश्किल है
computer graphics ऐसा क्षेत्र है जो मानव visual system की विशेषताओं का उपयोग करता है, और गतिशील चीज़ें व स्थिर चीज़ें अलग तरह से perceive होती हैं। अलग करके देखने पर जो frame “गलत” लगे, वही असली समय-प्रवाह में सबसे अच्छा दिख सकता है
फ़िल्म के उदाहरण से कहें तो तेज़ tracking shot में motion blur की वजह से अलग-अलग frame खराब दिख सकते हैं, और wide-angle shot में distortion की वजह से वस्तुएँ “गलत” लग सकती हैं, लेकिन अगर थिएटर में वे इच्छित कलात्मक प्रभाव पैदा करें तो वही सही चुनाव है
सही blur को motion में जोड़ने पर चीज़ ज़्यादा sharp महसूस हो सकती है, लेकिन स्थिर image में देखने पर वह स्वाभाविक रूप से ज़्यादा sharp नहीं लगेगी। मुख्य बात यह है कि सही motion blur यह सुनिश्चित करता है कि उस गति पर इंसान जितना moving detail perceive कर सकता है, image उतनी ही sharp दिखे। इसलिए स्थिर motion-blur frame को sharpness या interpretability के आधार पर आँकना ग़लत है
लेख का बाकी हिस्सा implementation detail पर केंद्रित है, लेकिन शुरू में ही यह पूछने का मौका चूक जाता है कि ऐसी animation में से कुछ का होना ज़रूरी भी है या नहीं। motion सीमित रूप में इस्तेमाल हो तो अच्छा affordance बन सकता है, लेकिन अब इसका अति-उपयोग user की नज़र और cognitive load पर भी अतिक्रमण करने लगा है। designer और PM इसे “परिष्कृत modern UX” की निशानी समझते हैं, लेकिन कई बार यह अच्छे design की जगह अच्छे design की नकल करने वाली चलताऊ सजावट बनकर रह गया है
दिखाए गए कुछ animation निश्चित रूप से बेहतर किए जा सकते हैं। ऐसे छोटे-छोटे आनंद को आगे बढ़ाने में AI काफ़ी उपयोगी लगती है, क्योंकि पहले इसकी priority कम होने से इस पर समय लगाना मुश्किल था
animation के बीच का frame थोड़ा “अजीब” दिखे लेकिन तर्कसंगत रूप से सही हो, यह अलग बात है; और intermediate state वास्तव में बेमानी हो और बस इस बात की परवाह न की गई हो कि animation के दौरान क्या हो रहा है, यह अलग बात है। दूसरे मामले में तो animation हटा देना या उसे और सरल बना देना ही बेहतर है
UI की finish को software quality का proxy metric मानने वाला लेख का नज़रिया अच्छा है, और खराब animation की ओर इशारा भी सही है। बस frame-by-frame consistency, animation की “अच्छाई” मापने का सबसे अच्छा पैमाना नहीं है
कुछ devices पर अभी भी Sonoma है, और बस यही लगता है कि चीज़ें लगातार regress कर रही हैं
save dialog थोड़ा हिलता है, लेकिन उदाहरण जितना उलझाऊ नहीं है। Notes के button panels के बीच पूरी तरह smooth चलते हैं। Safari bar को बार-बार focus और unfocus करने पर कभी-कभी animation टूटती है, लेकिन cursor का timing text के साथ बिल्कुल सटीक रहता है और text के बाएँ खिसकना खत्म होने के बाद ही fade-in होता है। Preview bug भी हाल की समस्या लगती है, और reproduce नहीं हो रही
https://streamable.com/kx7op6
Apple, Sony, IBM जैसी कंपनियाँ जब बहुत छोटे detail पर ध्यान देती थीं, वह दौर याद आता है। खासकर Apple ने iPhone से आज की अपनी हैसियत पाई, लेकिन उस समय Windows Mobile या Symbian PDA की तुलना में उसने कोई असाधारण feature नहीं दिया था; बल्कि feature के लिहाज़ से कुछ मामलों में पीछे भी था। फिर भी वह ऐसा all-touch device था जिसे कुछ मिनट इस्तेमाल करके दीवार पर फेंकने का मन नहीं करता था। आज की ऐसी animation ठीक वही Windows Mobile और Symbian वाली भावना वापस ले आती हैं
याद है Steve को OS X animation कितनी पसंद थीं। वह मंच पर कई बार उन्हें दोबारा, slow motion में चलाता था। आज की चीज़ें तो ऐसी लगती हैं कि iPhone 4 antenna वाले व्यक्ति को जो हश्र मिला, वैसा ही इन्हें बनाने वालों के साथ भी हो तो अजीब नहीं लगेगा
ऐसा लगता है कि ऐसे UI जिनमें ये अपूर्ण frame न हों, वे बेहतर महसूस होंगे, लेकिन अब कोई इन clips को ठीक करके यह दिखाए कि वे वास्तव में कैसे दिखेंगे
साथ ही यह भी सवाल है कि हर चीज़ में motion की ज़रूरत ही क्यों है। मेरी समझ से motion तब इस्तेमाल होनी चाहिए जब UI में हल्का बदलाव उस जगह से अलग क्षेत्र में हो जहाँ user ने action शुरू किया था, जैसे toast
यहाँ दिखाए गए कई transition अनावश्यक लगते हैं, और तुरंत बदलाव के साथ immediate reflow भी काफ़ी अच्छा महसूस हो सकता है
cursor बाएँ इसलिए दिखता है क्योंकि user वास्तव में वहीं से typing शुरू करता है। UI को जानने वाला व्यक्ति शायद वहीं देखेगा। cursor को पहले स्क्रीन के बीच में दिखाकर फिर खिसकाना अनावश्यक और ध्यान भटकाने वाला होगा
placeholder text का बाएँ सरकना कम अनुभवी user का ध्यान खींचने के लिए है
$BRANDकी design language विकल्पों से श्रेष्ठ हैज़्यादातर उदाहरण animation के बिना शायद बेहतर लगेंगे। button दबाया है तो नतीजा दिखा दीजिए। नाच-गाना करवाकर नहीं, बस सीधे दिखाइए
motion न हो तो कई बार हर refresh पर दिमाग़ को पूरे page को फिर से scan करना पड़ता है
मुझे लगता है कि इस लेख का तर्क कमज़ोर तरीके से रखा गया है। न कोई बेहतर विकल्प दिया गया है, न यह सच में समझाया गया है कि बताई गई चीज़ें users के लिए क्यों नकारात्मक हैं। वे नकारात्मक हो सकती हैं, लेकिन यह कुछ वैसा ही लगता है जैसे media के smear frame या transition point दिखाकर उनकी खोखली आलोचना करना।
“हर frame का समझ में आना चाहिए” वाला मानदंड भी संभालना मुश्किल है। मुझे यह असंभव लगता है, और मैं पूछना चाहूँगा कि window resize करते समय भी हर frame को पूरी तरह सही कैसे रखा जाएगा।
ऐसा भी लगता है कि लेखक खुद अपने बताए मानदंड पर चलने की बजाय defect वाले frames की ओर इशारा करना आसान समझते हैं। ब्लॉग के header link पर क्लिक करें तो click खत्म होने के बाद animation चलती है। उनके अपने UI project में भी ऐसी जगहें हैं जहाँ text और object container के भीतर नहीं रहते। अगर आप कहते हैं कि ऐसे principles का पालन होना चाहिए, तो आपको खुद भी इसे दिखा पाना चाहिए।
अगर लेख बेहतर लिखा गया होता, तो वह इस पर ध्यान देता कि बताई गई चीज़ें end user के लिए क्यों खराब हैं और उनके बजाय क्या किया जाना चाहिए। अच्छी आलोचना में सिर्फ “क्या” नहीं, बल्कि क्यों और कैसे भी होना चाहिए।
लेख समाधान नहीं, बल्कि ideas पेश कर रहा है। इसे न देख पाना और फिर कई strawman arguments खड़े करके आलोचना करना गलत है।
इससे भी ज़्यादा महत्वपूर्ण बात यह है कि लेख निर्णायक लहजे में लिखा ही नहीं गया था। “I think”, “Next thought:”, “Probably”, “So yeah.” जैसी सावधानी भरी भाषा इस्तेमाल की गई थी। यह एक व्यक्ति द्वारा अपने विचार साझा करना है, और यह काफ़ी परिपक्व विचार है—इतना कि कई समझदार लोग इसी दिशा में सोचने लगें।
सिर्फ इसलिए कि लेखक ने समाधान नहीं दिया, इसका मतलब यह नहीं कि उन्हें देना ही चाहिए था। ऐसा मानदंड अजीब और अनुचित है।
लेखक की site पर हमला करना भी अच्छा नहीं लगता। taste का अंतर अच्छी तरह जाना-पहचाना है, और conceptual contribution को practical skill से आगे होने के कारण सज़ा देना काफ़ी असहज करने वाला है।
बेहतर आलोचना होती तो इस community की भावना के अनुरूप ज़्यादा उदार होती।
मैंने कुछ प्रतिक्रियाएँ देखीं जिनमें कहा गया कि लेखक को समाधान के उदाहरण भी शामिल करने चाहिए थे। उन्होंने हाल ही में इस लेख से बहुत मिलता-जुलता एक लेख लिखा था, जिसमें यहाँ की तरह animation की समस्याओं को विस्तार से बताया गया था और यह भी समझाया गया था कि उन्होंने उन्हें कैसे सुधारा।
अगर दिलचस्पी हो, तो यहाँ देख सकते हैं: https://www.thisischris.dev/projects/project-6/
बाद में मिलने वाले perfect frame से बेहतर अभी का imperfect frame है। हर UI में latency सर्वोच्च प्राथमिकता होनी चाहिए। अगर latency काफ़ी कम हो, तो चीज़ अपने शरीर के हिस्से जैसी लगने लगती है और cognitive load कम होता है। animation यहाँ खास तौर पर बुरी है, क्योंकि वह सैकड़ों milliseconds की देरी जोड़ देती है।
अच्छा होता अगर नकारात्मक उदाहरणों के साथ सकारात्मक उदाहरण भी होते। अभी जो निष्कर्ष निकलता है, वह बस इतना है कि animation से बचना चाहिए, जबकि शायद लेखक का असली मतलब यह नहीं है।
अच्छी animation का हर frame में perfect दिखना ज़रूरी नहीं; अक्सर वह चलते समय थोड़ी visual trickery का सहारा लेती है। cartoon के smear frame की तरह—रोककर देखें तो अजीब लगता है, लेकिन पूरी animation के भीतर वही movement को visually believable बनाता है।
मैं developer नहीं हूँ, लेकिन मुझे ऐसे हिस्से महसूस हुए जहाँ icons या windows पहले की तरह—या जिस तरह स्वाभाविक रूप से होना चाहिए—उस तरह placed या moved नहीं लगते थे।
यह patchwork जैसा एहसास समय के साथ भी नहीं बदला। पूरे OS और apps में इतने उदाहरण हैं कि मन करता है कह दूँ “हमेशा से ऐसा ही था”, लेकिन असल में ऐसा नहीं था। Apple ने एक मानक बनाया था, वह मानक ऊँचा था, और quality शानदार थी।
ऐसा लगता है कि SwiftUI में वही UI layout या animation हासिल करने के लिए बहुत सारे hacks लगाने पड़ते हैं।
और आख़िर में, एक बात जो मैं अक्सर सोचता हूँ, वह यह है कि analog सृजन पहले भी बहुत कठिन था और आज भी है। digital में हम अक्सर सोचते रहे कि बाद में लौटकर इसे सुधार लेंगे, लेकिन व्यवहार में हम ऐसा नहीं करते, और अफ़सोस की बात है कि कई बार बुरी चीज़ के ऊपर उससे भी बुरी चीज़ चढ़ाते जाते हैं।
[1]: https://youtu.be/vIdeGmN__Pw?t=550
बिना किसी animation वाला app बहुत खराब महसूस होगा। अगर आपके पास Android है, तो developer settings में animation speed को 0x पर बदलकर इसे खुद आज़मा सकते हैं। अचानक होने वाला बदलाव खटकता है, और दिमाग को समझने में कि क्या हुआ, उल्टा लगभग 1 सेकंड लग जाता है, और वह प्रक्रिया animation होने की तुलना में और धीमी भी लग सकती है
मेरी setting 0.5x है, और वह काफी लगती है। फिर भी तेज़ है, लेकिन app का खुलना और बंद होना दिखता है
0x की समस्या यह है कि लगता है यह UI के केवल लगभग 90% हिस्से पर ही लागू होता है। कुछ चीज़ों में अब भी animation रहता है, और नतीजे में rhythm बहुत अजीब लगती है
0.5x पर वे चीज़ें कम खटकती हैं जो animation speed setting से अजीब तरह से प्रभावित नहीं होतीं
अगर यह सही से काम करे, तो मैं 0x इस्तेमाल करूँगा
ज़रूरत पड़े तो processing में 1 सेकंड लगना मुझे बेहतर लगेगा, और सच कहूँ तो मुझे नहीं लगता कि उसकी भी ज़रूरत है। हर बार app के page बदलने पर animation की वजह से 1 सेकंड धीमा होना उससे कहीं बुरा है, और navigate करते समय सब कुछ गुड़ जैसा भारी लगता है
यह लेख relatable लगा, लेकिन काश इसमें कुछ positive examples भी होते। tone शिकायत जैसी नहीं लगी, लेकिन अच्छे UI composition के बारे में ज़्यादा न जानने वाले की हैसियत से मुझे यह एहसास नहीं हुआ कि अब मैं किसे north star मानूँ
अगर जिज्ञासा हो, तो यहाँ देख सकते हैं: https://www.thisischris.dev/projects/project-6/
Lobste.rs टिप्पणियाँ
मुझे लगता है कि इस लेख की बुनियादी धारणा गलत है। ऐसे apps को frame-by-frame इस्तेमाल नहीं किया जाता
सिर्फ़ बुनियादी animation क्लास लेने पर भी यह सिखाया जाता है कि movement को पहचानने का तरीका स्थिर images से अलग होता है। अगर आप "squash and stretch" demo देखें, तो frame-दर-frame किसी object के dimensions अलग-अलग देखने पर बिल्कुल बेतुके लग सकते हैं, लेकिन movement के भीतर वही बहुत खूबसूरती से काम करते हैं
cut वाले उदाहरण की तरह यह program की state को गलत भी दिखा सकता है। UI के फिर से जुड़ने तक user को लगभग एक-तिहाई सेकंड तक दिमाग बंद करके इंतज़ार करना पड़ता है, तभी वह program का इस्तेमाल जारी रख सकता है
मुझे नहीं लगता कि Wayland project जिस frame perfectness की बात करता है, उसका मतलब यह है
वह ज़्यादा likely window resizing जैसी low-level technical details की तरफ इशारा करता है। जैसे content का asynchronously resize होना, vertical sync के टूटने से screen tearing या अजीब diagonal artifacts आना, या damage region reporting का rectangular subregions में होना
बेशक अच्छा होगा अगर low-level details और high-level animation दोनों ही frame स्तर पर perfect हों
मान लें कि आप ऐसे animations को test करना चाहते हैं, और ऐसे tests लिखना चाहते हैं जो यह verify करें कि समय के साथ यह गुण टूटे नहीं
आज के web apps और native apps में इस तरह के गुणों को test करने की state of the art technique क्या है? क्या event loop को control न कर पाने की वजह से कुछ खास तरह के tests practically impossible या बहुत कठिन हो जाते हैं?
या Paparazzi जैसे tool से पूरे transition को Animated PNG के रूप में record करके automated regression test भी किया जा सकता है
तब आप दोनों बिंदुओं को अलग-अलग verify कर सकते हैं, और आखिर में सिर्फ final state check करनी होगी। animation समय के input से बंधी होने के बजाय बाहर से step-by-step drive की जा सकनी चाहिए
मुझे लगता है कि YouTube वाला उदाहरण View Transitions के use case के काफ़ी क़रीब है
यह declarative style है: “जब यह element बदले, तो इसे अपने-आप shape बदलने दो”, और नतीजतन technically impressive लेकिन थोड़ा लिसलिसा-सा transition निकलता है, जिसमें elements तैरते हुए और एक-दूसरे में deform होते दिखते हैं
यह बहुत cool technology है, लेकिन navigation के दौरान छोटे emphasis effect के अलावा मैंने इसे शायद ही कभी शानदार दिखते देखा है। ज़्यादा distracting न हो, इसके लिए इसे बहुत संयम से इस्तेमाल करना चाहिए