Canvas.drawVertices - Incredibly fast, incredibly low-level, incredibly fun

Поділитися
Вставка
  • Опубліковано 14 жов 2024
  • One of Flutter's lowest-level APIs is the drawVertices method, which allows you to efficiently draw an astounding amount of stuff on the screen. That stuff can be lines, rectangles, polygons, particles, and whatever else you can think of. This method is how people (including Filip) can even implement specialized 3D renderers on top of Dart that run fast on mobile, web and desktop. In this talk, Filip will explain the API of Canvas.drawVertices() and the Vertices.raw() constructor - both are obscure, very low-level, and hard to explain in documentation alone. But they are worth it when you need to squeeze the last bit of performance out of Flutter.
    We'll also cover Canvas.drawLines, for good measure.
    This talk is part of Flutter Forward, a 2023 official Flutter conference in Nairobi, Kenya.

КОМЕНТАРІ • 90

  • @HezOmanjo
    @HezOmanjo Рік тому +4

    Too nerdy for me ... But I'll say this - Filip has always challenged me to push beyond my boundaries of thinking in Flutter. Right from day 1. Amazing man 👍🏽

  • @mahmood466
    @mahmood466 Рік тому +1

    This is some excellent quality content in Flutter! Please continue!!

  • @CodeWithImem
    @CodeWithImem 6 місяців тому

    the depth of the informations you provide it's amazing .

  • @imaNNeO
    @imaNNeO Рік тому +4

    That was really great. I learned a lot. Thank you Filip

  • @lemomar
    @lemomar Рік тому +3

    This was great!
    I’ve recently begun to work on the canvas after years of being scared of it and I’m enjoying it a lot

  • @jjny916
    @jjny916 11 місяців тому

    This is excellent and incredibly valuable content. Thank you.

  • @yf4453
    @yf4453 Рік тому

    Amazing talk. Thakn you!

  • @mivoligo
    @mivoligo 11 місяців тому

    Just wanted to say Thank You! ❤

  • @thanhdatvo0
    @thanhdatvo0 Рік тому +1

    We missed you! Welcome back!

  • @mksln
    @mksln Рік тому +2

    Wonderful video Filip! Thanks for the great intro to drawVertices, I didn't even know it was there, it looks like a great way to squeeze out lots more drawing performance when have need of it in Flutter apps.

  • @Dotafreak
    @Dotafreak Рік тому +2

    Fear of canvas is slowly reducing. Thanks for sharing this.

  • @SmashHighlights
    @SmashHighlights Рік тому +1

    Really interesting, thanks for sharing! I always enjoy your focus on performance and low level stuff in Flutter.

  • @Apenschi
    @Apenschi Рік тому

    VERY good! Thanks!

  • @reacct1002
    @reacct1002 Рік тому

    Thanks Filip!

  • @Hamiiidev
    @Hamiiidev Рік тому +1

    Great. waiting for Flutter Forward analysis.

  • @SecondFlight
    @SecondFlight Рік тому

    Thanks so much for this talk! I didn't realize this was hidden in the painter API and I'm excited to try it out.

  • @dhruvinvainsh743
    @dhruvinvainsh743 Рік тому +1

    This is superb

  • @saqibshafin
    @saqibshafin Рік тому

    I love your work. So much.
    Keep it up!
    Also, please finish the Self Improving Developer book!

  • @Andreasonline3
    @Andreasonline3 Рік тому

    absolutley dope keen to see more

  • @mohanedy
    @mohanedy Рік тому +4

    I have enjoyed every second of this video. Really helpful and interesting.
    But I think you have drawn the Kotlin logo at 30:50 accidentally, maybe this is how the Kotlin team came up with the logo idea 😂

  • @giiyms4408
    @giiyms4408 Рік тому

    Thanks Filip. Keep it up. Learning a lot!

  • @JessicaPereira-wy6ru
    @JessicaPereira-wy6ru Рік тому

    Thanks for this amazing talk Filip, you inspire me... Do you have the code source?

    • @filiphracek
      @filiphracek  Рік тому +1

      Not the one I show in the talk, but have a look at github.com/zesage/flutter_cube, for example.

  • @CarlosHenrique-er7zq
    @CarlosHenrique-er7zq Рік тому

    Amazingggg video! Thanks for it

  • @محمدمهدی-س2ط
    @محمدمهدی-س2ط Рік тому

    great. love your way.

  • @pankajkoirala6563
    @pankajkoirala6563 Рік тому

    Really happy to watch such content :)

  • @mojtabana6322
    @mojtabana6322 Рік тому

    thanks for sharing

  • @R4IVI
    @R4IVI Рік тому +1

    My first thought when you asked for the "bug" was : "that comes from the 16bits limits !"
    I'm not a low level engineer but I learned that when trying to position planets accurately in space in Blender3D, which use a 32-bits number precision, which is ok for entertainment but weak for technical viz' ! 🤓

  • @TadejKanizar
    @TadejKanizar Рік тому

    Very cool. I'm going to start drawing all widgets using drawVertices from now on ;)

    • @filiphracek
      @filiphracek  Рік тому +4

      Lol. Yes. It also helps to render all text via Vertices.raw, inputting each vertex by hand while juggling a chainsaw.

  • @mkc11267
    @mkc11267 Рік тому

    Awesome!!

  • @alexandergorny
    @alexandergorny Рік тому +1

    Yes nerdy, but love it! feels like first days of creating assembler triangles on vc20 ;) So curious about your SciFi UIs, please share !!!

  • @iy908
    @iy908 Рік тому

    Please do more videos about high performance flutter/dart! Like how to use SIMD operations in flutter or own implementation of spatial interpolation algo and so on

  •  Рік тому +1

    I think I have a gold rush because this is gold! This is exactly what I needed. So now what I understood is that it's the Float32List is what makes things fast not drawVertices() as much?

    • @filiphracek
      @filiphracek  Рік тому +3

      Pretty much, yes. TypedData, if you keep it around, makes things go fast. (On the other hand, if you create (and then throw away) a big chunk of typed data every frame, then it might easily be slower.)

    • @SecondFlight
      @SecondFlight Рік тому

      It also seems that drawVertices() is a lot closer to the equivalent graphics API call than something like drawLine(). This means Flutter basically doesn't need to transform the data you send it before handing it to the GPU, which I imagine helps quite a bit as well.

  • @SimonNielsen-zm7mq
    @SimonNielsen-zm7mq Рік тому

    Nice! Will it be possible for you to share the comparison app?

  • @tluanga-ruatpuii-pa
    @tluanga-ruatpuii-pa Рік тому

    Can you please release a video about your desk setup

  • @TheDescrout
    @TheDescrout Рік тому +2

    While looking at the drawVertices docs I saw that flutter also has drawAtlas(and drawRawAtlas) methods. Would these be better for drawing a lot of images ? Also in your example the image in the polygon is not rotating. I assume it could be rotated via some sort of UV coordinates binding. I see that drawAtlas method supports all sort of transformations like scale and rotation that could make our life easier but maybe at the cost of a little performance ?

  • @RioM8z
    @RioM8z Рік тому

    You seem to prefer Android Studio as your editor ?! Isn't the little program that is an example available ?

  • @aytunch
    @aytunch 9 місяців тому

    Hi Filip, will you make the source code of the snowflake benchmark available? On part you did not mention int he talk was how you are changing the positions of all the vertices. SO it would be very helpful to see the code. Thanks

  • @MohamedSalah-pi7fn
    @MohamedSalah-pi7fn Рік тому

    This is awesome ❤️

  • @erlangparasu6339
    @erlangparasu6339 Рік тому

    Great! Thanks 👍

  • @AntonioBrandao
    @AntonioBrandao Рік тому +1

    29:44 can these drawn shapes be tapped / made interactive with a GestureDetector or so? How would the hit area work there?

  • @ttv_tej
    @ttv_tej Рік тому +1

    Gonna start Flutter again I did first start in 2017

  • @rlrl5879
    @rlrl5879 Рік тому +2

    Have you tried running this demo on an ios device with impeller enabled? I have an app with some very complex scenes like this that runs fine in skia, but locks up on impeller. I still need to dig into what is goin on, but Im curious if you would see the same with this demo.

  • @nonnulls
    @nonnulls Рік тому

    Please, can you add a link to repo with source code to the description?

  • @mrverdant13
    @mrverdant13 Рік тому

    I really love this video
    I wonder how could we add interactivity tho

  • @_AnikSaha
    @_AnikSaha 13 днів тому

    Gem💎

  • @SirJohn2024
    @SirJohn2024 Рік тому +16

    Nerdy... But interesting... Basically you can build a 3D engine on top of that, Flutreal Engine maybe? 😏

    • @hyungtaecf
      @hyungtaecf Рік тому +3

      Or Flame 3D

    • @KennyFully
      @KennyFully Рік тому

      I’m tired of flame. I’m going to do it myself.

  • @musoftware
    @musoftware Рік тому

    I felt the felling of OpenGL 2 era. Ah... That nostalgic glVertex3f function...

  • @theforestapp
    @theforestapp Рік тому

    can you recommend any reading material on using the raw vertices/float lists?

    • @filiphracek
      @filiphracek  Рік тому

      I was going from the docs, tbh. They're terse, but they have everything you'll need.

  • @zainroyan1556
    @zainroyan1556 Рік тому

    Love your content, but iam interested as to how can u make ur vs code transparent

  • @dokinds
    @dokinds Рік тому

    nice work @Flip :)

  • @DominikRoszkowski
    @DominikRoszkowski Рік тому +1

    I find it funny that it's indices that overflow, not positions or the list length. The fact that it takes 5 indices for 1 snow-flake made me a little bit puzzled at first ;)

    • @filiphracek
      @filiphracek  Рік тому

      Yeah, I started the experimentation with polygons (any n-gon), so it was easiest to have a vertex in the middle and draw triangles from there. It also made it easier to draw the kind of gradients I wanted. Ideally, I should have rewritten the code for the special case of a rectangle, where you need 1 less vertex and _half_ the triangles... Welp. Next time! :)

  • @babydoll-li9ng
    @babydoll-li9ng Рік тому

    What should we do to fastest the widget build ?

  • @gaosdatastory8884
    @gaosdatastory8884 Рік тому

    Hi filip, Question for you. Can I use Flame in Flutter Casual Games Toolkit? I am a newbie to Flutter Casual Games Toolkit. Not sure if I can use flame in Flutter Casual Games Toolkit or not.

  • @kausikmr
    @kausikmr Рік тому

    Canvas.drawVertices is not Anti Aliased even after adding the antiAliased = true in the Paint(). Is there a solution for this @Filip Hráček ?

  • @becbelk
    @becbelk Рік тому

    Good idea that the vertex eat from the buffer of the next data

  • @atmega3212
    @atmega3212 Рік тому

    It's kinda like OpenGl, I love it

  • @odewoleabdul-jemeel8859
    @odewoleabdul-jemeel8859 Рік тому

    This is awesome. Where can we get the source code?

  • @chiefolk
    @chiefolk Рік тому

    51:00 because indices is a typed data of Uint16List which can only hold values from 0 to 65,535. so when we are trying to index from positions maybe greater than that it's breaking it??

    • @chiefolk
      @chiefolk Рік тому

      so when there are more than 65,536 positions in the positions list and indices array is trying address them but it cannot be fit in 16 bits?

    • @chiefolk
      @chiefolk Рік тому

      55:00 yeah i was close ✨

  • @shubhamyeole2881
    @shubhamyeole2881 Рік тому +1

    First comment before watching... 😀

  • @Pewdew
    @Pewdew 11 місяців тому

    Is it possible to prepaint custom painters? I can't figure it out how to fix bad performance. I have 15 custom painter widgets and 10 fps😢

    • @filiphracek
      @filiphracek  11 місяців тому

      Interesting. I admit I've never seen an issue like that. Are you updating them all every frame? Because if not, CustomPainter shouldRepaint() is your friend.

    • @Pewdew
      @Pewdew 11 місяців тому

      @@filiphracek i turn phone, tilt changes and blocbuilder rebuild CustomPainters with new state. Also these custom painters are similar. Is there any way to paint it once and share to all my widget? Because each paint spent time.

  • @yf4453
    @yf4453 Рік тому +1

    What theme is he using?

    • @filiphracek
      @filiphracek  Рік тому +2

      The theme is called "high contrast" or something like that.

  • @danielduvana
    @danielduvana Рік тому

    Is it not possible to draw circles with drawVertices? What's the most performant way to draw circles? Just Canvas.drawCircle?

    • @filiphracek
      @filiphracek  Рік тому +2

      Yes, drawCircle is really fast. You could use vertices to draw a circle-like polygon but I'm almost sure it would not give you any performance boost (possibly the opposite).

  • @Kiriyaki65548
    @Kiriyaki65548 Рік тому

    🚀 🚀 🚀 🚀 🚀

  • @cycomkid
    @cycomkid Рік тому

    Hoping shaders deepdive

  • @LuisFernandez-cz7gb
    @LuisFernandez-cz7gb 2 місяці тому

    code example please 😊😊

  • @coldwolf5050
    @coldwolf5050 Рік тому

    Will you put this on github?

  • @ankitverma3932
    @ankitverma3932 Рік тому

    how do i get this code?

  • @henryriehl2058
    @henryriehl2058 Рік тому

    One very small thing, but you could probably improve the performance a bit for the widget side of things by using valueNotifier with a listenable builder :) Currently the Stack, ColouredBox and SizedBox widgets are being rebuilt unnecessarily.

  • @AmazingGrace0412
    @AmazingGrace0412 Рік тому

    Please bring Native integration with cockroachdb and interfaces like algolia 💪

  • @himmelkami3308
    @himmelkami3308 Рік тому

    for one day , real game engine built by flutter.

  • @babydoll-li9ng
    @babydoll-li9ng Рік тому

    can you please share me the code ?

  • @DmitriiGordeev
    @DmitriiGordeev Рік тому

    This is not black magic )

  • @RaphaëlRail
    @RaphaëlRail Рік тому

    How does it work by providing "this" as TickerProvider ?

  • @ghost_7701
    @ghost_7701 Рік тому

    Me watching this is like monkey watching surgery 😂😂
    But I really enjoyed it and I hope one day that I become on that level of understanding 🫡

    • @filiphracek
      @filiphracek  Рік тому +1

      Trust me, if I was watching this a year ago, I would feel the same. It's low-level and confusing. But once I tried (and failed) to wield this API a couple of times, it clicked.

    • @ghost_7701
      @ghost_7701 Рік тому

      ​@@filiphracek I will give it a try I love these challenges.
      Thanks for the inspiration.