Я создаю приложение дополненной реальности, которое берет кадры с камеры, фильтрует их, используя несколько методов обработки изображений, и отображает их пользователю вместо предварительного просмотра камеры.
При первом запуске япросто звонил:
holder = getHolder();
holder.addCallback(this);
...
camera.addCallbackBuffer(buffer);
camera.setPreviewDisplay(holder);
camera.setPreviewCallbackWithBuffer(callback);
camera.startPreview();
Внутри обратного вызова я делаю следующее:
SurfaceHolder holder;
Canvas c = holder.lockCanvas();
if (c != null) {
try {
// Draw to canvas
} finally {
holder.unlockCanvasAndPost(c);
}
}
Это работало довольно хорошо и давало достойную производительность на Motorola Photon.* У меня также есть Motorola Droid и LG Optimus;на этих двух устройствах onPreviewFrame никогда не будет вызвано, и в результате держатель никогда не будет извлечен при обратном вызове.И пользователь застрянет с черным экраном.
После поиска я обнаружил, что необходимо добавить следующую строку
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
С этой строкой я наконец получаю обратный вызов.Но проблема в том, что если я пытаюсь позвонить holder.lockCanvas()
, я получаю сообщение об ошибке, так как это не разрешено с SURFACE_TYPE_PUSH_BUFFERS
.
Теперь я смог обойти эту проблему, поместив ImageView
поверх SurfaceView
и вместо этого нарисовав кадры в ImageView
.Но производительность этого ужасна по сравнению с использованием SURFACE_TYPE_NORMAL
.
Мои вопросы:
- Является ли
SURFACE_TYPE_NORMAL
допустимым используемым типом, илимогу ли я доверять только SURFACE_TYPE_PUSH_BUFFERS
? - Если это так, можно ли определить, поддерживает ли устройство
SURFACE_TYPE_NORMAL
, чтобы я мог выжать этот дополнительный бит производительности из устройств, которые это делают?Существуют ли определенные версии Android или производители, которые поддерживают его?
В качестве примечания, я понимаю, что для Honeycomb (3.0) эти значения больше не поддерживаются.Но они требуются для 2.3 и ниже.Также для ICS (4.0), новый конвейер SurfaceTexture
работает быстро.Но я все равно хотел бы поддержать как минимум 2.2 и 2.3.