Di chuyển từ RenderScript

Stay organized with collections Save and categorize content based on your preferences.

API RenderScript sẽ không còn được dùng nữa kể từ phiên bản Android 12. Các API này sẽ tiếp tục hoạt động, nhưng nhà sản xuất thiết bị và thành phần sẽ từng bước ngừng cung cấp dịch vụ hỗ trợ tăng tốc phần cứng. Để tận dụng tối đa tính năng tăng tốc GPU, bạn nên di chuyển tập lệnh của mình sang Vulkan hoặc sử dụng bộ công cụ thay thế của chúng tôi để di chuyển khỏi hàm nội tại.

Sau khi RenderScript trong nền tảng Android không được sử dụng nữa, chúng tôi cũng sẽ ngừng hỗ trợ RenderScript trong trình bổ trợ Android cho Gradle. Kể từ trình bổ trợ Android cho Gradle 7.2, API RenderScript không được dùng nữa. Các API đó sẽ vẫn hoạt động nhưng kết quả trả về khi gọi sẽ là các lời nhắc nhở và sẽ bị xoá hoàn toàn trong các phiên bản AGP sau này. Hướng dẫn này giải thích cách di chuyển từ RenderScript.

Di chuyển từ hàm nội tại

Mặc dù các hàm nội tại RenderScript sẽ tiếp tục hoạt động sau khi RenderScript không dùng được nữa, các hàm này sẽ chỉ có thể thực thi trên CPU thay vì GPU.

Nếu ứng dụng sử dụng các hàm nội tại riêng biệt, bạn có thể sử dụng thư viện thay thế độc lập; các bài kiểm thử của chúng tôi cho thấy việc này nhanh hơn so với việc triển khai CPU RenderScript hiện nay.

Bộ công cụ này bao gồm các hàm sau:

  • Hỗn hợp (blend)
  • Làm mờ
  • Ma trận màu
  • Tích chập
  • Biểu đồ và histogramDot
  • Bảng tra cứu (LUT) và LUT 3D
  • Đổi kích thước
  • YUV sang RGB

Để biết đầy đủ thông tin chi tiết và các hạn chế, hãy xem tệp README.mdToolkit.kt của bộ công cụ. Tệp

Thực hiện các bước sau để tải xuống, thêm và sử dụng thư viện:

  1. Tải dự án xuống từ GitHub.

  2. Tìm và tạo renderscript-toolkit module.

  3. Thêm thư viện vào dự án Android Studio bằng cách chỉnh sửa tệp build.gradle của ứng dụng.

  4. Gọi phương thức thích hợp của bộ công cụ.

Ví dụ về việc di chuyển từ hàm ScriptIntrinsicBlur

Để thay thế hàm ScriptIntrinsicBlur, hãy làm như sau:

  • Để làm mờ bitmap, hãy gọi Toolkit.blur.

    var blurredBitmap = Toolkit.blur(myBitmap, radius)
    
  • Nếu bạn muốn làm mờ hình ảnh biểu thị bằng một mảng byte, hãy chỉ định chiều rộng, chiều cao và số byte theo đơn vị pixel.

    val outArray = Toolkit.blur(inputArray, bytesPerPixel, width, height, radius)
    

Nếu đối tượng là Android 12 (API cấp độ 31) trở lên, hãy cân nhắc sử dụng lớp RenderEffect thay vì Toolkit.blur().

Di chuyển từ tập lệnh

Để khai thác tối đa việc tăng tốc GPU, bạn nên chuyển các tập lệnh RenderScript sang API Vulkan nhiều nền tảng. Mặc dù các tập lệnh sẽ tiếp tục chạy ngay cả khi bạn không di chuyển, các tập lệnh đó có thể thực thi trên CPU thay vì GPU tuỳ thuộc vào tình trạng sẵn sàng của các trình điều khiển.

Để hiểu rõ hơn về cách di chuyển chức năng, hãy xem lại phần ứng dụng mẫu. Ứng dụng mẫu hướng dẫn cách làm mờ bitmap và chuyển đổi ma trận màu trong RenderScript, đồng thời có mã tương đương trong Vulkan.

