Перейти к содержанию
Fire Monkey от А до Я

Лидеры

  1. rareMax

    rareMax

    Пользователи


    • Баллы

      5

    • Постов

      553


  2. Равиль Зарипов (ZuBy)

    Равиль Зарипов (ZuBy)

    Модераторы


    • Баллы

      4

    • Постов

      2 517


  3. Brovin Yaroslav

    Brovin Yaroslav

    Администраторы


    • Баллы

      3

    • Постов

      2 124


  4. ElenaS.

    ElenaS.

    Пользователи


    • Баллы

      3

    • Постов

      28


Популярный контент

Показан контент с высокой репутацией 29.04.2016 во всех областях

  1. Ну например я смотрю спайдером. Допустим я пишу сейчас АПИ для телеграмма. Есть у меня демка. И, например, у меня большая нагрузка на процессор(на самом деле мизерная - 0.1-0.3%). Что бы определить место, где происходит нагрузка - я запускаю демку под профайлером. Открываю Code Tracking и смотрю в моем юните(TelegaPI.Bot) на количество вызовов. Ознакомившись с этой сводкой - становится ясно - что больше всего вызовов происходит во время получения обновлений. Обновления от сервера получаю getUpdates. SetIsReceiving -метод, который в другом потоке в цикле проверяет обновления. Так что, если меня не устраивает нагрузка на ЦП - нужно обратить внимание на этот метод(SetIsReceiving, а точнее getUpdates, в котором вся логика работы)
    4 балла
  2. Здравствуйте! Помним! Делаем! На этой неделе был релиз VCL. Поддержку Берлина для FMX реализуем на выходных/в понедельник. Обещание было чуть-чуть преждевременное, прошу прощения
    2 балла
  3. Не заставлять постоянно работать поток, а усыплять его в моменты, когда его работа не нужна. Например, если вы в потоке что-то ждете, то не надо это ждать в цикле, а используйте механизмы синхронизации с ожиданиями, типа WaitFor и тд. В этом случае в вашем потоке вы будите выполнять итерацию гораздо реже.
    2 балла
  4. Pax Beach

    Генерация QR-кода на Android

    На самом деле, вопрос с правильной отрисовкой на Bitmap в Android тоже не удалось решить. Чтобы в приложении Android правильно отображался QR код, пришлось рисовать на канве TImage.Canvas, а не на канве TImage.Bimap.Canvas. Поэтому при сохранении изображения приходится делать screenshot в TBitmap и далее resample в нужно разрешение изображения (через Canvas.DrawBitmap). function TfmMainQRShare.getFinalBitmap(Img: TImage): TBitmap; var b: TBitmap; begin b := Img.MakeScreenshot; result := TBitmap.Create; result.Assign(b); result.SetSize(512,512); if result.Canvas.BeginScene() then try toast('OK'); result.Canvas.Clear(TAlphaColors.White); result.Canvas.Fill.Bitmap.WrapMode := TWrapMode.TileStretch; result.Canvas.DrawBitmap(b, RectF(, , min(b.Width, b.Height), min(b.Width, b.Height)), RectF(, , 512, 512), 1, true); result.Canvas.EndScene; finally result.Canvas.EndScene; end; end; В итоге, при сохранении получаем только часть изображения (видно ниже). Почему оно искажается при ресамплинге, пока не знаю. Если Canvas.DrawBitmap не делать, а сразу result := Img.MakeScreenshot, тогда все ок — но в Bitmap сохраняется вся канва TImage, а не нужная область, что не правильно.
    1 балл
  5. Можно пойти другим путем. Рисовать не на TImage, а использовать шрифты. На http://fontello.com/ сделал шрифт из двух символов - черный квадрат и белый квадрат. Рисовальщик из меня никудышний, не разобрался как увеличить высоту символов в SVG иконке. Шрифт подключил к проекту, отображаю на Memo, у которого установлен мой шрифт. Код такой: procedure TfmMainQRShare.Update; var Row, Column, I : Integer; S : String; ChBlack, ChWhite : String; begin Memo.BeginUpdate; Memo.Lines.Clear; ChBlack:=Char($e802); ChWhite:=Char($e803); QRCode.Free; QRCode := TDelphiZXingQRCode.Create; try QRCode.Data := edtText.Text; QRCode.Encoding := TQRCodeEncoding(cmbEncoding.ItemIndex); QRCode.QuietZone := StrToIntDef(edtQuietZone.Text, 2); for Row := 0 to QRCode.Rows - 1 do begin S:=''; for Column := 0 to QRCode.Columns - 1 do begin if (QRCode.IsBlack[Row, Column]) then S:=S+ChBlack else S:=S+ChWhite; end; Memo.Lines.Add(S); end; finally end; Memo.EndUpdate; end; На картинке видны горизонтальные пробелы между символами, в какой то момент мне удалось методом тыка (редактированием шрифта) от них избавится, но слетела ширина белого квадрата. Оставил вариант который хотя бы читается.
    1 балл
  6. Прогоните прогу через профайлер, посмотрите где возникает нагрузка на процессор. Дальше либо сами оптимизируйте, либо просите помощи у народа
    1 балл
  7. Abdi Pranoto

    StatusBar Color

    i had analyzed your code, and its use Android API as well.... you're good....
    1 балл
  8. put into Content new TRectangle with align := MostBottom and color := claBlack OnResize: Content.Margins.Bottom := 0;
    1 балл
  9. Я такое использую для вычисления высоты текста. Может пригодится) function CalculateTextHeight(aText: String; aWidth: Single; aMinHeight: Single; aMaxHeight: Integer; aFont: TFont) : Single; begin if not Assigned(FTextLayout) then FTextLayout := TTextLayoutManager.DefaultTextLayout.Create; FTextLayout.BeginUpdate; try FTextLayout.Text := aText; FTextLayout.MaxSize := TPointF.Create(aWidth, 1000); FTextLayout.WordWrap := True; FTextLayout.Font.Assign(aFont); FTextLayout.HorizontalAlign := FMX.Types.TTextAlign.Leading; FTextLayout.VerticalAlign := FMX.Types.TTextAlign.Leading; finally FTextLayout.EndUpdate; end; Result := FTextLayout.Height; if aMinHeight>0 then if Result < aMinHeight then Result := aMinHeight; if aMaxHeight>0 then if Result > aMaxHeight then Result := aMaxHeight; end{ function CalculateTextHeight }; FTextLayout : TTextLayout - глобальная приватная переменная.
    1 балл
  10. function TextHeight(const AText: string; aTextSettings: TTextSettings; const aWidth: Single): Single; // uses FMX.TextLayout, FMX.Graphics, System.Math var Layout: TTextLayout; aRect: TRectF; aWW: boolean; begin Result := 0; if AText.IsEmpty then Exit; aWW := Pos(#13#10, AText) > 0; if (aTextSettings.WordWrap) or (aWW) then aRect := RectF(0, 0, aWidth, MaxSingle) else aRect := RectF(0, 0, MaxSingle, MaxSingle); Layout := TTextLayoutManager.DefaultTextLayout.Create; try Layout.BeginUpdate; Layout.TopLeft := aRect.TopLeft; Layout.MaxSize := PointF(aRect.Width, aRect.Height); Layout.WordWrap := aTextSettings.WordWrap; Layout.HorizontalAlign := TTextAlign.Leading; Layout.VerticalAlign := TTextAlign.Leading; Layout.Font.Assign(aTextSettings.Font); Layout.Color := aTextSettings.FontColor; Layout.RightToLeft := false; Layout.Text := AText; Layout.EndUpdate; aRect := Layout.TextRect; finally FreeAndNil(Layout); end; Result := aRect.Bottom; end; вызов функции, тут расчёт высоты делается для TText (родной autosize косячит при большом кол-ве текста) aTextSettings := TTextSettings.Create(nil); aTextSettings.Trimming := TTextTrimming.None; aTextSettings.Font.Size := mText.Font.Size; aTextSettings.WordWrap := true; mText.Height := TextHeight(mText.Text, aTextSettings, mText.Width - (mText.Margins.Left + mText.Margins.Right)); PresentedScrollBox1.RealignContent; // пересчёт контента родителю Самое важное это сделать пересчёт размеров контента РОДИТЕЛЮ, иначе высота будет не правильная. Незнаю почему так сделано, но только так получается добиться правильной высоты текста (проверял на TListBox, TListView, TText)
    1 балл
  11. ListView.ItemApperiance := ImageListItemRightButton; Потом будет доступно TextButton у Itema
    1 балл
  12. Блин, че-то даже неловко стало). FPS большой на ПК, а на андройде ~40 фпс. Не знаю с чем это все связано, но просто надо дальше ковырять FMX в сторону того же самого 3D, это должно быть быстрее обычного канваса. За отрисовку отвечает только TEngine2D и его объекты, т.е. если 3D быстрее, переделывать недолго. Можно еще в сторону отрисовки в нескольких потоках смотреть, я о ней всё время думал: что-то типа два потока реденрят в два имеджа, а когда оба готовы, то рендерят один имедж в другой. Я занят не только развитием движка, а еще работой, халтурами и прочими вещами) Но по движку стараюсь делать как минимум коммит в день (Или побольше в выходные) По самой игре... Вот как раз её код не очень. Движок я рефакторил активно последний месяц, поэтому на него немного приятней смотреть) В общем я бы не спешил с переделкой игры, т.к. хоть формат объектов и возможность их создания в SSB реализована, но это всё еще не прикручено и возможно что-то изменится. Сейчас имхо самая лучшая помощь,- это донесение информации о проекте, а лучший способ донесения информации, - это собрать еще какую-нибудь несложную игру и выложить её на маркет) На все вопросы я с радостью отвечу, по мере свободного времени конечно, но также вполне возможны ответы: это еще сыровато, лучше это не делать(делать конечно можно, но возможно придется переделывать) . :-)
    1 балл
  13. Не смог пройти мимо!) Я добавил в README репозитория ссылку на wiki по движку http://dimlight.ru/wiki Понемногу пишу её. А также добавил важные цели ближайшего месяца. О которых напишу здесь и по-русски. Закончить работу над Object Initilizer'ом, который читает SEJson файлы с описанием объектов. Вытащить куда-то всю условную компиляцию, которая в зависимости от версии Делфи подключает юниты и меняет названия итемов enum'ов. Нужно вытащить всё куда-то в файл синононимов, а то пока уверенно только на XE8 и Seattle собирается (В XE5-XE7 тоже собирается, но надо переименовывать всякую фигню) Создать чистый репозиторий, без демо игры, чтобы там было всё, чтобы октрывать и начать писать. Доделать некоторые фичи форматтерсов. В двух-трехмесячной перспективе: Доделать Sprite Shape Builder (SSB) Это программка, которая находится в групповом проекте и она позволяет собрать из разных картинок файл ресурсов, задать группы, имена, дополнительные свойства, фигуры для коллайдеринга Рассмотреть возможность переноса отрисовки в 3Д. Т.е. оставить спрайты, но они будут текстурами на квадах, мб. еще быстрее будет отрисовка. Особо не пробовал ничего кроме тестовых примеров, поэтому так расплывчато пишу. Очень благодарен за внимание к движку. Спасибо! И буду рад если кто-нибудь присоединится. :-)
    1 балл
  14. enatechno

    Cancel в InputQuery

    и не только... What's New - Berlin: Simplified Dialog API Several procedures and functions to show dialog boxes are now deprecated, and have been replaced by the procedures and functions of the new IFMXDialogServiceAsync and IFMXDialogServiceSync platform services that provide support for synchronous and asynchronous dialog boxes, respectively. The following table summarizes the API changes: Deprecated Members New Members FMX.Dialogs.ShowMessage* FMX.Dialogs.ShowMessageFmt* FMX.Dialogs.ShowMessagePos ShowMessageAsync ShowMessageSync FMX.Dialogs.MessageDlg FMX.Dialogs.MessageDlgPos FMX.Dialogs.MessageDlgPosHelp FMX.Platform.IFMXDialogService.MessageDialog MessageDialogAsync MessageDialogSync FMX.Dialogs.InputBox FMX.Dialogs.InputQuery FMX.Platform.IFMXDialogService.InputQuery InputQueryAsync InputQuerySync * ShowMessage and ShowMessageFmt are not really deprecated, but you may want to use ShowMessageAsync or ShowMessageSync instead nonetheless. Two new helper classes have been created as well: TDialogServiceAsync and TDialogServiceSync. These helper classes provide class methods and functions that allow you to call the new procedures and functions for dialog boxes without the need of an instance of the corresponding dialog box platform service. Other FireMonkey
    1 балл
  15. Релизим буквально на следующей неделе!
    1 балл
  16. Martifan

    [Android] Как свернуть приложение?

    Нашел еще один способ: Uses Androidapi.Helpers; procedure TfMain.SpeedButton11Click(Sender: TObject); begin SharedActivity.moveTaskToBack(True); end;
    1 балл
  17. Нужно помнить, что StylesData при запросе значения свойства какого-либо объекта стиля всегда возвращает TValue. Поэтому например в вашем случае вы допускаете сразу две ошибки по одной в каждом варианте: Ошибка 1 Не правильно: ListBoxItem.StylesData['text.width'].asInteger Свойство Width вещественного типа, поэтому при попытке конвертировать TValue в Integer этим способом приведет к ошибке "Invalid class typecast", так как представления вещественного и целого чисел отличаются. Правильно: ListBoxItem.StylesData['text.width'].AsExtended Ошибка 2 Не правильно: ListBoxItem.StylesData['text.text'].asString В этом случае вы пытаетесь представить содержимое TValue, как строка. Но при таком обращении через методы, начинающиеся с приставки "As", идет попытка конвертации чистого значения вещественного числа (указатель в памяти) в строку. Естественно, что такая конвертация пройдет не правильно и закончится все той же ошибкой "Invalid class typecast" Правильно: ListBoxItem.StylesData['text.text'].ToString
    1 балл
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...