મેં મારા ગેમ એન્જિન માટે કોરૂટિન (Coroutines) બનાવ્યા, પણ પછી તેનો ઉપયોગ કર્યો નહીં
મેં મારા ગેમ એન્જિન માટે એક જનરેટર કોરૂટિન સિસ્ટમ બનાવી હતી. તેમાં 122 લાઇનનો કોડ અને 12 ટેસ્ટ હતા. તેણે 'કોલબેક હેલ' (callback hell) ની સમસ્યાનો ઉકેલ આપ્યો. તેણે સ્ક્રિપ્ટ્સને સીધી રેખા જેવી બનાવી દીધી.
પછી મેં મારા ગેમ લોજિક માટે તેનો ઉપયોગ ન કરવાનો નિર્ણય લીધો. તેના બદલે મેં ફાઈનાઈટ સ્ટેટ મશીન (Finite State Machine - FSM) નો ઉપયોગ કર્યો.
તેનું કારણ નીચે મુજબ છે.
મોટાભાગના ટ્યુટોરિયલ્સ રિયલ-ટાઇમ ગેમ્સમાં જનરેટર્સ સાથેની બે મોટી સમસ્યાઓને અવગણે છે: મેમરી અને સેવિંગ (saving).
1. મેમરી પ્રેશર (Memory Pressure)
જ્યારે પણ તમે જનરેટર પર .next() કોલ કરો છો, ત્યારે JavaScript એન્જિન એક નવો ઓબ્જેક્ટ બનાવે છે. આ ઓબ્જેક્ટમાં વર્તમાન વેલ્યુ અને સ્ટેટસ હોય છે.
60 FPS પર ચાલતા ગેમ લૂપમાં, આ સતત 'ગાર્બેજ કલેક્શન' (garbage collection) નું દબાણ ઊભું કરે છે. પરફોર્મન્સ સ્થિર રાખવા માટે મારું એન્જિન 'ઝીરો-એલોકેશન' (zero-allocation) નિયમનું પાલન કરે છે. જનરેટર્સ તે નિયમ તોડે છે. તેઓ દરેક ફ્રેમમાં નાના ઓબ્જેક્ટ્સનો પ્રવાહ બનાવે છે.
2. સિરીયલાઈઝેશન સમસ્યા (The Serialization Problem)
ગેમ માટે સેવ અને લોડ કરવાની જરૂર હોય છે. તમારે વર્તમાન ગેમ સ્ટેટને ડેટામાં અને ફરીથી પાછું બદલવાની જરૂર પડે છે.
તમે અટકાવેલા (paused) જનરેટરને સિરીયલાઈઝ કરી શકતા નથી. તેનું સ્ટેટ એન્જિનના આંતરિક સ્લોટ્સમાં હોય છે જેને તમે એક્સેસ કરી શકતા નથી. જો તમે તેને સેવ કરવાનો પ્રયાસ કરો છો, તો તમને ખાલી ઓબ્જેક્ટ અથવા એરર મળશે.
ફાઈનાઈટ સ્ટેટ મશીન અલગ છે. સ્ટેટ એ માત્ર એક કમ્પોનન્ટ પર રહેલી સ્ટ્રિંગ (string) છે.
- સેવ કરવા માટે: સ્ટ્રિંગને ડિસ્ક પર લખો.
- લોડ કરવા માટે: સ્ટ્રિંગ વાંચો અને FSM ને ત્યાંથી શરૂ કરવા માટે કહો.
FSM જીતી ગયું કારણ કે તે પ્રોફેશનલ ગેમ માટે મહત્વની બે બાબતો સંભાળે છે: પરફોર્મન્સ અને પર્સિસ્ટન્સ (persistence).
કેવી રીતે પસંદ કરવું:
શું લોજિક મુખ્ય ફ્રેમ લૂપની અંદર છે?
- ના: જનરેટર કોરૂટિનનો ઉપયોગ કરો. તે એસેટ્સ લોડ કરવા અથવા ઓનબોર્ડિંગ જેવા વન-ટાઇમ ફ્લો માટે ઉત્તમ છે.
- હા: પછીનો પ્રશ્ન પૂછો.
શું સ્ટેટને સેવિંગ પછી પણ ટકી રહેવાની જરૂર છે?
- હા: ફાઈનાઈટ સ્ટેટ મશીનનો ઉપયોગ કરો.
- ના: પછીનો પ્રશ્ન પૂછો.
શું તમે એકસાથે ઘણા સિક્વન્સ ચલાવી રહ્યા છો?
- હા: ફાઈનાઈટ સ્ટેટ મશીનનો ઉપયોગ કરો.
- ના: જનરેટર કોરૂટિનનો ઉપયોગ કરો.
જનરેટર્સ કોઈ ભૂલ નથી. તેઓ ફક્ત 'હોટ પાથ' (hot path) માટે ખોટા સાધન છે. તેનો ઉપયોગ એસિંક ગ્લુ (async glue) તરીકે કરો, પરંતુ તમારા ગેમ લોજિક માટે FSM નો ઉપયોગ કરો.
સ્ત્રોત: https://dev.to/grzott/i-built-generator-coroutines-for-my-game-engine-then-didnt-use-them-o3g