Nếu ứng dụng cần hỗ trợ nhiều bản phát hành, hãy sử dụng RenderScript cho các thiết bị chạy Android 6 (API cấp 23) trở xuống và Vulkan cho Android 7 (API cấp 24) trở lên. Nếu minSdkVersion của bạn là cấp 24 trở lên, bạn không cần sử dụng RenderScript. Bạn có thể dùng Vulkan trên mọi thiết bị mà bạn hỗ trợ.

Vulkan không cung cấp API Kotlin hoặc Java, do đó, giữa RenderScript và Vulkan không có liên kết trực tiếp. Bạn cần phải viết mã Vulkan bằng NDK và tạo các hàm JNI để truy cập mã này từ Kotlin hoặc Java.

Các phần sau trình bày các khía cạnh của việc di chuyển từ RenderScript. Ứng dụng mẫu triển khai hầu hết các khía cạnh này. Để hiểu rõ hơn, hãy so sánh mã tương đương giữa RenderScript và Vulkan.

Khởi chạy

Thay vì tạo đối tượng ngữ cảnh RenderScript trong Kotlin hoặc Java, hãy thực hiện các bước sau để tạo một ngữ cảnh Vulkan bằng NDK.

  1. Tạo một thực thể Vulkan.

  2. Chọn một thiết bị thực tế Vulkan có hỗ trợ hàng đợi điện toán.

  3. Tạo một thiết bị logic Vulkan và lấy hàng đợi điện toán.

Bạn có thể tuỳ ý thiết lập các lớp xác thực Vulkan trên Android để tăng tốc độ phát triển ứng dụng bằng Vulkan.

Ứng dụng mẫu minh hoạ cách khởi chạy ngữ cảnh Vulkan trong VulkanContext.h. Để tìm hiểu thêm, hãy xem các phần Khởi chạyThiết bị và Hàng đợi trong tài liệu thông số kỹ thuật Vulkan.

Lớp truyền dữ liệu giữa các nhân (Allocation)

Bạn có thể di chuyển một lớp truyền dữ liệu giữa các nhân RenderScript sang hình ảnh lưu trữ Vulkan hoặc vùng đệm lưu trữ Vulkan. Để có hiệu suất tốt hơn với hình ảnh chỉ đọc, hãy sử dụng hình ảnh được lấy mẫu có thao tác tìm nạp dưới dạng trình lấy mẫu ảnh kết hợp hoặc với trình lấy mẫu riêng và liên kết hình ảnh mẫu.

Các tài nguyên Vulkan được phân bổ trong Vulkan. Để tránh tình trạng bộ nhớ sao chép các tập hợp tài nguyên gián tiếp khi tương tác với các thành phần khác của Android, hãy cân nhắc sử dụng tiện ích VK_ANDROID_external_memory_android_hardware_buffer để nhập AHardwareBuffer Android vào Vulkan. Tiện ích này có sẵn trên tất cả thiết bị Android hỗ trợ Vulkan 1.1. Để biết thêm thông tin, hãy xem FEATURE_VULKAN_HARDWARE_VERSION.

Ứng dụng mẫu minh hoạ cách tạo tài nguyên Vulkan trong VulkanResources.h. Để tìm hiểu thêm, hãy xem các phần tạo tài nguyênđặc tả tài nguyên trong tài liệu thông số kỹ thuật Vulkan.

Tập lệnh

Tập lệnh RenderScript phải được chuyển đổi sang chương trình đổ bóng Vulkan điện toán. Bạn cũng có thể cần điều chỉnh mã tuỳ thuộc vào việc sử dụng các tập lệnh RenderScript toàn cục.

Viết chương trình đổ bóng Vulkan điện toán

Chương trình đổ bóng Vulkan điện toán thường được viết bằng Ngôn ngữ tạo bóng OpenGL (GLSL) và sau đó được biên dịch sang định dạng Đại diện trung gian di động tiêu chuẩn-V (SPIR-V).

Để biết thông tin chi tiết và hướng dẫn tích hợp chương trình đổ bóng vào ứng dụng, hãy xem phần trình biên dịch đổ bóng của Vulkan trên Android.

