Re: Drawing a lot of SVG images is slow
Igor Korot <[email protected]> Tue, 1 Apr 2025 13:27:54 -0500
| Newsgroups | gmane.comp.lib.wxwindows.general |
|---|---|
| Message-ID | <CA+FnnTz5pTUBHJCVjffY+3jbyR19=9OSUHT9StOvnBG1Kjy3Og@mail.gmail.com> |
Hi, Sorry for top-posting, but… What platform are you on? What wx version? Are you working with Debug build? Choosing wxWidgets for the game is kind of weird - are you sure about that? Thank you. On Tue, Apr 1, 2025 at 12:36 PM Quentin Cosendey < [email protected]> wrote: > Hello, > > I'm developing a game. I'm trying to use SVG images to draw the board > and all game elements (tokens, dice, etc.). > I wanted to use SVG because it allows the board to be seen all at once > and have its size adapted to the size of the window, i.e. fill the > window as much as possible / make the board as big as possible, without > pixelization effects. It also allows the user to customize the color of > some game elements (for example tokens) quite easily, as well as select > their own colors to make their own dark or high-contrast mode. All this > is good for visually impaired players. > > However, displaying everything (~1000 elements) seems to be quite slow, > and it makes the interface lagging globally. It takes hundreds of > milliseconds to update the screen after having pressed a key and/or > moved the mouse. > Am I doing something wrong ? Do you have ideas on how I could improve > performances ? > > Drawing code looks as follows, I have tried to simplify it a little: > > void GameWindow::OnPaint (wxPaintEvent& e) { > wxAutoBufferedPaintDC dc(this); > std::unique_ptr<wxGraphicsContext> g(wxGraphicsContext::Create(dc)); > ... > for (auto& square: squares) { > wxRect pos = ... ; // boundaries of the square > g->ResetClip(); > g->Clip(pos); > for (std::string& image: square.getElements()) { > auto bundle = app.getImage(image); > wxSize defaultSize = bundle.GetDefaultSize(); > wxSize finalImageSize = > calcGreatestPossibleSize(wxSize(pos.width, pos.height), defaultSize); > auto bitmap = bundle.GetBitmap(finalImageSize); > if (bitmap.IsOk()) { > finalImageSize = bitmap.GetSize(); > g->DrawBitmap(bitmap, pos.x, pos.y, finalImageSize.x, > finalImageSize.y); > } > } > g->ResetClip(); > } > } > > > Loading code: wxImageBundle are stored in a > std::unordered_map<std::string, wxImageBundle> . > Using a simple array instead of the map and indexing images by index > instead of by name doesn't make a lot of difference, I have already tested. > > wxBitmapBundle App::getImage (const std::string& name) { > auto it = images.find(name); > if (it!=images.end()) return it->second; > wxString svgfn = "images/" + name + ".svg"; > if (!svgfn.size()) return wxBitmapBundle(); // not found, return > empty bundle > wxSize imSize = readSVGImageSize(svgfn); > auto bundle = wxBitmapBundle::FromSVGFile(svgfn, imSize); > images[name] = bundle; > return bundle; > } > > The SVG images used are extremely simple for the moment, there are no > complex things: basic shapes, polygons, polylines, paths; plain fill and > stroke colors, no gradients or stuff like that. > Most squares have always the same size if the window isn't resized. > > In case it can make a difference, GameWindows extends wxControl, > wxVarHVScrollHelper, wxAccessible > > Where could the problem be ? > > As far as I understand, the method wxImageBundle::GetBitmap basically > renders the SVG in a traditional in-memory bitmap. Is that really > necessary ? Isn't there a more direct way to draw SVG images ? > The documentation says that generated bitmaps are cached, so since the > size don't change unless the window is resized, it shouldn't be a > problem, right ? > > Is SVG support in WX just not made for that kind of thing ? > In this case do you have an alternate SVG library integrable with WX to > advise ? > > Thank you very much for your answers ! > > -- > Please read https://www.wxwidgets.org/support/mlhowto.htm before posting. > --- > You received this message because you are subscribed to the Google Groups > "wx-users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To view this discussion visit > https://groups.google.com/d/msgid/wx-users/6b90542c-47af-48da-9851-883ece612e48%40bluewin.ch > . > -- Please read https://www.wxwidgets.org/support/mlhowto.htm before posting. --- You received this message because you are subscribed to the Google Groups "wx-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion visit https://groups.google.com/d/msgid/wx-users/CA%2BFnnTz5pTUBHJCVjffY%2B3jbyR19%3D9OSUHT9StOvnBG1Kjy3Og%40mail.gmail.com.