DirectX 10 nền tảng đồ họa đa luồng [Phần 1]

icon-computer.jpg Từ khi Vista xuất hiện, bạn nghe nói nhiều đến DirectX 10. Nó hơn gì so với đàn anh DirectX 9 và các bản trước đó? Tại sao các nhà sản xuất phần cứng và game đều đang hướng về nó, Microsoft kỳ vọng vào nó? Và đến lúc này, nó đã làm được gì?

Ta cùng nhìn lại lịch sử của DirectX một chút. Cách đây 13 năm, lúc Windows 95 xuất hiện (1994), các nhà lập trình vẫn còn phát triển game trên nền DOS. Lý do mà các nhà phát triển chuộng DOS hơn Windows 95 là vì trên nền hệ điều hành DOS, họ có thể truy cập trực tiếp đến card đồ họa, màn hình, bàn phím, chuột… trong khi Windows 95 giới hạn điều này. Chính vì vậy, sau khi Windows 95 xuất hiện được vài tháng thì 2 nhà lập trình của Microsoft đưa ra một giải pháp “mở cửa” cho Windows 95, giúp các nhà lập trình dễ dàng phát triển game trên nền Windows 95. Thế là DirectX ra đời vào tháng 9/1995 (bản DirectX 1.0), và qua nhiều lần chỉnh sửa, cho đến tháng 11/2006, Microsoft đã nâng cấp lên phiên bản DirectX 10.0. DirectX 10 được xem là một nền tảng mới hoàn toàn, không mang tính kế thừa từ nền tảng cũ như các phiên bản DirectX trước.

Với một nền tảng mới như vậy, các nhà phát triển, nhất là các nhà phát triển game cũng phải từ bỏ lối cũ, đi theo nền mới này (vì DirectX chủ yếu hướng đến game, ít hỗ trợ các mục đích khác như video, xử lý hình ảnh, nghe nhìn…). Điểm chú ý là DirectX 10 chỉ có trong bản Windows Vista, không chạy trên Windows XP hay các bản Windows cũ khác (để biết được máy tính của bạn đang chạy bản DirectX nào, bạn vào mục Start.Run và gõ vào dxdiag). DirectX 10 cũng tương thích ngược với các ứng dụng chạy nền DirectX cũ. Để có được điều này, DirectX 10 thực chất trong mình nó chứa cả 3 phiên bản: DirectX 9, DirectX 9.0Ex (xem mục “Các thư viện đồ họa đáng chú ý”) và DirectX 10. Tới thời điểm viết bài, dòng card GeForce 8800 của NVIDIA và ATI 2900 XT (R600) của AMD đã hỗ trợ đầy đủ (về phần cứng) tập lệnh đồ họa này. Tuy vậy, các nhà phát triển game hơi chậm chân, hiện vẫn chưa có game nào hỗ trợ đầy đủ DirectX 10 nhưng danh sách từ nay đến cuối năm có khoảng 17 tựa game, xem tại http://www.answers.com/topic/list-of-games-with-directx-10-support.

 

Do đó, bài viết chưa có được những con số thử nghiệm thực tế từ game. Một đổi mới khác là Microsoft không “cặm cụi” làm một mình như các bản DirectX trước, hãng kết hợp với các công ty đồ họa như NVIDIA, ATI (đã được AMD mua lại) để xây dựng nền tảng mới này. Điều này cũng là điều kiện thuận lợi cho các công ty hợp tác vì họ không phải tốn thêm công nghiên cứu sản phẩm của mình để đạt tính tương thích tốt nhất với DirectX 10. Điểm mới của DirectX 10 có thể gói gọn trong 4 thứ: sự xuất hiện của WDDM (Windows Display Driver Model), tập lệnh giao tiếp máy tính API (Application Programming Interface) được chỉnh sửa lại mới hoàn toàn, ống lệnh mới và cuối cùng là bộ bóng đổ Shader Model 4.0 nâng cấp từ Shader Model 3.0. Ta cùng dạo qua 4 thành phần trên, thứ mà Microsoft đã tốn bao nhiêu “chất xám” từ khi DirectX 9.0c “già nua” xuất hiện từ cuối 2004.

