Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi: FireMonkey
Войти
Регистрация
Восстановить пароль
 
Tot999
14 / 14 / 14
Регистрация: 10.06.2015
Сообщений: 162
1

Мерцание в PaintBox на Андроид

01.09.2017, 19:10. Просмотров 336. Ответов 2
Метки нет (Все метки)

Решил переделать отображение графики простой 2д игрушке. До этого контейнером отображения графики у меня был TImage, в который на старте загружалась карта бОльшего размера, нежели размер клиентской части формы. Каждый такт игры, эта Timage центрировалась относительно позиции персонажа, также происходило вычисление видимых объектов и их отображал также в виде отдельных Timage помещаемых на TImage большой карты.
Соответственно, на начало нового такта все объекты, кроме карты подчищались и цикл происходил заново. Подгрузка всех Tmage'ей происходила из заготовленных в design-time Timagelist'ов.

На данный момент переделал всё на следующий лад: Есть Paintbox - rконтейнер, в который также в цикле подгружаются уже Tbitmap's, которые в свою очередь на старте приложения загружены в array [1..numofFishes] of TList<Tbitmap>;. Т.е. на событие OnPaint, сначала рисую видимый кусок карты из подгруженного в оперативу Mapbitmap : tbitmap
Кликните здесь для просмотра всего текста

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
   mapdx:=srcrect.left;
   mapdy:= srcrect.top;
 
   srcrect.Width:=PaintBoxMain.Width;
   srcrect.height:=PaintBoxMain.height;
 
   dstrect.left:= 0  ;
   dstrect.top:= 0 ;
   dstrect.Width:=PaintBoxMain.Width;
   dstrect.height:=PaintBoxMain.height;
 
   PaintBoxMain.BeginUpdate;
   PaintBoxMain.Canvas.DrawBitmap(Mapbitmap , srcrect, dstrect, 1 , false );
   PaintBoxMain.EndUpdate;

далее существа
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
if Creatures.Count > 0 then begin
  for i := 0 to Creatures.Count-1 do  begin
   if (Creatures[i].Dead = false) then begin
    if Creatures[i].IsvisibleonTheMapNow then begin
     if Creatures[i].Creaturekind = SFish then begin
        if (Creatures[i].level > 0)and(Creatures[i].level < 14) then begin
 
           Creatures[i].AnimationIndex:=Creatures[i].AnimationIndex +1;
           if Creatures[i].AnimationIndex = Animmax then Creatures[i].AnimationIndex:=Animmin;
 
         try
           srcrect.left:= 0  ;
           srcrect.top:= 0  ;
           srcrect.Width:= FishesBitmpAr[Creatures[i].level][Creatures[i].AnimationIndex].Width;
           srcrect.height:= FishesBitmpAr[Creatures[i].level][Creatures[i].AnimationIndex].height;
 
           dstrect.left:=Creatures[i].RectF.Location.x-mapdx;
           dstrect.top:= Creatures[i].RectF.Location.y-mapdy;
           dstrect.Width:=Creatures[i].RectF.Width;
           dstrect.height:=Creatures[i].RectF.height;
 
           //bufbitmap.Assign(FishesBitmpAr[1][Creatures[i].AnimationIndex]);
           bufbitmap.Assign(FishesBitmpAr[Creatures[i].level][Creatures[i].AnimationIndex]);
           // bufbitmap.Rotate(180);
 
           if (Creatures[i].angle >= 90)and(Creatures[i].angle <= 270) then begin
            bufbitmap.FlipHorizontal;
           end;
 
           PaintBoxMain.BeginUpdate;
           PaintBoxMain.Canvas.DrawBitmap(bufbitmap , srcrect, dstrect, 1 , false );
           PaintBoxMain.EndUpdate;
 
         except
          TimerMain.Enabled:=false;
          showmessage( 'Index '+inttostr(i)+' animIndex '+inttostr(Creatures[i].AnimationIndex)+' Level '+inttostr(Creatures[i].level)+ ' position '+ floattostr(Creatures[i].RectF.Location.x)+' '+floattostr(Creatures[i].RectF.Location.y)+' srect w/h '+floattostr(dstrect.Width)+' ' +floattostr(dstrect.height));
         end;
        end;
       end;
     end;
    end;
  end;
end;
 
PaintBoxMain.Repaint;


На windows всё выглядит нормально, правда второй вариант в процессах занимает 64мб в оперативе, против 53мб первого случая.
Но на андроиде, даже если я беру самый минимальный размер битмапов, даже без рисования куска карты, а только существ (5-10 битмапов по 8-15 Кб) наблюдается значительное мерцание. Полазил по инету, пишут про doublebuffered, но на FMX такого свойства у компонента не обнаружил.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.09.2017, 19:10
Ответы с готовыми решениями:

PaintBox
Как нарисовать линию или прямоугольник на PaintBox?

PaintBox
Не могу разобраться с компонентом PaintBox - мне нужно чтобы я рисовал линии,...

PaintBox рисование
Рисую на PaintBox(он на frame), но картинка не проявляется. Знаю про onpaint,...

Рисование в PaintBox. Создание масштабируемого рисунка с цветной заливкой
Помогите нарисовать масштабируемый рисунок с заливкой. Рисунок состоит из...

Мерцание
Необходимо перерисовывать картинку(изменяя размер). Во время перерисовки идет...

2
krapotkin
3435 / 3039 / 1050
Регистрация: 14.04.2014
Сообщений: 14,750
Записей в блоге: 15
01.09.2017, 21:50 2
с виду все почти неплохо
для выяснения, что же тормозит, нужно больше кода
в идеале конечно - весь проект
0
Tot999
14 / 14 / 14
Регистрация: 10.06.2015
Сообщений: 162
12.09.2017, 00:18  [ТС] 3
Я бы загрузил весь проект, но боюсь, что после этого ко мне будет слишком много других вопросов, касательно качества кода и соблюдения канонов.
После пары дней ковыряния выяснил, что проблема заключалось не в Paintboxe а в том, что размер загружаемых битмапов оставался слишком большим. Думал, что если указываю размер 10 на 10 например, при обращении к TImageList, то сам битмап будет 10 на 10. Но оказалось, что Timagelist грузит в Tbitmap по максимуму вне зависимости от указанного размера.
Поэтому после загрузки применяю процедуру масштабирования ResizeBitmap.


Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  for i := 1 to numoffishes do begin
     FishesBitmpAr[i]:=  TList<Tbitmap>.create;
 
     for k := 0 to TImageList(FindComponent('ImageListFish'+inttostr(i))).Count-1 do begin
       LoadedBitmap := tbitmap.Create;
 
       cx:=  settings.standartx * Power(settings.xprop, i);
       cy:=  settings.standarty * Power(settings.yprop, i);
 
       arectf.Top:= 0 ;
       arectf.left:= 0 ;
       arectf.width:= cx ;
       arectf.height:= cy ;
 
       LoadedBitmap.Assign(TImageList(FindComponent('ImageListFish'+inttostr(i))).Bitmap(arectf.Size,k));
 
       ResizeBitmap(LoadedBitmap, trunc(cx), trunc(cy)); // - надо было добавить
       FishesBitmpAr[i].Add(LoadedBitmap);
     end;
  end;
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2017, 00:18

Мерцание ячеек СтрингГрид
В СтрингГрид вставляю картинку и масштабирую ячейки по размеру этой...

Popup мерцание границ формы
Здравствуйте. У меня на форме расположены кнопки и когда на них наводишь...

Мерцание изображения при табуляции
Здравствуйте! При загрузки формы фокус установлен на Edit1 (можно ли вообще...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru