Главная

Пишу программу под Би:)

Как можно побыстрей склеить два битмапа (используя прозрачность и режим рисования)?
Делаю так
virtual void foo(BBitmap *target, BBitmap *bitmap, BPoint where, uchar alpha)
{
BView *view = new BView(target–>Bounds(), “someView”, B_FOLLOW_NONE, B_WILL_DRAW);

if (view)
{
target–>AddChild(view);
view–>SetDrawingMode(B_OP_ALPHA); // 1
view–>SetHighColor(51,102,152,alpha);
view–>SetBlendingMode(B_CONSTANT_ALPHA, B_ALPHA_OVERLAY);
view–>DrawBitmap(bitmap, where);
target–>RemoveChild(view);
delete view;
}
}

Получается очень медленно и +(насколько я понял) нельзя установить режим отличный от B_OP_ALPHA (1) а нужны и другие:(

Re: Пишу программу под Би:)

медленно получается если ты вызваешь фунцию
DrawBitmap часто и много раз. особенно если битамапы из разных цветовых пространств и с рескэйлингом.
Сама по себе операция блендинга с учетом альфа не очень затратна, затратен многократное обращение к app_server, которое происходит внутри DrawBitmap.
Если это действительно твой случай — например вызов DrawBitmap в цикле — используй вместо него DrawBitmapAsync(),
а после выхода из цикла вызови Sync()

Re: Пишу программу под Би:)

Во–первых, действительно ли есть необходимость создавать новый BView каждый раз? Мне не кажется, что создание/удаление BView является быстрой операцией… ;)

Я бы сделал класс, типа:

class DrawableBitmap : public BBitmap
{
public:

BView* GetView() { return fView; }
void DrawBitmap(const BBitmap* bitmap, const BPoint& where, uchar alpha);

private:
BView* fView;
uchar fRed, fGreen, fBlue;
};

тогда сама функция рисования будет уже намного проще (и быстрее):

void DrawableBitmap::DrawBitmap(const BBitmap* bitmap, const BPoint& where, uchar alpha)
{
fView–>SetHighColor(fRed, fGreen, fBlue, alpha);
fView–>DrawBitmap(bitmap, where);
}

Кроме того, есть еще один способ «ускорить» отрисовку — использовать не DrawBitmap(), а DrawBitmapAsync(). Эта функция вернется до того как реально битмап будет отрисован. Иногда это может положительно сказаться на общей производительности программы за счет распараллеливания:


fView–>DrawBitmapAsync(…);
// делаем что–либо еще, например, вычиляем
// что–нибудь или даже рисуем в тот же битмап

// и только когда нам надо нарисовать сам битмап…
fView–>Sync();
// тепер можем быть уверены в том, что асинхронная
// отрисовка закончена

Кроме того, на скорость еще влияет формат данных самого битмапа (color_space). Думаю, что не составит труда немного поэкспериментировать с разными значениями (при разных режимах экрана), чтобы понять некоторые закономерности…

Re: Пишу программу под Би:)

создание BView, как и удаление — операция быстрая.
«Медленной» операцией является добавление его к Bitmap в качестве ребенка.
Так что резон в замечании есть.
Другой «медленной» операцией будет являтся блокировка (Lock/UnlockLooper) для этого представления.
Так что в данном случаем имеет смысл не только создать «рисовальное представление» один раз, но и блокировать битмап при помощи Lock один раз на все время жизни, и деблокировать при разрушении.
Обе операции «медленные» по той же причине, что я отметил в предыдущем посте — коммуникация с app_server

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Allowed HTML tags: <a> <em> <i> <img> <strong> <b> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и параграфы переносятся автоматически.

Подробнее о форматировании

CAPTCHA
Введите перечисленные символы, чтобы мы убедились, что вы не робот. Не требуется для зарегистрированных пользователей.
t
D
s
s
L
g
Enter the code without spaces and pay attention to upper/lower case.