icon-computer.jpg Windows Display Driver Model (WDDM)

Bạn có bao giờ chơi cùng lúc 2 game trên một PC chưa? Nếu bạn là thần dân của thể loại MMORPG chắc là đã từng nghe đến chuyện chơi cùng 1 game với 2 account. “Trình độ” hơn nữa, giả sử bạn chơi 2 game song song nhưng với thiết lập độ phân giải màn hình của 2 game đó khác nhau, khi chuyển qua lại giữa 2 game, bạn sẽ khổ sở xem màn hình “nhảy múa” cho dù PC của bạn có thuộc hàng “dữ”. Microsoft giải quyết vấn đề này bằng phát minh WDDM trong DirectX 10, điều khiển cách chạy cùng lúc nhiều ứng dụng 3D. WDDM là kiến trúc trình điều khiển đồ họa chỉ dành cho Vista. Kiến trúc này thay đổi toàn bộ so với kiến trúc trên nền XP. Thực tế, khi chạy với giao diện Aero trong Vista, đây là giao diện 3D hoàn toàn với nhiều ứng dụng 3D chạy cùng lúc. WDDM giúp cho hệ thống của bạn không bị đứng vì đồ họa “tải không nổi” hoặc vì xung đột tài nguyên hệ thống.

Nhờ có WDDM, lần đầu tiên Microsoft đã ảo hóa được phần cứng đồ họa khi đưa ra giải pháp phân luồng cho GPU. Nhờ có WDDM, tài nguyên của GPU được phân bổ đều hơn, xử lý được cùng lúc nhiều ống lệnh. Và ngoài việc chuyên xử lý đồ họa 3D, GPU còn được “chỉ định” chạy những tác vụ khác còn gọi là GP-GPU (General Purpose GPU). Hai hãng đồ họa AMD/ATI và NVIDIA cũng đã tận dụng khả năng xử lý song song này như là công nghệ Close to Metal (AMD giới thiệu hồi tháng 10 năm ngoái) và CUDA (Compute Unified Device Architecture, NVIDIA giới thiệu hồi tháng 2/2007), xem thêm mục “GPGPU -xâm lấn CPU”.

WDDM hiện đã lên phiên bản 2.0 trên nền Windows Vista (trước khi Vista chính thức công bố, WDDM là bản 1.0) và Microsoft đang có kế hoạch tung ra bản nâng cấp WDDM 2.1 (chưa biết thời gian cụ thể, sẽ tung ra cùng với việc nâng cấp DirectX 10.1 xem thêm mục “DirectX 10.1”) và xa hơn nữa sẽ là WDDM 3.0.

Bạn có thể tham khảo danh sách GPU và card đồ họa có hỗ trợ WDDM tại: http://technet.microsoft.com/en-us/windowsvista/aa905088.aspx

Theo Microsoft, tốc độ phát triển của GPU về mặt nào đó cũng đạt được đến định luật Moore, nghĩa là cứ sau mỗi hai năm, tốc độ xử lý của GPU tăng lên gấp đôi. Theo Microsoft, nền WDDM sẽ mang lại 3 thứ: ổn định, tốc độ và an toàn.

icon-computer.jpg Ổn định

Trong XP, trình điều khiển đồ họa khá lớn và phức tạp, điều này chính là nguyên nhân gây mất ổn định cho hệ thống. Các trình điều khiển này đều nằm trọn trong nhân (kernel) hệ điều hành nên khi trình điều khiển gặp trục trặc là toàn bộ hệ thống sẽ bị khởi động lại. Theo số liệu thu thập được của Microsoft, trình điều khiển đồ họa chiếm đến 20% lỗi là treo hệ thống (chúng ta thường gọi bằng thuật ngữ “màn hình xanh chết chóc” trong XP). Còn trong Vista, trình điều khiển WDDM được chia làm 2 phần, Kernel Mode Driver (KMD) và User-Mode Driver (UMD). Phần KMD được lưu trong kernel, chỉ làm những phần việc ở cấp thấp, phần lớn công việc thuộc UMD. Điều này giúp tránh được lỗi đứng máy. Ngoài ra, WDDM có một cơ chế nhận diện lỗi, chỉ cần khởi động lại trình điều khiển mà không cần khởi động cả hệ thống. Một điểm phụ khác là trình điều khiển trong Vista được đơn giản hóa rất nhiều, bỏ đi các đoạn mã hỗ trợ cho nhiều giao tiếp thiết bị khác nhau nên thiết lập của Vista chỉ có một giao tiếp duy nhất. 

