tBane Temat założony przez niniejszego użytkownika |
Sety - czyli zbiory tekstur i powtarzające się elementy » 2024-10-25 14:29:25 Witam. Mam takie pytanie. W moich setach powtarzają się niektóre elementy. Czy to ma jakieś znaczenie ? Czy to jakoś optymalizować ? |
|
DejaVu |
» 2024-10-25 15:24:05 Nie ma sensu optymalizować przedwcześnie. Ważniejsze jest to, aby trzymać w pamięci teksturę tylko raz, aniżeli minimalizować ilość 'tilesów'. Dopiero przy tysiącu tilesów zacząłbym się zastanawiać 'czy coś warto zrobić inaczej'. Na wczesnym etapie developmentu to po prostu stosowałbym zasadę 'keep it simple'. |
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-10-25 15:32:27 A może jakoś porównywać tekstury i jeżeli znajdzie się taka sama tekstura to wtedy "je scalić" w jedną ? |
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-10-25 17:32:47 Wczytywanie Prefabrykatów z tekstur: std::vector < string > walls_names; walls_names.push_back( "walls/mud_wall_" ); walls_names.push_back( "walls/stone_wall_" ); walls_names.push_back( "walls/wooden_wall_" );
for( auto & texture: textures ) { for( auto & name: walls_names ) { if( texture->name.find( name ) != std::string::npos ) { prefabs.push_back( new Wall( texture->name, 32, 32, 32 ) ); } } }
|
|
pekfos |
» 2024-10-25 18:03:58 A może jakoś porównywać tekstury i jeżeli znajdzie się taka sama tekstura to wtedy "je scalić" w jedną ? Wiele starych gier ma 1 tileset na całą grę i tyle, bo to jest dobre wykorzystanie ograniczonych zasobów. Dzisiaj masz tyle zasobów, że musiałbyś się postarać żeby je wyczerpać taką grą, więc lepiej jest sobie zorganizować dane w mniej optymalny sposób, ale łatwiejszy w użyciu. Tilesety które pokazałeś są dość logicznie zorganizowane więc w edytorze nie musisz się zastanawiać jaki kafel jest właściwy do użycia, tego samego nie można powiedzieć o jednym tilesecie który był dopychany kolanem by zmieścić wszystko. Możesz oczywiście sobie zrobić automatyczne scalanie tekstur do jednego lub kilku tilesetów, ale to jest trud którego efektu nawet nie zauważysz, więc raczej masz lepsze rzeczy do roboty. |
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-10-25 19:11:56 Za późno - już prawie napisałem. Nie działa mi tylko porównywanie tekstur znaczy sie sf::Image bool areImagesEqual( sf::Image & img1, sf::Image & img2 ) { if( img1.getSize() != img2.getSize() ) { return false; } for( unsigned int y = 0; y < img1.getSize().y; y++ ) { for( unsigned int x = 0; x < img1.getSize().x; x++ ) { if( img1.getPixel( x, y ) != img2.getPixel( x, y ) ) { return false; } } } return true; }
void loadTextureSets( string pathfile, short tile_width, short tile_height ) { sf::Texture texture; texture.loadFromFile( "assets/" + pathfile + ".png" ); short texture_width = texture.getSize().x; short texture_height = texture.getSize().y; int counter = 0; for( short y = 0; y < texture_height; y += tile_height ) for( short x = 0; x < texture_width; x += tile_width ) { sf::Texture tile; tile.loadFromImage( texture.copyToImage(), sf::IntRect( x, y, tile_width, tile_height ) ); sf::Image img1 = tile.copyToImage(); bool exist = false; for( short i = 0; i < textures.size(); i++ ) { sf::Image img2 = textures[ i ]->texture->copyToImage(); if( areImagesEqual( img1, img2 ) ) { cout << "sa rowne\n"; exist = true; break; } } if( exist == false ) { Texture * new_texture = new Texture( pathfile + "_" + to_string( counter ), tile ); cout << "created texture: " << pathfile + "_" + to_string( counter ) << "\n"; textures.push_back( new_texture ); counter += 1; } } }
|
|
pekfos |
» 2024-10-25 19:27:49 sf::Texture to konkretnie tekstura na karcie graficznej, ładowanie odbywa się zawsze przez sf::Image. Powinieneś raczej robić wszystko na sf::Image (CPU) i dopiero wynikowy zestaw tekstur załadować na GPU, zamiast przerzucać dane wte i we wte, momentami kilka razy pod rząd bez wyraźnego powodu. |
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-10-25 19:32:59 Teraz wszystko działa :-) @pekfos Nie wiem jak działać z sf::Image, próbowałem i poległem bool areImagesEqual( sf::Image & img1, sf::Image & img2 ) { if( img1.getSize() != img2.getSize() ) { return false; } for( unsigned int y = 0; y < img1.getSize().y; y++ ) { for( unsigned int x = 0; x < img1.getSize().x; x++ ) { if( img1.getPixel( x, y ) != img2.getPixel( x, y ) ) { return false; } } } return true; }
void loadTextureSets( string pathfile, int tile_width, int tile_height ) { sf::Texture tex; tex.loadFromFile( "assets/" + pathfile + ".png" ); short texture_width = tex.getSize().x; short texture_height = tex.getSize().y; cout << texture_width << "x" << texture_height << "\n"; int counter = 0; for( short y = 0; y < texture_height; y += tile_height ) for( short x = 0; x < texture_width; x += tile_width ) { sf::Texture * tile = new sf::Texture(); tile->loadFromImage( tex.copyToImage(), sf::IntRect( x, y, tile_width, tile_height ) ); sf::Image img1 = tile->copyToImage(); bool existed = false; for( short i = 0; i < textures.size(); i++ ) { sf::Image img2 = textures[ i ]->texture->copyToImage(); if( areImagesEqual( img1, img2 ) ) { cout << "sa rowne\n"; existed = true; break; } } if( existed == false ) { Texture * new_texture = new Texture( pathfile + "_" + to_string( counter ), tile ); textures.push_back( new_texture ); counter += 1; } } }
|
|
« 1 » 2 |