3 điểm bởi GN⁺ 2024-05-16 | 2 bình luận | Chia sẻ qua WhatsApp
  • Các game Nintendo 64 ra mắt năm 1996 nay có thể được biên dịch lại thành bản port PC native thay vì chạy qua giả lập, cho phép áp dụng các cải tiến như ray tracing, ultrawide và FPS cao
  • N64RecompZelda64Recomp do Mr-Wiseguy công bố trên GitHub là các công cụ cốt lõi; Zelda64Recomp port The Legend of Zelda: Majora's Mask lên PC
  • Cách làm này khác với bản port Super Mario 64 cho PC dựa trên giải biên dịch hoàn toàn được công bố năm 2020, nhưng cả hai đều chạy native trên PC, giúp nâng cao hiệu năng và độ chính xác của hiệu ứng
  • Trong khi giải biên dịch thủ công đòi hỏi một hoặc nhiều người làm việc trong nhiều năm, N64Recomp là cách tiếp cận giúp chuyển game N64 sang dạng có thể chạy trên PC nhanh hơn
  • Thành phẩm không bao gồm asset nên cần có ROM để chơi; Banjo-Kazooie, Rocket Robot và Superman 64 cũng được nhắc đến như các ví dụ đã chạy được

Sự thay đổi trong cách port game N64

  • Ngay cả trong năm 2024, phần cứng gốc và game của Nintendo 64 vẫn tiếp tục nhận được sự quan tâm từ cộng đồng người hâm mộ
  • Bước tiếp theo của trải nghiệm N64 nâng cao nhiều khả năng sẽ không phải là giả lập, mà là các bản port PC được biên dịch lại
  • Mr-Wiseguy trên GitHub đã công bố N64RecompZelda64Recomp
    • N64Recomp là công cụ nền tảng để tạo bản port native cho PC từ game N64
    • Zelda64Recomp port The Legend of Zelda: Majora's Mask lên PC và áp dụng các cải tiến về đồ họa cũng như tiện ích của N64Recomp

Các cải tiến có thể có trong bản port PC

  • Bản port PC được biên dịch lại có thể bổ sung các cải tiến của môi trường PC vào game N64 gốc
    • Ray tracing thực sự

      • Gỡ giới hạn khung hình
      • Hỗ trợ ultrawide đúng cách
      • Các cải tiến đồ họa và tiện ích thường được kỳ vọng trên PC
      • Majora's Mask được dùng làm ví dụ so sánh chạy ultrawide giữa phương thức giả lập và phương thức biên dịch lại native cho PC

Khác biệt với bản port Super Mario 64 cho PC

  • Bản port Super Mario 64 cho PC dựa trên giải biên dịch hoàn toàn, được công bố năm 2020, đã cho phép các tính năng như ray tracing và thay thế toàn bộ model; đến nay các bản mod vẫn tiếp tục được phát triển
  • Bản port biên dịch lại khác với các bản port giải biên dịch như bản port SM64 cho PC ở cách thức tạo ra
  • Cả hai cách đều chạy native trên PC, có thể nâng cao hiệu năng và độ chính xác của hiệu ứng so với phần cứng gốc, đồng thời mang lại các cải tiến kiểu PC thường được kỳ vọng ở giả lập

Vì sao N64Recomp quan trọng

  • N64Recomp là công cụ dùng cách tiếp cận biên dịch lại để nhắm tới lợi thế của cả giả lập lẫn bản port native
  • Nếu muốn giải biên dịch thủ công một game N64, một hoặc nhiều người phải làm việc trong nhiều năm
  • Một công cụ hiệu quả hơn để nhanh chóng đưa game N64 vào trạng thái có thể chạy trên PC cũng có thể hữu ích cho các nhà bảo tồn

RT64 và các ví dụ chạy được

  • Dario là nhà phát triển tạo ra plugin RT64, được sử dụng trong N64Recomp và một số trình giả lập N64
  • Theo bài đăng của Dario, Wiseguy đã âm thầm làm việc trong 1 năm trên một công cụ tạo bản port PC cho game N64 mà không cần giải biên dịch hoàn toàn
  • Thành phẩm không bao gồm asset, và chỉ cần ROM để chơi
  • Các game sau được nhắc đến như ví dụ chạy được
    • Banjo-Kazooie
    • Rocket Robot
    • Superman 64

