Сбой RenderScript при создании ScriptC

Существует какая-то загадочная проблема с созданием объекта ScriptC при использовании RenderScript. Вот мой код:

public class RenderScriptActivity {

    private RenderScript mRS;
    private ScriptC_kernel mScript = null;

    private Allocation m1Allocation, m2Allocation,
            m3Allocation, m4Allocation;

    private Bitmap mBitmap;

    private ImageView mView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_renderscript);
        mView = (ImageView) findViewById(R.id.image_view);
    }

    @Override
    protected void onResume() {
        super.onResume();
        initRenderScript();
    }

    @Override
    protected void onPause() {
        super.onPause();
        releaseRenderScript();
    }

    private void initRenderScript() {
        mRS = RenderScript.create(this);

        int size = 320*240;
        m1Allocation = Allocation.createSized(mRS, Element.I16(mRS), size);
        m2Allocation = Allocation.createSized(mRS, Element.I16_4(mRS), size);
        m3Allocation = Allocation.createSized(mRS, Element.I16_4(mRS), size);
        mBitmap = Bitmap.createBitmap(1280, 720, Bitmap.Config.ARGB_8888);
        m4Allocation = Allocation.createFromBitmap(mRS, mBitmap);

        mScript = new ScriptC_kernel(mRS, getResources(), R.raw.kernel);
    }

    private void releaseRenderScript() {

        m1Allocation.destroy();
        m2Allocation.destroy();
        m3Allocation.destroy();
        m4Allocation.destroy();
//        mScript.destroy();

        mRS.finish();
    }

}

И мое ядро ​​(да, оно пустое):

#pragma version(1)
#pragma rs java_package_name(com.example.android.myrenderscript)

Проблема в том, что после 3-го вызова функции initRenderScript() (т. е. возобновления работы приложения, приостановки, возобновления, приостановки и повторного возобновления) мое приложение аварийно завершает работу (SIGSEV) с ошибкой:

backtrace:
#00  pc 00027034  /system/lib/libRS.so (android::renderscript::rsrClearObject(android::renderscript::Context const*, android::renderscript::ObjectBase**)+3)
#01  pc 00012c3b  /system/lib/libRSDriver.so
#02  pc 00000668  <unknown>

Кроме того, если я использую метод mScript.destory() (который прокомментирован выше), мое приложение вылетает сразу после первого вызова initRenderScript(). Кроме того, если я просто прокомментирую строку, которая создает объект ScriptC_kernel, все будет работать нормально. Вот почему я полагаю, это проблема с созданием объекта ScriptC.

Есть ли шанс, кто-нибудь знает, почему эта проблема возникает?

Что здесь любопытно, эта проблема возникает, только если я создаю приложение из командной строки (с командой ant debug, Ubuntu 14.04). Когда я создаю его с помощью Android Studio или Eclipse, все работает нормально.

Я также должен упомянуть, что на самом деле падает не само приложение (оно содержит несколько действий), а один поток, который, я полагаю, является RenderScript. После сбоя предыдущая активность снова выводится на передний план.

Буду очень признателен за любую помощь, и заранее спасибо


person Szał Pał    schedule 05.01.2016    source источник
comment
не должен ли mRS.finish() вызывать перед уничтожением выделений? Дождитесь завершения любых ожидающих асинхронных операций (таких как копирование в выделение RS или выполнение сценария RS) ... давайте предположим, что есть какая-то ожидающая асинхронная операция, и вы уничтожаете выделение ... что может случиться если эта операция завершится? ... также я вижу еще одну проблему с этим кодом ... вы создаете растровое изображение для каждого резюме ... и не выпускаете его ... рано или поздно это закончится исключением OOMemory   -  person Selvin    schedule 05.01.2016


Ответы (2)


Вы действительно больше ничего не делаете с RS здесь? Возможно ли, что ваши муравьиные команды неправильно упаковывают ресурсы в ваш .apk? Возможно, стоит проверить фактический файл .apk, созданный для каждой сборки, и сравнить ресурсы и т. Д., Чтобы убедиться, что они эквивалентны.

Последний вопрос: ваш файл называется kernel.rs?

mScript = new ScriptC_kernel(mRS, getResources(), R.raw.kernel);

действительно должен быть переписан для безопасности как:

mScript = new ScriptC_kernel(mRS);

Они эквивалентны (при условии, что вы используете kernel.rs), а второй гораздо менее подвержен ошибкам (на случай, если вы скопируете и вставите эту строку для другого сценария. Я мог видеть, что эта ошибка возникает, если вы загружаете неправильный сценарий, но даже это маловероятно.

person Stephen Hines    schedule 06.01.2016

У меня аналогичная проблема. В моем случае сбой происходит на rs.destroy

Log.d(App.LOG_TAG, "deinigRenderScript 1");
mRS.finish();
Log.d(App.LOG_TAG, "deinigRenderScript 2");
mScript.destroy();
Log.d(App.LOG_TAG, "deinigRenderScript 3");
mAllocation.destroy();
Log.d(App.LOG_TAG, "deinigRenderScript 4");
mRS.destroy(); // << crash here (different tid)
Log.i(App.LOG_TAG, "deinigRenderScript 5");

В моем случае это помогает:

$ cat project.properties  | grep render
renderscript.target=18
renderscript.opt.level=O3
renderscript.support.mode=false
renderscript.debug.opt.level=O3
renderscript.release.opt.level=O3
person Antoni Jakubiak    schedule 22.11.2016