(Bạn có thể muốn biết về thuật ngữ "khỉ vá" hoặc "đấm vịt" nếu không có gì khác ngoài hình ảnh tinh thần hài hước.)
Điều đó sang một bên: nếu mục tiêu của bạn đang giảm thời gian lặp lại cho các thay đổi "hành vi", hãy thử một số cách tiếp cận giúp bạn đạt được điều đó và kết hợp độc đáo để kích hoạt nhiều hơn điều này trong tương lai.
(Điều này sẽ xảy ra một chút tiếp tuyến, nhưng tôi hứa nó sẽ trở lại!)
- Bắt đầu với dữ liệu và bắt đầu nhỏ: tải lại ở các ranh giới ("cấp độ" hoặc tương tự), sau đó tìm cách sử dụng chức năng của hệ điều hành để nhận thông báo thay đổi tệp hoặc chỉ cần thăm dò ý kiến thường xuyên.
- (Đối với điểm thưởng và thời gian tải thấp hơn (một lần nữa, giảm thời gian lặp lại) hãy xem xét nướng dữ liệu .)
- Các tập lệnh là dữ liệu và cho phép bạn lặp lại hành vi. Nếu bạn sử dụng ngôn ngữ kịch bản, giờ đây bạn có các thông báo / khả năng tải lại các tập lệnh đó, được giải thích hoặc biên dịch. Bạn cũng có thể nối trình thông dịch của mình vào bảng điều khiển trong trò chơi, ổ cắm mạng hoặc tương tự để tăng tính linh hoạt thời gian chạy.
- Mã cũng có thể là dữ liệu : trình biên dịch của bạn có thể hỗ trợ lớp phủ , thư viện dùng chung, DLL hoặc tương tự. Vì vậy, bây giờ bạn có thể chọn thời gian "an toàn" để tải và tải lại lớp phủ hoặc DLL, cho dù là thủ công hay tự động. Các câu trả lời khác đi vào chi tiết ở đây. Xin lưu ý rằng một số biến thể của điều này có thể gây rối với mã hóa chữ ký mã hóa, bit NX (không thực thi) hoặc các cơ chế bảo mật tương tự.
- Hãy xem xét một hệ thống lưu / tải sâu, phiên bản sâu . Nếu bạn có thể lưu và khôi phục trạng thái của mình một cách mạnh mẽ ngay cả khi đối mặt với các thay đổi mã, bạn có thể tắt trò chơi của mình và khởi động lại nó bằng logic mới tại cùng một điểm. Nói dễ hơn làm, nhưng có thể thực hiện được, và nó dễ dàng và dễ mang theo hơn là chọc bộ nhớ để thay đổi hướng dẫn.
- Tùy thuộc vào cấu trúc và tính quyết định của trò chơi của bạn, bạn có thể thực hiện ghi và phát lại . Nếu bản ghi đó chỉ hơn "lệnh trò chơi" (ví dụ như nghĩ về một trò chơi bài), bạn có thể thay đổi tất cả mã kết xuất bạn muốn và phát lại bản ghi để xem các thay đổi của bạn. Đối với một số trò chơi, điều này "dễ dàng" như ghi lại một số tham số bắt đầu (ví dụ: một hạt giống ngẫu nhiên) và sau đó là hành động của người dùng. Đối với một số người thì phức tạp hơn nhiều.
- Hãy nỗ lực để giảm thời gian biên dịch . Kết hợp với các hệ thống lưu / tải hoặc ghi / phát lại đã nói ở trên, hoặc thậm chí với các lớp phủ hoặc DLL, điều này có thể làm giảm vòng quay của bạn nhiều hơn bất kỳ điều gì khác.
Nhiều điểm trong số này có lợi ngay cả khi bạn không có cách nào để tải lại dữ liệu hoặc mã.
Hỗ trợ giai thoại:
Trên một PC RTS lớn (~ 120 người, chủ yếu là C ++), có một hệ thống tiết kiệm trạng thái cực kỳ sâu sắc, được sử dụng cho ít nhất ba mục đích:
- Một bản lưu "nông" được cung cấp không phải vào đĩa mà cho động cơ CRC để đảm bảo rằng các trò chơi nhiều người chơi vẫn ở dạng mô phỏng bước khóa một CRC cứ sau 10-30 khung hình; điều này đảm bảo không ai gian lận và bắt gặp lỗi desync một vài khung hình sau đó
- Nếu và khi xảy ra lỗi desync nhiều người chơi, một lần lưu cực sâu đã được thực hiện ở mọi khung hình và một lần nữa được cung cấp cho công cụ CRC, nhưng lần này, công cụ CRC sẽ tạo ra nhiều CRC, mỗi đợt cho các byte nhỏ hơn. Theo cách này, nó có thể cho bạn biết chính xác phần nào của trạng thái đã bắt đầu phân kỳ trong khung cuối cùng. Chúng tôi đã bắt gặp một sự khác biệt "chế độ điểm nổi mặc định" khó chịu giữa bộ xử lý AMD và Intel bằng cách sử dụng này.
- Lưu độ sâu thông thường có thể không lưu, ví dụ: khung hoạt hình chính xác mà đơn vị bạn đang phát, nhưng nó sẽ có được vị trí, sức khỏe, v.v. của tất cả các đơn vị của bạn, cho phép bạn lưu và tiếp tục bất cứ lúc nào trong khi chơi trò chơi.
Kể từ đó, tôi đã sử dụng bản ghi / phát lại xác định trên trò chơi thẻ C ++ và Lua cho DS. Chúng tôi đã nối vào API mà chúng tôi thiết kế cho AI (về phía C ++) và ghi lại tất cả các hành động của người dùng và AI. Chúng tôi đã sử dụng chức năng này trong trò chơi (để cung cấp phát lại cho người chơi), nhưng cũng để chẩn đoán các vấn đề: khi có sự cố hoặc hành vi kỳ quặc, tất cả những gì chúng tôi phải làm là lấy tệp lưu và phát lại trong bản dựng gỡ lỗi.
Kể từ đó, tôi cũng đã sử dụng lớp phủ hơn một vài lần và chúng tôi đã kết hợp nó với hệ thống "tự động nhện thư mục này và tải nội dung mới lên hệ thống cầm tay". Tất cả những gì chúng ta phải làm là để lại cutscene / level / bất cứ thứ gì và quay trở lại, và không chỉ dữ liệu mới (sprite, layout layout, v.v.) sẽ tải mà còn bất kỳ mã mới nào trong lớp phủ. Thật không may, điều đó trở nên khó khăn hơn nhiều với các thiết bị cầm tay gần đây hơn do các cơ chế chống sao chép và chống hack đặc biệt xử lý mã. Chúng tôi vẫn làm điều đó cho các kịch bản lua mặc dù.
Cuối cùng nhưng không kém phần quan trọng: bạn có thể (và tôi có, trong những trường hợp cụ thể rất nhỏ khác nhau) thực hiện một chút cú đấm bằng cách vá trực tiếp các lệnh opcodes. Tuy nhiên, điều này hoạt động tốt nhất nếu bạn đang ở trên một nền tảng và trình biên dịch cố định, và vì nó gần như không thể nhận ra, rất dễ bị lỗi và bị hạn chế trong những gì bạn có thể thực hiện nhanh chóng, tôi chủ yếu chỉ sử dụng nó để định tuyến lại mã trong khi gỡ lỗi. Nó không dạy cho bạn một địa ngục của rất nhiều về kiến trúc tập lệnh của bạn trong một vội vàng, mặc dù.