Điều chỉnh tập lệnh toàn cục

Dựa trên các đặc điểm của tập lệnh toàn cục, các tập lệnh toàn cục không được chỉnh sửa trong chương trình đổ bóng nên sử dụng hằng số đặc biệt, hằng số đẩy hoặc đối tượng đệm đồng nhất:

  • Hằng số đặc biệt: Nên dùng cho các tập lệnh toàn cục mà gần như nhất quán trong các lệnh gọi nhân. Sẽ cần phải tạo lại quy trình điện toán khi thay đổi giá trị của các hằng số đặc biệt.
  • Hằng số đẩy: Nên dùng cho các tập lệnh toàn cục được thay đổi thường xuyên có kích thước nhỏ hơn maxPushConstantsSize (kích thước tối thiểu được đảm bảo là 128 byte).
  • Vùng đệm đồng nhất: Nên dùng cho tập lệnh toàn cục được thay đổi thường xuyên có kích thước lớn hơn kích thước của hằng số đẩy.

Đối với các tập lệnh toàn cục được thay đổi trong chương trình đổ bóng, bạn có thể sử dụng hình ảnh lưu trữ Vulkan hoặc vùng đệm lưu trữ Vulkan.

Tính toán

Bạn sẽ cần tạo một quy trình điện toán Vulkan để yêu cầu GPU thực thi chương trình đổ bóng điện toán.

Tạo quy trình điện toán Vulkan

Tệp ComputePipeline.h trong ứng dụng mẫu minh hoạ cách tạo quy trình điện toán Vulkan.

Để sử dụng chương trình đổ bóng SPIR-V được biên dịch trong Vulkan, hãy tạo quy trình điện toán Vulkan như sau:

  1. Tạo mô-đun chương trình đổ bóng với chương trình đổ bóng SPIR-V được biên dịch.
  2. Tạo bố cục tập hợp đặc tả chỉ định các liên kết tài nguyên (xem Lớp truyền dữ liệu giữa các nhân để biết thêm chi tiết).
  3. Tạo tập hợp đặc tả từ bố cục tập hợp mô tả.
  4. Tạo bố cục quy trình từ bố cục tập hợp đặc tả.
  5. Tạo một quy trình điện toán với mô-đun chương trình đổ bóng và bố cục quy trình.

Để biết thêm thông tin, hãy xem phần Quy trình điện toán trong tài liệu thông số kỹ thuật Vulkan.

Bắt đầu tính toán

Để bắt đầu tính toán bằng quy trình điện toán, hãy thực hiện các bước sau:

  1. Cập nhật tập hợp đặc tả bằng các tài nguyên Vulkan.
  2. Tạo vùng đệm lệnh Vulkan và ghi lại các lệnh sau:
    1. Liên kết quy trình và tập hợp đặc tả.
    2. Gửi các nhóm làm việc điện toán.
  3. Gửi vùng đệm lệnh đến hàng đợi điện toán.
  4. Chờ hàng đợi hoặc trở lại hàng rào đồng bộ hoá nếu muốn.

Để liên kết nhiều nhân với nhau (ví dụ: để di chuyển mã bằng ScriptGroup), hãy ghi lại chúng trong một vùng đệm lệnh và đồng bộ hoá với các rào cản bộ nhớ.

Ứng dụng mẫu minh hoạ hai tác vụ điện toán:

  • Xoay HUE: Một tác vụ điện toán đơn giản bằng một chương trình đổ bóng điện toán. Hãy xem ImageProcessor::rotateHue để biết mã mẫu.
  • Làm mờ: Một tác vụ điện toán phức tạp, thực thi tuần tự hai chương trình đổ bóng điện toán. Hãy xem ImageProcessor::blur để biết mã mẫu.

Để tìm hiểu thêm về các vùng đệm lệnh hoặc rào cản bộ nhớ, hãy tham khảo các phần trong tài liệu thông số kỹ thuật Vulkan, gọi là Vùng đệm lệnhRào cản bộ nhớ.