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

Sety - czyli zbiory tekstur i powtarzające się elementy

Ostatnio zmodyfikowano 2024-10-26 18:00
Autor Wiadomość
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ć ?

P-181755
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'.
P-181756
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ą ?
P-181758
tBane
Temat założony przez niniejszego użytkownika
» 2024-10-25 17:32:47
Wczytywanie Prefabrykatów z tekstur:

C/C++
// WALLS
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 ) );
       
}
    }
}
P-181759
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.
P-181761
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

C/C++
bool areImagesEqual( sf::Image & img1, sf::Image & img2 ) {
   
if( img1.getSize() != img2.getSize() ) {
       
return false; // Rozmiary są różne
   
}
   
   
// Porównaj każdy piksel
   
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; // Piksele są różne
           
}
        }
    }
   
return true; // Wszystkie piksele są identyczne
}

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;
   
   
//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 ) {
       
       
// create tile - fragment of texture
       
sf::Texture tile;
       
tile.loadFromImage( texture.copyToImage(), sf::IntRect( x, y, tile_width, tile_height ) );
       
sf::Image img1 = tile.copyToImage();
       
       
// searching - exist doubles or no
       
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"; // not work
               
exist = true;
               
break;
           
}
        }
       
       
// if no exist then add
       
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;
           
       
}
    }
   
}
P-181762
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.
P-181763
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


C/C++
bool areImagesEqual( sf::Image & img1, sf::Image & img2 ) {
   
if( img1.getSize() != img2.getSize() ) {
       
return false; // Rozmiary są różne
   
}
   
   
// Porównaj każdy piksel
   
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; // Piksele są różne
           
}
        }
    }
   
return true; // Wszystkie piksele są identyczne
}

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 ) {
       
       
// create tile - fragment of texture
       
sf::Texture * tile = new sf::Texture();
       
tile->loadFromImage( tex.copyToImage(), sf::IntRect( x, y, tile_width, tile_height ) );
       
sf::Image img1 = tile->copyToImage();
       
       
// searching - exist doubles or no
       
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"; // not work
               
existed = true;
               
break;
           
}
        }
       
       
// if no exist then add
       
if( existed == 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;
           
       
}
    }
   
}
P-181764
« 1 » 2
  Strona 1 z 2 Następna strona