Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Czy trzymać sf::RectangleShape w pamięci oraz inteligentne wskaźniki

Ostatnio zmodyfikowano dzisiaj: 25 min
Autor Wiadomość
tBane
Temat założony przez niniejszego użytkownika
Czy trzymać sf::RectangleShape w pamięci oraz inteligentne wskaźniki
» 2025-10-28 13:18:15
Cześć. Za radą pekfosa przepisuje kod mojego programu w taki sposób, by nie trzymać sf::Sprite w pamięci i generować je tylko podczas renderowania.
Mam jednak kolejne pytanie. Często w moim programie korzystam z sf::RectangleShape i też je trzymam w pamięci. Czy potraktować je tak samo jak sf::Sprite i zastąpić przez sf::IntRect do obliczeń?

C/C++
class ColoredButtonWithText {
public:
   
sf::RectangleShepe _rect;
   
sf::Text * _text;
   
sf::Color _selectColor;
   
sf::Color _idleColor;
   
sf::Color _hoverColor;
   
sf::Color _pressColor;
   
   
sf::Vector2f _position;
   
   
ButtonState _state;
   
std::function < void() > _hover_func;
   
std::function < void() > _onclick_func;
   
sf::Time _clickTime;
   
   
   
ColoredButtonWithText( std::wstring text, sf::Vector2f size, sf::Vector2f position = sf::Vector2f( 0, 0 ) );
   
~ColoredButtonWithText();
};
P-183298
tBane
Temat założony przez niniejszego użytkownika
» 2025-10-28 13:50:12
Tak jest dobrze?

C/C++
void ColoredButtonWithText::draw() {
   
   
sf::RectangleShape rect( sf::Vector2f( _rect.size ) );
   
switch( _state ) {
   
case ButtonState::Pressed:
       
rect.setFillColor( _pressColor );
       
rect.setOutlineThickness( dialog_border_width );
       
rect.setOutlineColor( sf::Color( dialog_border_color ) );
   
case ButtonState::Hover:
       
rect.setFillColor( _hoverColor );
       
rect.setOutlineThickness( dialog_border_width );
       
rect.setOutlineColor( sf::Color( dialog_border_color ) );
   
case ButtonState::Idle:
       
if( _isSelected ) {
           
rect.setFillColor( _selectColor );
           
rect.setOutlineThickness( dialog_border_width );
           
rect.setOutlineColor( sf::Color( dialog_border_color ) );
       
}
       
else {
           
rect.setFillColor( _idleColor );
           
rect.setOutlineThickness( dialog_border_width );
           
rect.setOutlineColor( sf::Color( dialog_border_color ) );
       
};
   
};
   
rect.setPosition( _position );
   
window->draw( rect );
   
   
window->draw( * _text );
}
P-183299
DejaVu
» 2025-10-28 13:52:16
Doczytaj po prostu które operacje są ciężkie. Ciężkie jest ładowanie sf::Image oraz sf::Texture do pamięci. Ciężkie są też operacje związane z fontami (wczytanie ich do pamięci). Pozostałe operacje zazwyczaj są lekkie.
P-183300
tBane
Temat założony przez niniejszego użytkownika
» 2025-10-28 14:06:32
O to chodzi?

sf::RectangleShape
Size: 352 bytes
Alignmanet: 8 bytes

sf::Sprite
Size: 280 bytes
Alignmanet: 8 bytes

P-183301
DejaVu
» 2025-10-28 14:13:48
Chodzi o to co robi w rzeczywistości klasa. Przykładowo:
- sf::Image: musi zdekompresować plik *.png lub *.jpg czyli wykonać złożony algorytm przy wczytywaniu obrazku - im większy obraz tym więcej obliczeń, aby utworzyć zdekompresowany obraz w postaci pikseli.
- sf::Texture: musi wziąć obraz (wszystkie piksele) i przekopiować je z z RAM (CPU) do VRAM (GPU), aby móc je efektywnie później wykorzystywać używając nadanego ID.
- sf::Font: podobny scenariusz jak wyżej.
- sf::Sprite: musi wziąć 'identyfikator' tekstury, ustawić pozycję i rozmiar i wysłać te metadane do GPU, aby to wyświetliło - po stronie CPU nie ma praktycznie pracy (i o to chodzi).
- sf::RectangleShape: musi wysłać metadane do GPU (gdzie ma być prostokąt, jakiego ma być koloru ramka) - po stronie CPU nie ma praktycznie pracy, bo wysyłasz małą ilość informacji do GPU (kilka instrukcji OpenGL).
P-183302
tBane
Temat założony przez niniejszego użytkownika
» 2025-10-28 14:35:18
Kurde a ja już przepisałem wszystkie sf::RectangleShape. Tak samo jak sprajty by ograniczyć zużycie pamięci
P-183303
tBane
Temat założony przez niniejszego użytkownika
» 2025-10-28 14:55:34
I co teraz? cofnąć te zmiany ?

-sf::Sprite generowany tylko w funkcjach draw()
-sf::RectangleShape przerobiony na sf::IntRect i generowany tylko w funkcjach draw()
P-183304
skovv
» 2025-10-28 15:45:19
Moim zdaniem przy tak mały programie nie warto się bawić w zbytnie optymalizacje bo normalny komputer nie powinien się nawet zająknąć przy tak małym poborze ram i procka.. A jak za dużo pokombinujesz to przy odrobinie niefarta jeszcze coś popsujesz
P-183305
« 1 » 2 3 4 5
  Strona 1 z 5 Następna strona