icon-computer.jpg Tốc độ

Trước đây, khi một ứng dụng cần đến GPU thì các ứng dụng khác mà GPU đang xử lý đều bị “cho ra rìa”. Lý do đơn giản vì GPU không có khả năng xử lý nhiều ứng dụng cùng lúc. Còn trong Vista, GPU có thể cùng lúc xử lý nhiều tác vụ nhờ vào 2 công nghệ: GPU Memory Manager (cấp phát bộ nhớ video) và GPU Scheduler (phân bổ ứng dụng được xử lý theo mức độ ưu tiên).

icon-computer.jpg An toàn

 

Với bất kỳ nền tảng nào chạy đa tác vụ thì tính ổn định đều được các chuyên gia chú trọng. Một hệ điều hành an toàn phải đảm bảo được nguồn tài nguyên nào đó đang được sử dụng thì nó phải được “cô lập” hoàn toàn – ứng dụng khác không thể truy cập. Hiện thời, đây cũng là yêu cầu bắt buộc của các chương trình đọc phim HD. WDDM cũng được xây dựng trên nguyên tắc này.Để biết thêm chi tiết về WDDM, xem tại: http://msdn2.microsoft.com/en-us/library/aa480220.aspx

 
Ống lệnh đồ họa truyền thống, ở mỗi GPU thay đổi một chút.

icon-computer.jpg API (Application Programming Inteface)

Ngoài WDDM là “hàng mới”, cái tên API đã xuất hiện từ khá lâu trong “ngôn ngữ máy tính”. API có thể xem là ngôn ngữ giao tiếp giữa ứng dụng với hệ điều hành. Nhà lập trình viết các hàm gọi để “móc” với API, API “ra lệnh” cho máy tính làm việc. Có thể xem một API như một module của chương trình để chạy tác vụ nào đó.

Ống lệnh của DirectX 9

Riêng về đồ họa, có nhiều thư viện API mà các nhà phát triển game thường dựa vào, trong đó đáng chú ý nhất là thư viện đồ họa DirectX và OpenGL, ít tên tuổi hơn như DirectDraw, GDI/GDI+. Trong “thư viện” DirectX 10, API được Microsoft hướng theo một hướng đi khác. Lý do chính khiến Microsoft hướng API sang lối khác là capability bit trong API (còn gọi là cap bit). Trước đây, các nhà sản xuất card màn hình tận dụng cap bit để đưa vào sản phẩm của mình những tính năng đồ họa “râu ria” khác (dĩ nhiên họ phải tuân theo nguyên tắc để đảm bảo tính tương thích với DirectX và Shader Model). Cho nên, dù trên nền của NVIDIA hay ATI, các nhà sản xuất card màn hình luôn đưa ra những tính năng phụ mà hãng kia không có. Chính điều này là “địa ngục” đối với các nhà sản xuất game. Họ phải lọc ra cap bit và cấu hình của mỗi GPU để đảm bảo game của họ hỗ trợ đúng tính năng, đúng card đồ họa. Nên không ngạc nhiên gì khi bạn thấy game này hỗ trợ tính năng kia, mà tính năng kia chỉ có trên loại card đồ họa nọ. Thật nhức đầu! Nhưng với DirectX 10, các nhà phát triển game loại bỏ được rắc rối này.

