Маючи відмінні відповіді Шона та Блю щодо обмежень фізичної платформи та про-кон-рішень, я хочу розглянути коментар до іншого підходу:
Чому ви повинні, ймовірно, просто повністю перезавантажити рівень
Отже, у вас виклик loadLevel () працює бездоганно, так! Ви завантажуєте інформацію про файл рівня і крокуєте через побудову на ньому світу, створюючи об'єкти та завантажуючи текстури та звуки під час руху. Потім, коли це все зроблено - або зроблено "достатньо", щоб відтворити гру, ви викликаєте startPlay () і ваш світ розкривається, і ваша музика починає грати.
Тепер, коли ви закінчите з рівнем, або переходите до меню, або виходите з гри, ви зателефонуєте unloadLevel (), щоб звільнити всі ресурси та пам'ять, яку ви тримали, щоб забезпечити безперебійний досвід.
Тепер, що станеться, коли ви хочете додати функцію "Перезапуск рівня"? Ну...
unloadLevel(currentLevel);
loadLevel(currentLevel);
startPlay();
І ви зробили! Ніякого нового коду, не більше декількох простих функціональних дзвінків, і ви вже написали та налагодили це все, так що тепер ваша нова блискуча функція перезавантаження перекреслена зі списку, і, ймовірно, більше ніколи не зустрінеться - безкрутний, неіржавіючий код найкращий вид! Перемістіть код у функцію restartCurrentLevel (), і ви зможете скласти цей код і ніколи більше не дивитися на нього - можливо, переконавшись, що є рівень для перезавантаження, звичайно :)
Але тоді вам цікаво, чи це не марно, вивантажуйте речі, які ви збираєтеся знову перезавантажити. Ну а якщо ваші рівні та ресурси невеликі, то найбільше вам доводиться отримувати - це кілька запасних секунд часу завантаження кожного разу, коли «Перезапуск» викликається навіть у повільних системах (а може бути і старих смартфонах), тож хто турбується? "Передчасна оптимізація", ви маєте кращі справи зі своїм часом.
Ах, але тепер ваші рівні зростають, а ваші текстури стають все більш детальними, а саундтрек розбивається на 512 кбіт / с з окремими каналами для кожного голосу та музичного шару (це здавалося гарною ідеєю в той час, хоча ви не можете згадати чому. ..) і щось про "залежне від стану походження воксельного проміння багатовимірних матриць перетворення Фур'є", яке, на вашу думку, просто складено і не є реальною справою, а завантаження рівня насправді потребує певного часу, і його початок вас дратує. Ви навіть пройшли тестування з реальними людьми, і вони насправді демонструють неприємність до очікування, оскільки це гірше, ніж подібні ігри (ви не очікуєте, що столиця MMORPG зі 100 гравцями повністю завантажиться за <2 секунди, чи не так?), і це проблема.
То як оптимізувати? Ну, якщо перезавантаження рівня - це проблема, то чи не проблема завантаження рівня ? Якщо ви думаєте, що це просто перезавантаження, чому на землі люди перезаряджають ваш рівень набагато частіше, ніж вони в першу чергу просто завантажують рівень? Звучить як проблема гри, а не проблема кодування. Хто вважає, що її задоволення перезавантажувати рівень знову і знову, і просто хоче, щоб це було швидше, а не цілком уникнути ?
Спершу виправте справжню проблему!
Але скажемо, що ваша гра розроблена, тому вам слід перезапустити хоча б періодично, а час завантаження достатньо довгий, щоб її нормально зробити один раз і зовсім неминуче, але вам не хочеться робити це знову. Що це за гра? Здається, це якась дивна проблема ... можливо, портальна гра, що має високу роздільну здатність, де передбачається, що ви збираєтеся зіпсувати головоломку повторно?
Перш за все, ви повинні усвідомити, що це не тривіально. Вам потрібно буде написати абсолютно новий, неперевірений код, і це "залежно від стану", щоб ви могли навіть не знати, що є чи не збирається повторно використовувати між рівневими п'єсами. Чи є у вашому рівні випадкові елементи, нерести, змінні текстури (чи ваші скелети лише іноді носять броні?) Чи інші змінні елементи? Чи є речі, які залежать від плеєра, як наряд чи індивідуальна модель або кольори / двері / пастки?
Ви збираєтеся робити порівняння, і їх багато. Ви збираєтеся перебирати елементи рівня, порівнюючи те, що знадобиться порівняно з тим, що зараз завантажено (що ви робите з речами, завантаженими для останнього рівня, але не для цього - випустіть їх або утримуйте, щоб запобігти майбутньому навантаження?). Якщо це дійсно велика справа для вашої гри, ви, ймовірно, захочете змінити свій код завантаження / вивантаження, щоб побачити, чи щось вже завантажено перед завантаженням (зробивши код багатоцільовим, але потенційно вводячи нові помилки в раніше працюючі функції та функції які ретельно випускають ресурси, які не будуть використані найближчим часом). Зітхнути.
Незалежно від того, що ви робите, навіть якщо ваша гра проста, ви збираєтесь потрапляти в незрозумілі помилки, які базуються на рівні рівня / гравця, коли рівень перезапускався, що не трапляється, коли ви завантажуєте рівень в перший раз. Таким чином, ви можете писати оновлення гри з текстом:
"Якщо накинути шолом на бомбу на плитку, яка біля неї вибухнула ракетою, яка також знаходилася в межах 200 пікселів води, більше не зіпсує ваші дані гри та не призведе до краху гри".
Справжня причина Більшість ігор не турбує
Ви ніколи не помічали, що більшість людей просто фарбують або на гіпсокартоні над своїми існуючими стінами, а не збивають до основного шару, або кладуть килим прямо на підлоги з листяних порід дерева, а не натягують їх?
Простий факт полягає в тому, що це все більше роботи за мінімальну винагороду. Фарбування ваших існуючих стін працює чудово протягом більшої частини часу , а значення розриву підлог з деревини деревини часто мінімальне або взагалі не існує.
Те саме стосується програмного забезпечення, від ігор до мультимедійних презентацій Power Point - якщо все, що ви робите, це поголити кілька секунд з завантажувального екрану, люди витрачають 1% свого часу на перегляд, то це краще зробити неймовірно дрібницею або ви отримуєте дуже погана віддача від інвестованого часу.
І тому більшість ігор не турбує, і я маю проблеми з думкою про дуже багато ігор, де завантаження екранів зробило інакше хорошу гру менш вартістю, за винятком кількох крайніх прикладів; крайні приклади - оптимізація для швидшого завантаження рівня має сенс, і це крихітні фракції ігор, які роблять це для публіки, і, мабуть, навіть менші фракції ігор, які ніхто ніколи не бачить, оскільки вони ніколи не виходять.