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

แชร์
ฝัง
  • เผยแพร่เมื่อ 24 ธ.ค. 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

  • @mahmood466
    @mahmood466 ปีที่แล้ว +1

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

  • @thanhdatvo0
    @thanhdatvo0 ปีที่แล้ว +1

    We missed you! Welcome back!

  • @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?

  • @imaNNeO
    @imaNNeO ปีที่แล้ว +4

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

  • @yf4453
    @yf4453 ปีที่แล้ว

    Amazing talk. Thakn you!

  • @CodeWithImem
    @CodeWithImem 9 หลายเดือนก่อน

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

  • @jjny916
    @jjny916 ปีที่แล้ว

    This is excellent and incredibly valuable content. Thank you.

  • @Andreasonline3
    @Andreasonline3 ปีที่แล้ว

    absolutley dope keen to see more

  • @Dotafreak
    @Dotafreak ปีที่แล้ว +2

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

  • @dhruvinvainsh743
    @dhruvinvainsh743 ปีที่แล้ว +1

    This is superb

  • @reacct1002
    @reacct1002 ปีที่แล้ว

    Thanks Filip!

  • @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.

  • @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 👍🏽

  • @Apenschi
    @Apenschi ปีที่แล้ว

    VERY good! Thanks!

  • @mivoligo
    @mivoligo ปีที่แล้ว

    Just wanted to say Thank You! ❤

  • @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

  • @Hamiiidev
    @Hamiiidev ปีที่แล้ว +1

    Great. waiting for Flutter Forward analysis.

  • @pankajkoirala6563
    @pankajkoirala6563 ปีที่แล้ว

    Really happy to watch such content :)

  • @SmashHighlights
    @SmashHighlights ปีที่แล้ว +1

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

  • @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 ✨

  • @CarlosHenrique-er7zq
    @CarlosHenrique-er7zq ปีที่แล้ว

    Amazingggg video! Thanks for it

  • @giiyms4408
    @giiyms4408 ปีที่แล้ว

    Thanks Filip. Keep it up. Learning a lot!

  • @saqibshafin
    @saqibshafin ปีที่แล้ว

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

  • @SimonNielsen-zm7mq
    @SimonNielsen-zm7mq ปีที่แล้ว

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

  • @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.

  • @محمدمهدی-س2ط
    @محمدمهدی-س2ط ปีที่แล้ว

    great. love your way.

  • @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

  • @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.

  • @mkc11267
    @mkc11267 ปีที่แล้ว

    Awesome!!

  • @tluanga-ruatpuii-pa
    @tluanga-ruatpuii-pa ปีที่แล้ว

    Can you please release a video about your desk setup

  • @mojtabana6322
    @mojtabana6322 ปีที่แล้ว

    thanks for sharing

  • @aytunch
    @aytunch ปีที่แล้ว

    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

  • @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 😂

  • @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.

  • @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 ?

  • @MohamedSalah-pi7fn
    @MohamedSalah-pi7fn ปีที่แล้ว

    This is awesome ❤️

  • @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.

  • @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 !!!

  • @ttv_tej
    @ttv_tej ปีที่แล้ว +1

    Gonna start Flutter again I did first start in 2017

  • @nonnulls
    @nonnulls ปีที่แล้ว

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

  • @RioM8z
    @RioM8z ปีที่แล้ว

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

  • @Pewdew
    @Pewdew ปีที่แล้ว

    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  ปีที่แล้ว

      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 ปีที่แล้ว

      @@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.

  • @mrverdant13
    @mrverdant13 ปีที่แล้ว

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

  • @dokinds
    @dokinds ปีที่แล้ว

    nice work @Flip :)

  • @kronoszombieguidesapp
    @kronoszombieguidesapp ปีที่แล้ว

    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.

  • @babydoll-li9ng
    @babydoll-li9ng ปีที่แล้ว

    What should we do to fastest the widget build ?

  •  ปีที่แล้ว +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.

  • @erlangparasu6339
    @erlangparasu6339 ปีที่แล้ว

    Great! Thanks 👍

  • @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' ! 🤓

  • @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 ?

  • @zainroyan1556
    @zainroyan1556 ปีที่แล้ว

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

  • @yf4453
    @yf4453 ปีที่แล้ว +1

    What theme is he using?

    • @filiphracek
      @filiphracek  ปีที่แล้ว +2

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

  • @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.

  • @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! :)

  • @ankitverma3932
    @ankitverma3932 ปีที่แล้ว

    how do i get this code?

  • @_AnikSaha
    @_AnikSaha 2 หลายเดือนก่อน

    Gem💎

  • @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

  • @musoftware
    @musoftware ปีที่แล้ว

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

  • @odewoleabdul-jemeel8859
    @odewoleabdul-jemeel8859 ปีที่แล้ว

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

  • @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).

  • @coldwolf5050
    @coldwolf5050 ปีที่แล้ว

    Will you put this on github?

  • @LuisFernandez-cz7gb
    @LuisFernandez-cz7gb 5 หลายเดือนก่อน

    code example please 😊😊

  • @cycomkid
    @cycomkid ปีที่แล้ว

    Hoping shaders deepdive

  • @babydoll-li9ng
    @babydoll-li9ng ปีที่แล้ว

    can you please share me the code ?

  • @shubhamyeole2881
    @shubhamyeole2881 ปีที่แล้ว +1

    First comment before watching... 😀

  • @Kiriyaki65548
    @Kiriyaki65548 ปีที่แล้ว

    🚀 🚀 🚀 🚀 🚀

  • @himmelkami3308
    @himmelkami3308 ปีที่แล้ว

    for one day , real game engine built by flutter.

  • @AmazingGrace0412
    @AmazingGrace0412 ปีที่แล้ว

    Please bring Native integration with cockroachdb and interfaces like algolia 💪

  • @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.

  • @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.