Những chuyển động khác trong hệ sinh thái N64

  • Các tiến triển khác dành cho thư viện N64 và người hâm mộ phần cứng gốc cũng vẫn đang tiếp diễn
  • SummerCart64 mã nguồn mở là flash cart cho console hiện có, và cũng đã triển khai hỗ trợ 64DD
  • Các game homebrew N64 và ROM hack tương thích với phần cứng thật vẫn tiếp tục được phát hành
    • Smash Remix, cung cấp 30 đấu sĩ
    • Peach's Fury, dự án viết lại engine Mario 64

2 bình luận

 
GN⁺ 2024-05-16
Ý kiến trên Hacker News
  • Để dùng công cụ này, trước hết vẫn phải dịch ngược mã máy ROM và thêm rất nhiều chú thích để có thể biên dịch lại
    Bản thân công cụ thì rất tuyệt, nhưng những lời thổi phồng kiểu gần như biến một ROM bất kỳ thành tệp thực thi độc lập chỉ với một cú nhấp có vẻ hơi quá đà

    • Dù vậy, N64 không như PS2 hay Game Boy mà chỉ có 388 game phát hành, nên việc cho toàn bộ các game đã phát hành đi qua quy trình này rồi sắp xếp lại có vẻ vẫn khả thi trong thực tế
    • Có vẻ điều đó không đúng
      Trong video của bài đăng, họ biên dịch lại một game N64 không nêu tên và nó chạy tốt, cũng không có vẻ cần chú thích riêng nào
    • Công việc đó chỉ cần làm một lần rồi lưu ở đâu đó để chia sẻ là được
      ROM đúng nghĩa là chỉ đọc, nên có thể làm theo kiểu đưa ROM vào rồi nhận bản port native
    • Tôi không hiểu vì sao nhất thiết phải dịch ngược mã ROM trước và thêm nhiều chú thích
      chuyển đổi nhị phân sang nhị phân có vẻ trực quan hơn, và cũng có lẽ không cần con người can thiệp
    • Tôi tò mò quy trình đó cụ thể là gì, và liệu có thể xử lý một phần bằng ChatGPT hay không
  • Thật sự rất ngầu
    Nhiều công cụ nền tảng được tạo ra cho việc decompile N64 đang lan sang các gói decompile cho hệ thống khác
    Gần đây tôi thấy https://decomp.me/ hỗ trợ decompile cộng tác cho nhiều hệ thống, với các SDK liên quan và preset phần cứng
    Có lẽ trong vài năm tới xu hướng này sẽ xuất hiện ở nhiều hệ thống hơn nữa

  • Tôi đã thấy thứ này khi nó mới xuất hiện, và với góc nhìn của người không theo mảng ROM hacking, tôi thắc mắc vì sao cách tiếp cận này lại ra đời muộn đến vậy
    Việc dịch lệnh assembly sang C rồi biên dịch lại trông như một cách khá hiển nhiên đáng ra phải được thử từ sớm, nên tôi muốn biết trước đây có gì khiến nó bất khả thi và gần đây đã có đột phá nào khác để làm nó khả thi hay không

    • N64 có GPU khác với GPU hiện đại, và để render đồ họa thì cần chính GPU đó
      Tôi lướt qua kho GitHub thì có vẻ họ dùng rt64 nội bộ để hỗ trợ ray tracing(https://github.com/rt64/rt64)
      rt64 dùng kỹ thuật ubershader để mô phỏng GPU, và bài viết rất hay này giải thích ubershader là gì, vì sao nó cần thiết và mức độ điên rồ của nó: https://dolphin-emu.org/blog/2017/07/30/ubershaders/
    • Các trình giả lập khác cố giải quyết vấn đề theo cách tổng quát, còn lời giải này thì không hoàn toàn như vậy
      Tái biên dịch tĩnh từ một mã máy sang ngôn ngữ khác là việc trong thực tế rất khó, hoặc nhìn chung là nằm ở ranh giới bất khả thi [1]
      Để làm kiểu tái biên dịch này cho ra hồn, còn cần phía nhị phân hỗ trợ sao cho việc tái biên dịch dễ hơn [2], và bên trên đó còn cần các bản vá để làm cho nó chạy được [3]
      Tái biên dịch động không gặp các vấn đề này, nên nếu đưa vào nhị phân gốc và tài nguyên, tức ROM, thì thường có thể tạo ra phần mềm giả lập được
      Có khá nhiều nhầm lẫn về mức độ tổng quát của lời giải này
      Xét ở khía cạnh giảm khối lượng công việc, giúp việc tái biên dịch hay port trở nên dễ hơn rất nhiều, thì nó cực kỳ ấn tượng và rất đáng giá, nhưng không thay thế nhu cầu đối với trình giả lập truyền thống
      [1]: https://cs.stackexchange.com/questions/155511/why-is-static-...
      [2]: Nhị phân game N64 có thể tình cờ tránh được nhiều yếu tố khiến việc tái biên dịch tĩnh nói chung trở nên khó khăn, nên điều đó có thể giúp ích cho cách tiếp cận này, nhưng thực ra tôi cũng không rõ
      [3]: Kho tái biên dịch Majora's Mask có rất nhiều bản vá làm thủ công để nó hoạt động: https://github.com/Mr-Wiseguy/Zelda64Recomp
    • Mô phỏng phần cứng thường phải mô phỏng với độ chính xác theo chu kỳ những thứ chạy song song, nên không phải chỉ là bài toán đơn giản xử lý chương trình trong ROM
    • Tôi tự hỏi liệu họ có dùng mã tự sửa đổi hay các yếu tố khác khiến việc này trở nên khó khăn hay không
  • Jamulator đã làm điều này cho NES từ năm 2013, nhưng có vẻ chẳng mấy ai quan tâm
    https://andrewkelley.me/post/jamulator.html
    Cũng có Winlator để chạy chương trình Windows trên Android
    https://github.com/brunodev85/winlator
    Và video YouTube được liên kết trong bài có dùng giọng nói AI không?

    • Ít nhất thì Mr WiseGuy có vẻ có quan tâm
      Trong kho GitHub N64Recomp[0] có viết như sau:
      "This is not the first project that uses static recompilation on game console binaries. A well known example is jamulator, which targets NES binaries."
      [0]: https://github.com/Mr-Wiseguy/N64Recomp
    • Jamulator không thành công vì trong cartridge có quá nhiều phần cứng bổ sung
      Trong tình huống như vậy, tái biên dịch chỉ làm mọi thứ phức tạp hơn mà lợi ích không lớn
      N64 có phần cứng cố định nên dễ hơn đôi chút
      Dù vậy, dự án này vẫn đang dùng giả lập cho RDP
      Tôi không rõ họ xử lý microcode RSP được tạo ra như thế nào, và có lẽ là không xử lý
      Nhiều game chỉ dùng thư viện chính thức
    • Jamulator chưa đi xa hơn những gì trình giả lập NES có thể làm, ngoài cách nó chạy
      Nếu Jamulator ra mắt cùng các cải tiến tương tự cho Zelda thì hẳn đã nổi tiếng hơn nhiều
      Có vẻ sự quan tâm đến nhiều hơn từ chuyện giờ có thể làm gì với cách tiếp cận đó, hơn là từ bản thân cách tiếp cận
      Phần lời dẫn trong video đơn giản là do một người thật tên Nerrel thực hiện
      Khá đáng ngạc nhiên theo một cách thú vị là giọng AI giờ đã hay đến mức chúng ta lại nghi ngờ là AI khi ai đó không nói theo kiểu mà ta mong đợi
    • Chỉ là Nerrel thôi
      Giọng thuyết minh vốn khá đều đều nên từ trước đến nay đã nghe giống AI, và tôi thích cảm giác nó hòa với chất hài hước
  • Sẽ thật tuyệt nếu mọi tệp thực thi game đều độc lập với hệ điều hành, kiểu giống WebAssembly
    Ví dụ như một thứ kiểu GameAssembly
    Giờ trên macOS mới thì không thể chơi game 32-bit nữa, và trong Wine cũng không chạy được game Windows 32-bit
    Gần như không thể tìm được tệp .exe 64-bit có thể chạy ổn trong Wine/Crossover

    • Với game, mã chạy trên CPU thực ra có thể xem là vấn đề tương đối nhỏ
      Trong trường hợp console, nhất là các tựa cũ và game độc quyền nền tảng, chúng thường phụ thuộc vào chi tiết triển khai GPU ở mức rất thấp
      Các console cũ hơn còn có thêm những chip chuyên dụng làm các việc quan trọng ngoài I/O đơn giản
      Ví dụ, chip âm thanh của SNES là một CPU hoàn toàn độc lập, chạy chương trình nhỏ riêng của nó song song với CPU và GPU
      Tất nhiên, về sau ta có thể bắt buộc mọi hoạt động phát triển game phải dùng máy ảo cấp cao, nhưng nếu xét đến việc thông số phần cứng console là cố định thì nó sẽ không có sức cạnh tranh với các tựa game muốn tận dụng đồ họa hiện đại
    • Tôi đồng ý với tinh thần đó, nhưng tôi đã chạy game Windows 32-bit trên x86_64 Linux khá ổn thỏa
      Trên Debian, tôi phải chạy
      dpkg --add-architecture i386 && apt-get update
      Sau đó chỉ cần cài gói wine32
    • Để làm game có thể port được, chỉ cung cấp mã máy có thể port là chưa đủ
      Game cần nhiều API khác nhau như API đồ họa, API cửa sổ, API đầu vào, API âm thanh, API đĩa...
      Đôi khi còn cần cả module kernel vì chống gian lận hoặc chống sao chép
      Điều đáng tiếc là các hệ điều hành mã nguồn mở không cố gắng cung cấp một tập API chung để nhà phát triển chỉ cần viết và kiểm thử mã một lần rồi chạy ở mọi nơi
      Có Flatpak, nhưng theo hiểu biết của tôi thì nó giống việc đóng gói một bản phân phối Linux vào trong máy ảo mà không có đặc tả hay tài liệu, hơn là cung cấp một tập API
      Nó khá xấu xí, và cũng không tương thích với các hệ điều hành nhỏ không phải Linux
    • Ngay cả Wine trên Mac, kể cả trên Apple Silicon, cũng từng chạy được game Windows 32-bit
      Tôi đã chạy GTA IV trên M1 mini
      Có vẻ trong bản Wine 32-bit mà PlayOnMac cài vào có một dạng giả lập "32 trên 64", nhưng rất khó tìm kiếm nên tôi không biết thực sự nó hoạt động như thế nào
      Thật thú vị khi Mac lại tương thích với các chương trình Windows cũ tốt hơn cả các chương trình Mac cũ
    • JVM làm điều này khá tốt với Minecraft
      Nếu không có JVM thì tôi nghi ngờ liệu Minecraft có hỗ trợ Linux, các hệ BSD và những nền tảng tương tự hay không
      Bedrock Edition, tức bản không dùng JVM, hỗ trợ Windows, console và điện thoại, nhưng lại không hỗ trợ macOS dù rõ ràng là có thể làm được
  • Cuối cùng nếu cái này chạy được trên Linux nữa thì sẽ rất tuyệt, vì như vậy có thể chơi game N64 ổn định trên các thiết bị cầm tay cấu hình rất thấp
    N64 vốn nổi tiếng là rất khó giả lập, nhưng nếu build native cho từng nền tảng thì vấn đề hiệu năng sẽ biến mất

    • Gần như chắc chắn Linux sẽ được hỗ trợ native thông qua N64Recomp: https://github.com/Mr-Wiseguy/N64Recomp
      Có thể xem ví dụ tại đây: https://github.com/Mr-Wiseguy/Zelda64Recomp?tab=readme-ov-fi...
    • Tôi không ngờ N64 lại khó giả lập đến vậy
      Tôi không rành chi tiết về giả lập N64, nhưng từ đầu những năm 2010 tới giờ tôi vẫn chạy trình giả lập N64 hoàn hảo
      Chủ yếu tôi chỉ chơi các game kinh điển nổi tiếng, nên không rõ hiệu năng với các tựa game ngách hơn thế nào
    • Tôi đã thử trực tiếp trên PC Ubuntu và nó chạy rất tốt
      Chơi khoảng một tiếng mà không gặp vấn đề gì
    • Vài ngày trước tôi đã xem video YouTube mà bài này dẫn tới, trong đó có nhắc đến hỗ trợ Linux và đặc biệt là nói rằng nó cũng nên dùng được trên Steam Deck
    • Nó đã chạy trên Linux rồi
      Tôi đã tự kiểm thử
  • Cái này có thể khá hữu ích cho các game như GoldenEye
    Chúng vốn giả định kiểu nhập liệu joystick kỳ quặc nên rất khó chơi trên PC, vì vậy sẽ rất hay nếu có một bản port GoldenEye native với thao tác chuột bình thường như các game FPS khác

    • WASD và ngắm bằng chuột thực ra không hợp với game đó lắm
      Cách chuyển chế độ khi ngắm bắn và khoảng thời gian con trỏ di chuyển rồi quay lại giữa màn hình là một phần thú vị của game
      Nếu có thể vừa chạy vừa tự do ngắm như FPS trên PC, tôi nghĩ phần chơi chiến dịch sẽ bị phá hỏng vì nó được thiết kế dựa trên tiền đề đó
      Việc chọn chỗ dừng lại để ngắm và giữ bình tĩnh khi đang nhắm bắn chính là điểm hấp dẫn
      Tuy vậy, nếu vẫn giữ cách chuyển chế độ, và chuột 1) xoay Bond như trục trái-phải của cần analog và 2) chỉ điều khiển con trỏ khi giữ R để vào "chế độ ngắm", thì có thể sẽ khá vui
      Thành thật mà nói tôi thấy tiếc vì các game bắn súng đều nhanh chóng đi thẳng tới kiểu Quake với WASD+chuột và ngắm tự do
      Kiểu chuyển chế độ đó tạo cho GoldenEye cảm giác vật lý mà tôi rất thích
    • Có bản hack trình giả lập để thêm hỗ trợ WASD+chuột cho GoldenEye, và tôi nghe nói nó hoạt động rất tốt
      https://github.com/Graslu/1964GEPD/releases/tag/latest
    • Nhưng chẳng phải nó vẫn sẽ trông đợi kiểu joystick kỳ quặc đó sao?
    • Bản hack chuột+WASD hoạt động cực kỳ tốt
      Nó cũng chạy với Perfect Dark
  • Khá thú vị, nhưng tôi tự hỏi liệu điều này có thể dẫn tới một phiên bản Conker chạy đúng trên MiSTer hay không
    Ví dụ có thể dùng cái này để hỗ trợ decompile, rồi ai đó làm ra một bản chỉnh sửa được không?

  • Tôi muốn biết ưu điểm của nó so với trình giả lập là gì
    Chẳng phải cuối cùng nó chỉ là một dạng trình giả lập đã dịch trước hay sao?
    Kiểu này trước đây cũng từng có với những thứ như Bleem, và đúng là có thể có lợi thế về hiệu năng, nhưng trên PC hiện đại thì một trình giả lập tốt nhìn chung vẫn chạy ổn
    https://en.wikipedia.org/wiki/Bleem!

    • Mục tiêu của dự án này và mục tiêu của giả lập N64 khá khác nhau
      Mục tiêu của trình giả lập N64 thường là tái hiện chính xác hành vi của máy console gốc
      Ngược lại, cũng có rất nhiều người muốn chơi SM64, OOT, MM ở 60fps, màn hình rộng, texture pack, randomizer và nhiều cải tiến đồ họa khác
      Với những người này, việc các game đó ban đầu chạy trên N64 thực tế không còn quan trọng
      Thậm chí còn gần như là một trở ngại
      Pipeline đồ họa của N64 rất phiền phức để giả lập và tích cực cản trở các cải tiến hiện đại
      Dự án này có vẻ tập trung hơn vào việc xử lý chính bản thân game theo hướng hiện đại, và loại hoàn toàn các yếu tố lấy N64 làm trung tâm ra khỏi bài toán
    • Giả lập JIT có thể gây ra giật khựng, còn AOT thì có lẽ sẽ không
      Bây giờ máy tính đã nhanh hơn N64 rất nhiều nên có thể khác biệt không còn dễ nhận ra nữa
    • Trong video họ cho thấy cách này loại bỏ được nhiều lỗi so với giả lập
    • Recompile không phải là giả lập
  • Các trình giả lập thông thường có biên dịch sẵn trước không, hay là dùng JIT?
    Nếu không thì tôi tò mò tại sao lại không làm
    Cách tiếp cận này, tức biên dịch trước, có vẻ có lợi thế lớn

    • Dù bạn nêu tên kỹ thuật biên dịch hay thông dịch nào đi nữa thì cũng có ít nhất một trình giả lập dùng nó
    • Khá nhiều trình giả lập từ thế hệ 32-bit trở về sau dùng tái biên dịch JIT
      Tuy vậy, trừ khi TeknoParrot hoạt động theo kiểu đó thì tôi không rõ về dịch trước
      Ví dụ với TeknoParrot, bạn có thể chạy game arcade Linux dùng ELF binary trên Windows, nhưng vì kiến trúc là như nhau nên tôi cũng không gọi đó là giả lập theo nghĩa nào cả
    • Có nhiều kiểu giả lập khác nhau, nhưng chạy thông dịch có lẽ là phổ biến nhất, hoặc ít nhất là rất phổ biến
      Chạy thông dịch là cách viết một máy ảo biểu diễn trạng thái của nhiều phần khác nhau trong hệ thống, rồi thực thi các lệnh thay đổi trạng thái đó với các mức độ chính xác khác nhau
 
lifeisliving 2024-05-18

Đúng là sức mạnh của dân đam mê! Không chỉ gắn thêm trình biên dịch JIT cho trình giả lập, giờ còn có thể dùng binary lifting để chuyển sang C rồi biên dịch lại thành bản port PC native