Đây cũng là lý do khi mà các nhà phát triển game “khoái” viết game cho hệ console hơn cho PC, vì cấu hình từng thế hệ console rất ít thay đổi.Chuyện tất yếu khi bỏ đi cap bit là NVIDIA, AMD/ATI và các nhà sản xuất chip đồ họa cũng thay đổi cách phát triển GPU. Họ tìm cách khác để đẩy công nghệ sản xuất GPU lên, đưa ra nhiều công nghệ mới cho game. Nhưng cho dù nếu có nhiều công nghệ mới trên nền DirectX 10 xuất hiện thì nhà phát triển game cũng không còn vướng phải rắc rối như trước nữa. Và một điều nữa là các công nghệ đồ họa dựa trên API sẽ rất ít, thậm chí không còn nữa vì Microsoft đã “ cấm cửa” cap bit của API rồi.Hơn nữa, API trong DirectX 10 có nhiều khả năng mới hơn, nhưng trước hết, ta hãy xem khiếm khuyết của DirectX 9.0c. Số lượng vật thể (cây cối, bàn ghế, súng ống…) được render bị giới hạn vì API chỉ có thể vẽ được một số lượng nhất định, cụ thể là khoảng 500 vật thể khác nhau trong một khung hình.

Do đó, nhà phát triển không thể tạo một bãi cỏ mà từng cọng cỏ có chuyển động riêng được nên bạn chỉ có thể thấy được một mảng cỏ giống hệt nhau, chuyển động y như nhau, có chăng là mỗi cọng cỏ có một chút khác biệt về sắc độ màu. Điều này không phải vì nhà phát triển không có khả năng nhưng vì do giới hạn của API và tải CPU. Họ luôn phải nhức đầu trong việc cân bằng tải giữa chất lượng hình ảnh game và CPU. Sang bản DirectX 10, API được thiết kế lại, dựa trên kiến trúc WDDM, có tốc độ xử lý mới, cách thức tiếp cận mới và nhất là khả năng ảo hóa bộ nhớ GPU, không còn bị quá tải và “nhờ vả” nhiều đến CPU nữa.

So với DirectX 9, API của DirectX 10 có những khả năng mới như:

• Xử lý song song, mở rộng và thu hẹp dữ liệu trong quá trình đổ bóng hình học (geometry shader)

• Xuất dữ liệu bóng đỉnh sang bộ nhớ trong quá trình stream output • Giảm tải cho CPU trong các tác vụ như validation, xử lý tiến trình và trình điều khiển• Các loại tài nguyên mới (ví dụ như mảng vân (texture) bóng đổ có chỉ mục) và các định dạng tài nguyên• Tổng hợp tài nguyên trong bộ nhớ nhiều hơn và cấp phát tài nguyên cho một ứng dụng duy nhất ở một thời điểm• Bỏ cap bit• API được xây dựng theo dạng lớp, khởi đầu là lớp có chức năng cơ bản ở gốc, các lớp sau tùy chọn do các nhà phát triển hỗ trợ (layered runtime)• Tăng lượng đối tượng được render, không giới hạn chiều dài bóng đổ.

Vì đơn giản hóa API nên DirectX 10 chỉ chạy được với GPU có hỗ trợ DirectX 10. Thư viện API gọn nhẹ hơn cũng có nghĩa giảm thiểu được thời gian GPU gửi lệnh, dữ liệu… Vì thế, API yêu cầu ít nguồn lực CPU hơn trên mỗi lệnh nên có thể tăng số lệnh và có thể tăng tính phức tạp của khung hình cần render.

icon-source.jpg PCW VN

~ bởi nguyenvu trên Tháng Mười 18, 2007.

3 bình luận to “DirectX 10 nền tảng đồ họa đa luồng [Phần 1]”

  1. Bài viết khá đầy đủ thông tin nhưng mới ở mức định tính là chủ yếu. Chắc thiếu số liệu thực tế và chưa muốn phân tích kỹ nên không mang lại gì nhiều về mặt định lượng.

  2. Mình cũng nghĩ vậy, nhưng số liệu là thứ mà ta phải mua, nhất là trong trường hợp này 😀

  3. Quá hay dù tớ là dân ngoại đạo.

Bình luận về bài viết này