
Wine 11 viết lại cách Linux chạy các trò chơi Windows trên kernel với tốc độ tăng đáng kể
Wine 11 rewrites how Linux runs Windows games at kernel with massive speed gains
Wine 11 có một đợt "lột xác" lớn ở phần kernel-level Windows application compatibility, đáng chú ý nhất là sự bổ sung NTSYNC đã được mong đợi từ lâu. Tính năng này giúp tăng hiệu suất đáng kể cho rất nhiều game. Bản phát hành này còn mang đến một cuộc "đại tu" toàn bộ kiến trúc WoW64 và một Wayland driver hoàn thiện hơn, khắc phục những điểm yếu cốt lõi trước đây. Đối với developer, điều này có nghĩa là những game trước đây phải dùng "chiêu trò" để xử lý synchronization giờ đây có thể chạy nhanh hơn "vũ bão" trên Linux. Những cải tiến này sẽ trực tiếp được áp dụng vào các dự án như Proton và SteamOS.
Tôi là Adam Conway, một người Ireland đam mê công nghệ với bằng Cử nhân Khoa học Máy tính và tôi là Trưởng nhóm XDA...
Tôi là Adam Conway, một người Ireland đam mê công nghệ, có bằng Cử nhân Khoa học Máy tính và tôi là Trưởng nhóm Biên tập Kỹ thuật của XDA. Luận án Cử nhân của tôi được thực hiện dựa trên tính khả thi của việc đánh giá các yếu tố phi chức năng của ứng dụng Android và điện thoại thông minh, chẳng hạn như hiệu suất. Tôi đã làm việc trong ngành công nghệ theo cách này hay cách khác kể từ năm 2017.
Trong thời gian rảnh rỗi, bạn có thể sẽ thấy tôi chơi Counter-Strike hoặc VALORANT và bạn có thể liên hệ với tôi tại adam@xda-developers.com , trên Twitter với tên @AdamConwayIE, trên Instagram với tên adamc.99 hoặc u/AdamConwayIE trên Reddit.
Đăng nhập vào tài khoản XDA của bạn
Chơi game trên Linux đã đi được một chặng đường dài. Khi Valve ra mắt Proton vào năm 2018, nó giống như một bước ngoặt, biến trải nghiệm chơi trò chơi Linux từ "có thể thực hiện được về mặt kỹ thuật nếu bạn thấy ổn với nhiều khó khăn" thành một thứ ít nhiều hoạt động. Kể từ đó, chúng tôi đã thấy các bản phát hành Wine tăng dần, mỗi bản phát hành đều giải quyết các vấn đề về khả năng tương thích và cải thiện hiệu suất từng chút một. Rượu 10, Rượu 9, v.v.; mỗi phiên bản là một tập hợp các bản sửa lỗi và cải tiến nhỏ giúp hệ sinh thái luôn phát triển.
Wine 11 thì khác. Đây không chỉ là một bản phát hành hàng năm với hàng trăm bản sửa lỗi và một số cải tiến về khả năng tương thích. Nó đại diện cho một số lượng lớn các thay đổi và sửa lỗi. Tuy nhiên, nó cũng được hỗ trợ NTSYNC, đây là một tính năng đã được phát triển và viết lại trong nhiều năm về cách Wine xử lý một trong những hoạt động nhạy cảm nhất với hiệu suất trong trò chơi hiện đại. Trên hết, quá trình đại tu kiến trúc WoW64 cuối cùng cũng đã hoàn tất, trình điều khiển Wayland đã phát triển hơn rất nhiều và có một danh sách lớn các cải tiến nhỏ hơn khiến cho dự án này có cảm giác giống như một dự án hoàn toàn mới.
Tôi phải nói rõ: không phải trò chơi nào cũng sẽ có sự khác biệt giữa ngày và đêm. Một số tựa game sẽ chạy giống hệt như trước. Nhưng đối với những trò chơi được hưởng lợi từ những thay đổi này, mức cải tiến từ đáng chú ý đến vô lý. Và bởi vì Proton, SteamOS và mọi dự án hạ nguồn đều được xây dựng dựa trên Wine nên những lợi ích đó sẽ đến với mọi người.
Tất cả mọi thứ cho đến bây giờ là một cách giải quyết
Esync và fsync đã hoạt động nhưng chúng không lý tưởng
Nếu bạn đã từng điều chỉnh cài đặt Wine hoặc Proton thì có thể bạn đã từng gặp các thuật ngữ "esync" và "fsync" trước đây. Có thể bạn đã bật chúng trong Lutris hoặc nhận thấy chúng trong các tùy chọn khởi chạy Proton mà không hiểu đầy đủ về chức năng của chúng. Để hiểu tại sao NTSYNC lại quan trọng, bạn cần hiểu vấn đề mà tất cả các giải pháp này đều cố gắng giải quyết.
Các trò chơi Windows, đặc biệt là các trò chơi hiện đại, rất đa luồng. CPU của bạn không chỉ chạy một việc một lúc mà thay vào đó, nó thực hiện các công việc kết xuất, tính toán vật lý, truyền nội dung, xử lý âm thanh, quy trình AI, v.v., tất cả đều song song trên nhiều luồng. Các chủ đề này cần phải phối hợp với nhau liên tục. Một luồng có thể cần đợi một luồng khác tải xong kết cấu trước khi nó có thể hiển thị khung. Một cái khác có thể cần quyền truy cập độc quyền vào một tài nguyên được chia sẻ để hai luồng không cố gắng sửa đổi nó cùng một lúc.
Windows xử lý sự phối hợp này thông qua cái được gọi là nguyên thủy đồng bộ hóa NT... mutexes, semaphores, sự kiện và những thứ tương tự. Chúng được nhúng sâu vào nhân Windows và các trò chơi dựa vào chúng rất nhiều. Vấn đề là Linux không có các phiên bản gốc tương đương hoạt động giống hệt nhau. Trước đây, Wine đã phải mô phỏng các cơ chế đồng bộ hóa này và cách nó làm như vậy, nói một cách đơn giản, không lý tưởng.
Cách tiếp cận ban đầu liên quan đến việc thực hiện lệnh gọi RPC khứ hồi tới một quy trình "kernel" chuyên dụng được gọi là wineserver mỗi khi trò chơi cần đồng bộ hóa giữa các luồng. Đối với một trò chơi thực hiện hàng nghìn lệnh gọi như vậy mỗi giây, chi phí đó tăng lên nhanh chóng và trở thành nút thắt cổ chai. Và đó là một nút thắt cổ chai biểu hiện dưới dạng hiện tượng giật khung hình tinh vi, tốc độ khung hình không nhất quán và các trò chơi khiến bạn cảm thấy hơi lệch ngay cả khi số FPS thô có vẻ ổn.
Esync là nỗ lực đầu tiên nhằm giải quyết vấn đề này. Được phát triển bởi Elizabeth Figura tại CodeWeavers, nó sử dụng lệnh gọi hệ thống eventfd của Linux để xử lý việc đồng bộ hóa mà không cần thoát qua máy chủ rượu. Nó hoạt động và có ích, nhưng nó có một số vấn đề. Một số bản phân phối gặp vấn đề với giới hạn bộ mô tả tệp, vì mọi đối tượng đồng bộ hóa đều cần bộ mô tả tệp riêng và các trò chơi mở nhiều trong số chúng có thể đạt mức trần của hệ thống khá nhanh.
Fsync xuất hiện tiếp theo, sử dụng futexes của Linux để có hiệu suất tốt hơn nữa. Nó nhanh hơn esync trong hầu hết các trường hợp, nhưng nó yêu cầu các bản vá nhân ngoài cây chưa bao giờ được đưa vào nhân Linux dòng chính hoặc ngược dòng Wine ra khỏi hộp. Điều đó có nghĩa là bạn cần một kernel tùy chỉnh hoặc được vá để sử dụng nó, điều này phù hợp với những người đam mê chạy CachyOS hoặc Proton-GE, nhưng không thể truy cập chính xác đối với người dùng bình thường trên Ubuntu hoặc Fedora. Futex2, thường được gọi thay thế cho nhau bằng fsync, đã đưa nó vào nhân Linux 5.16 dưới dạng futex_waitv, nhưng cách triển khai ban đầu của fsync thì không như vậy. Fsync đã sử dụng futex_wait_multiple và Futex2 đã sử dụng futex_waitv. Tuy nhiên, các ứng dụng như Lutris vẫn gọi nó là Fsync. Đó vẫn là loại fsync, nhưng không phải là fsync gốc.
Đây là vấn đề về cả esync và fsync: chúng là giải pháp thay thế. Những cách thông minh hơn nhưng vẫn có cách giải quyết. Họ đã ước tính hành vi đồng bộ hóa NT bằng cách sử dụng các nguyên mẫu Linux không được thiết kế cho công việc và một số trường hợp đặc biệt nhất định không thể được xử lý chính xác. Các hoạt động như NtPulseEvent() và chế độ "chờ tất cả" trong NtWaitForMultipleObjects() yêu cầu kiểm soát trực tiếp các hàng đợi cơ bản theo cách mà việc triển khai không gian người dùng không thể cung cấp một cách đáng tin cậy.
NTSYNC làm lại mọi thứ
Đồng bộ hóa ở cấp hạt nhân, thay vì ở không gian người dùng
NTSYNC có cách tiếp cận hoàn toàn khác. Thay vì cố gắng áp dụng hành vi đồng bộ hóa Windows vào các nguyên thủy Linux hiện có, nó bổ sung thêm trình điều khiển hạt nhân mới để lập mô hình trực tiếp API đối tượng đồng bộ hóa Windows NT. Nó hiển thị một thiết bị /dev/ntsync mà Wine có thể nói chuyện và chính kernel xử lý việc phối hợp. Không còn các chuyến đi khứ hồi đến máy chủ rượu vang, không còn các phép tính gần đúng nữa và quá trình đồng bộ hóa diễn ra trong hạt nhân, đó là nơi cần có. Và nó có khả năng quản lý hàng đợi phù hợp, ngữ nghĩa sự kiện phù hợp và các hoạt động nguyên tử phù hợp.
Điều khiến điều này thậm chí còn tốt hơn là NTSYNC được phát triển bởi chính người đã tạo ra esync và fsync ngay từ đầu. Elizabeth Figura đã giải quyết vấn đề này trong nhiều năm, lặp đi lặp lại nhiều bản sửa đổi bản vá nhân, trình bày công việc tại Hội nghị Thợ sửa ống nước Linux vào năm 2023 và thử nghiệm nhiều phiên bản của bộ bản vá trước khi cuối cùng nó được sáp nhập vào nhân Linux chính thống với phiên bản 6.14.
Các con số thật hoang dã. Trong điểm chuẩn dành cho nhà phát triển, Dirt 3 đã tăng từ 110,6 FPS lên 860,7 FPS, mức cải thiện ấn tượng là 678%. Resident Evil 2 đã tăng từ 26 FPS lên 77 FPS. Call of Juarez tăng từ 99,8 FPS lên 224,1 FPS. Tiny Tina's Wonderlands đã tăng từ 130 FPS lên 360 FPS. Ngoài ra, Call of Duty: Black Ops I hiện thực sự cũng có thể chơi được trên Linux. Những điểm chuẩn đó so sánh Wine NTSYNC với Wine vani ngược dòng, có nghĩa là không có fsync hoặc esync. Những game thủ sử dụng fsync sẽ không thấy hiệu suất tăng vọt như vậy trong hầu hết các trò chơi.
Những trò chơi được hưởng lợi nhiều nhất từ NTSYNC là những trò chơi gặp khó khăn trước đây, chẳng hạn như những tựa game có khối lượng công việc đa luồng nặng nề trong đó chi phí đồng bộ hóa thực sự là một nút thắt cổ chai. Đối với những trò chơi đó, sự khác biệt là ngày và đêm. Và không giống như fsync, NTSYNC nằm trong nhân dòng chính, nghĩa là bạn không cần bất kỳ bản vá tùy chỉnh hoặc mô-đun ngoài cây nào để nó hoạt động. Bất kỳ hạt nhân vận chuyển phân phối nào 6.14 trở lên, tại thời điểm này bao gồm Fedora 42, Ubuntu 25.04 và các bản phát hành gần đây hơn, sẽ hỗ trợ nó. Valve đã thêm trình điều khiển hạt nhân NTSYNC vào SteamOS 3.7.20 beta, tải mô-đun theo mặc định và một nhánh Proton không chính thức, Proton GE, đã kích hoạt nó. Khi Proton chính thức của Valve khởi động lại trên Wine 11, mọi chủ sở hữu Steam Deck đều nhận được điều này miễn phí.
Tất cả những điều này khiến NTSYNC trở thành một vấn đề lớn, vì nó không chỉ đơn giản là một bản vá hiệu năng thông thường. Thay vào đó, nó là một điều gì đó lớn hơn nhiều: đây là lần đầu tiên quá trình đồng bộ hóa của Wine chính xác ở cấp hạt nhân, được triển khai trong nhân Linux dòng chính và có sẵn cho tất cả mọi người mà không cần vượt qua nhiều vòng.
WoW64 cuối cùng đã hoàn thành
Ngay cả các ứng dụng 16 bit cũng hoạt động
Nếu NTSYNC là tính năng nổi bật thì việc hoàn thiện kiến trúc WoW64 của Wine là sự thay đổi sẽ âm thầm cải thiện cuộc sống của mọi người trong tương lai. Trên Windows, WoW64 (Windows 32-bit trên Windows 64-bit) là hệ thống con cho phép các ứng dụng 32-bit chạy trên hệ thống 64-bit. Wine đã nỗ lực hướng tới việc triển khai điều này trong nhiều năm và Wine 11 đánh dấu thời điểm nó chính thức được thực hiện.
Điều này có nghĩa là trong thực tế, bạn không còn cần cài đặt thư viện hệ thống 32 bit trên hệ thống Linux 64 bit để chạy các ứng dụng Windows 32 bit. Wine xử lý bản dịch nội bộ, sử dụng một hệ nhị phân thống nhất duy nhất tự động phát hiện xem nó đang xử lý tệp thực thi 32 bit hay 64 bit. Rất may, những ngày xưa của việc cài đặt các gói multilib, định cấu hình ia32-lib hoặc đấu tranh với các phần phụ thuộc 32 bit trên bản phân phối 64 bit của bạn đã qua rồi.
Điều này nghe có vẻ giống như một sự cải thiện nhỏ về chất lượng cuộc sống nhưng đó là một khổng lồ công việc kỹ thuật. Chế độ WoW64 hiện xử lý ánh xạ bộ nhớ OpenGL, truyền qua SCSI và thậm chí hỗ trợ ứng dụng 16 bit. Có, 16-bit! Nếu bạn có phần mềm Windows cổ từ những năm 90 mà bạn cần chạy vì bất kỳ lý do gì thì Wine 11 sẽ đáp ứng được nhu cầu của bạn.
Đặc biệt đối với trò chơi, điều này quan trọng vì một số lượng đáng ngạc nhiên các trò chơi, đặc biệt là các trò chơi cũ hơn, là các tệp thực thi 32-bit. Trước đây, để những thứ này hoạt động thường có nghĩa là phải vật lộn với thiết lập multilib của bản phân phối của bạn, vốn đa dạng về chất lượng và sự dễ dàng tùy thuộc vào việc bạn đang sử dụng Ubuntu, Arch, Fedora hay thứ gì khác hoàn toàn. Bây giờ, Wine sẽ xử lý việc đó cho bạn.
Phần còn lại của Wine 11 không chỉ là chất bổ sung
Ngoài ra còn có nhiều bản sửa lỗi hơn
Thật dễ dàng để NTSYNC và WoW64 chiếm lấy sự chú ý, nhưng Wine 11 lại chứa đầy những thứ khác đáng nói đến.
Người lái xe Wayland đã đi được một chặng đường dài. Hỗ trợ bảng tạm hiện hoạt động hai chiều giữa ứng dụng Wine và Wayland gốc, đây là một trong những điều bạn không nghĩ đến cho đến khi nó không hoạt động và khiến bạn phát điên. Hỗ trợ kéo và thả từ ứng dụng Wayland vào cửa sổ Wine. Các thay đổi về chế độ hiển thị hiện được mô phỏng thông qua tỷ lệ bộ tổng hợp, có nghĩa là các trò chơi cũ cố gắng chuyển sang độ phân giải thấp hơn như 640x480 thực sự hoạt động bình thường thay vì khiến màn hình của bạn bị hỏng. Nếu bạn đang chần chừ trong việc chuyển từ X11 sang Wayland vì lo ngại về khả năng tương thích của Wine thì Wine 11 sẽ loại bỏ rất nhiều rào cản đó.
Về mặt đồ họa, EGL hiện là chương trình phụ trợ mặc định cho kết xuất OpenGL trên X11, thay thế đường dẫn GLX cũ hơn. Hỗ trợ Vulkan đã được chuyển sang API phiên bản 1.4 và có hỗ trợ ban đầu cho việc giải mã H.264 được tăng tốc phần cứng thông qua API video Direct3D 11 sử dụng Vulkan Video. Điều cuối cùng đặc biệt thú vị đối với các trò chơi và ứng dụng sử dụng tính năng phát lại video cho những thứ như đoạn cắt cảnh hoặc phát trực tuyến trong trò chơi.
Hỗ trợ phản hồi lực lượng đã được cải thiện cho bánh xe đua và gậy bay. Đây là một tin tuyệt vời nếu bạn đang chạy thiết lập sim trên Linux. Ngoài ra, Bluetooth đã nhận được trình điều khiển mới với các dịch vụ BLE và hỗ trợ ghép nối thích hợp, khả năng xử lý phông chữ MIDI đã được cải thiện cho nhạc trò chơi cũ và có một số tính năng bổ sung nhỏ như hỗ trợ nén Zip64, hỗ trợ Unicode 17.0.0, quét TWAIN 2.0 cho các ứng dụng 64 bit và chức năng ping IPv6.
Quản lý ưu tiên luồng đã được cải thiện trên cả Linux và macOS, giúp nâng cao hiệu suất ứng dụng đa luồng ngoài lợi ích của NTSYNC. Các thiết bị ARM64 hiện có thể mô phỏng kích thước trang 4K trên các hệ thống có trang gốc lớn hơn, giúp mở ra cơ hội cho phần cứng Wine on Arm. Và với nhiều thiết bị Linux dựa trên Arm xuất hiện hàng năm, điều đó càng trở nên quan trọng hơn trước đây.
Ngoài ra, có rất nhiều bản sửa lỗi. Các trò chơi như Nioh 2, StarCraft 2, The Witcher 2, Call of Duty: Black Ops II, Final Fantasy XI và Battle.net đều nhận được các bản sửa lỗi tương thích cụ thể, bổ sung cho những cải tiến rộng hơn được thực hiện trên bảng nhằm cải thiện hiệu suất và khả năng tương thích trên nhiều tựa game hơn đáng kể.
Wine 11 là một bản phát hành lớn và không chỉ NTSYNC mới làm được điều đó. Chắc chắn, chỉ riêng NTSYNC đã khiến nó đáng được chú ý, nhưng kết hợp với việc hoàn thiện WoW64, các cải tiến của Wayland và vô số bản sửa lỗi, đây là bản phát hành Wine quan trọng nhất kể từ khi Proton giúp trò chơi Linux trở nên khả thi. Mọi thứ được xây dựng dựa trên Wine, từ Proton, Lutris đến Bottles, đều trở nên tốt hơn nhờ nó. Nếu bạn chơi trò chơi trên Linux thì Wine 11 rất đáng để bạn dành thời gian dùng thử.
Tác giả: felineflock