(Можливо, ви захочете дізнатися про термін "мавпова латка" або "качка", якщо не що інше, як гумористичний ментальний образ.)
Це вбік: якщо ваша мета скорочує час ітерації для змін "поведінки", спробуйте кілька підходів, які вам найбільше підходять до цього шляху, і комбінуйте, щоб у майбутньому це було більше.
(Це вийде трохи дотичною, але я обіцяю, що повернеться!)
- Почніть з даних і почніть з малого: перезавантажтесь на межах ("рівнів" тощо), потім працюйте на шляху до використання функцій ОС, щоб отримувати сповіщення про зміни файлів або просто регулярно проводити опитування .
- (Для бонусних очок та менших разів завантаження (знову ж, зменшення часу ітерації) розгляньте випічку даних .)
- Сценарії є даними та дозволяють повторити поведінку. Якщо ви використовуєте мову сценаріїв, тепер у вас є сповіщення / можливість перезавантажувати ці сценарії, інтерпретувати чи компілювати. Ви також можете підключити свого перекладача до ігрової консолі, мережевої розетки тощо для підвищення гнучкості виконання.
- Код може бути і даними : ваш компілятор може підтримувати накладки , спільні бібліотеки, DLL тощо. Тепер ви можете вибрати "безпечний" час для вивантаження та перезавантаження накладної або DLL, будь то вручну чи автоматично. Інші відповіді тут детально описуються. Зауважте, що деякі варіанти цього можуть зіпсуватись із підтвердженням криптографічного підпису, бітом NX (без виконання) або подібними механізмами захисту.
- Розглянемо глибоку, вдосконалену систему збереження / завантаження . Якщо ви зможете надійно зберегти і відновити свій стан навіть за умови зміни коду, ви можете вимкнути гру та перезапустити її новою логікою в той самий момент. Простіше сказати, ніж зробити, але це можливо, і помітно простіше і портативніше, ніж тикати пам'ять, щоб змінити інструкції.
- Залежно від структури та детермінізму вашої гри ви можете робити запис та відтворення . Якщо ця запис трохи перевищує "ігрові команди" (наприклад, подумайте про карту), ви можете змінити весь код візуалізації, який ви хочете, і повторити запис, щоб побачити зміни. Для деяких ігор це настільки ж просто », як запис деяких початкових параметрів (наприклад, випадкове насіння), а потім дії користувача. Для деяких це набагато складніше.
- Докладіть зусиль, щоб скоротити час компіляції . У поєднанні з вищезгаданими системами збереження / завантаження або запису / відтворення, або навіть із накладками або DLL, це може зменшити обертання більше, ніж будь-яка інша річ.
Багато з цих пунктів є корисними, навіть якщо ви не можете повністю перезавантажити ні дані, ні код.
Підтримуючі анекдоти:
На великому ПК RTS (~ 120 осіб, в основному на C ++) існувала неймовірно глибока система економії стану, яка використовувалася щонайменше для трьох цілей:
- "Неглибоке" збереження подається не на диск, а в двигун CRC, щоб переконатися, що багатокористувацькі ігри залишаються в симуляції блокування по одній CRC кожні 10-30 кадрів; це забезпечило, що ніхто не обманював і піймав десинк-помилок через кілька кадрів
- Якщо і коли сталася помилка десинхронізації в декількох програвачах, було виконано надто глибоке збереження кожного кадру та знову подається в двигун CRC, але цього разу движок CRC генерував би багато CRC, кожен для менших партій байтів. Таким чином, це може точно сказати вам, яка частина штату почала розходитися в останньому кадрі. Ми виявили неприємну різницю між процесорами AMD та Intel, використовуючи цей режим, "плаваючою платою за замовчуванням".
- Звичайне збереження глибини може не врятувати, наприклад, точний кадр анімації, в який грав ваш пристрій, але він отримає позицію, стан здоров'я тощо для всіх ваших підрозділів, що дозволяє вам зберігати та відновити в будь-який час під час гри.
З тих пір я використовував детерміновані записи / відтворення на картках C ++ та Lua для DS. Ми підключились до API, який ми розробили для AI (на стороні C ++) і записали всі дії користувача та AI. Цю функціональність ми використовували в грі (щоб забезпечити повтор для гравця), а також для діагностики проблем: коли стався збій чи дивна поведінка, все, що нам потрібно було зробити, - це зберегти файл збереження та відтворити його у налагодженні.
З тих пір я використовував накладки більше декількох разів, і ми поєднали її з нашою системою «автоматично павук цього каталогу та завантажуємо новий вміст у портативну». Все, що нам потрібно зробити, - це залишити cutcene / level / що завгодно і повернутися, і завантажуватимуться не тільки нові дані (спрайти, макет рівня тощо), але й будь-який новий код у накладанні. На жаль, це стає набагато складніше з останніми кишеньковими комп'ютерами завдяки механізмам захисту від копіювання та механізмам антизлому, які спеціально розглядають код Ми все ще робимо це для скриптів lua.
І останнє, але не менш важливе: ви можете (і я маю, в різних дуже маленьких конкретних обставинах) зробити трохи удару качки, безпосередньо виправляючи інструкції інструкцій. Це найкраще працює, якщо ви знаходитесь на встановленій платформі та компіляторі, і оскільки це майже неможливо, дуже схильний до помилок і обмежений у тому, що ви можете швидко виконати, я здебільшого використовую його лише для перенаправлення коду під час налагодження. Хоча це навчить вас багато чого про архітектуру набору інструкцій, але поспішайте.