Tôi đã làm việc với RenderScript gần đây với mục đích tạo một API mà một lập trình viên có thể sử dụng một cách dễ dàng, tương tự như cách mà Microsoft Accelerator hoạt động.Cách chuyển các giá trị mảng đến và từ Android RenderScript bằng cách sử dụng Allocations
Sự cố tôi đang gặp phải tại thời điểm này là tôi muốn chuyển giá trị đến và từ lớp RenderScript và mọi thứ chạy theo cách hiệu quả nhất có thể, đây là trích đoạn mã nguồn của tôi cho đến thời điểm này:
int[] A = new int[10];
int[] B = new int[10];
for (int i = 0; i < 10; i++) {
A[i] = 2;
B[i] = i;
}
intAdd(A, B);
Điều này chỉ tạo hai mảng cơ bản và điền chúng với các giá trị và gọi các hàm sẽ gửi chúng tới RenderScript.
private void intAdd(int[] A, int[] B) {
RenderScript rs = RenderScript.create(this);
ScriptC_rsintadd intaddscript = new ScriptC_rsintadd(rs, getResources(), R.raw.rsintadd);
mScript = intaddscript;
for(int i = 0; i < A.length; i++) {
setNewValues(mScript, A[i], B[i]);
intaddscript.invoke_intAdd();
int C = getResult(mScript);
notifyUser.append(" " + C);
}
}
public void setNewValues(Script script, int A, int B) {
mScript.set_numberA(A);
mScript.set_numberB(B);
}
public int getResult(Script script) {
int C = mScript.get_numberC();
return C;
}
này sẽ gửi một cặp giá trị vào mã RenderScript sau:
int numberA;
int numberB;
int numberC;
void intAdd() {
/*Add the two together*/
numberC = numberA + numberB;
/*Send their values to the logcat*/
rsDebug("Current Value", numberC);
}
Nhưng có hai vấn đề với điều này, một trong những đầu tiên là không đồng bộ bản chất của RenderScript có nghĩa là khi các lớp Java yêu cầu giá trị, kịch bản hoặc chưa thực hiện thao tác, hoặc nó đã thực hiện nó, phá hủy giá trị của đầu ra và bắt đầu trên giá trị tiếp theo. Và nhờ khả năng hiển thị lỗi thấp của RenderScript, không có cách nào để nói.
Vấn đề khác là nó không phải là rất hiệu quả, mã liên tục gọi hàm RenderScript để thêm hai số với nhau. Lý tưởng nhất là tôi muốn vượt qua mảng để RenderScript và lưu trữ nó trong một cấu trúc và có toàn bộ hoạt động được thực hiện trong một cuộc gọi script chứ không phải là nhiều. Nhưng để có được nó trở lại tôi nghĩ rằng tôi sẽ cần phải sử dụng chức năng rsSendtoClient, nhưng tôi đã không tìm thấy bất kỳ tài liệu về cách sử dụng nó. Và tốt hơn là tôi muốn sử dụng chiến lược rsForEach, nhưng một lần nữa thông tin là sợ hãi.
Nếu có bất kỳ ý tưởng nào tôi rất biết ơn. Cảm ơn.
Will Scott-Jackson