Autor Wątek: wczytywać tą samą teksturę raz czy wiele razy?  (Przeczytany 3608 razy)

Offline zajmundov

  • Użytkownik

# Maj 01, 2014, 20:04:08
Zastanawiam się jak to wszystko powinno być poprawnie...
Jak jest najlepiej według was:

    SDL_Texture* obrazek1 = LoadTexture( "obrazek.png" );
    SDL_Texture* obrazek2 = obrazek1;


Czy może tak:
    SDL_Texture* obrazek1 = LoadTexture( "obrazek.png" );
    SDL_Texture* obrazek2 = LoadTexture( "obrazek.png" );


Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline rafal3920

  • Użytkownik

  • +7
# Maj 01, 2014, 20:34:11
A po co w ogóle wczytywać 2 razy?

Offline zajmundov

  • Użytkownik

# Maj 01, 2014, 21:14:13
czyli mogę poprostu przypisywać?

Offline Kitsune

  • Użytkownik

# Maj 01, 2014, 22:08:46
Nie znam się za bardzo na SDL ale.. ogólna zasada jest taka; jeżeli dwa (lub więcej) obiektów (obiekty w grze) wykorzystują tę samą teksturę, wczytujesz ją TYLKO raz, a obiekty (np. prosta klasa gracza) przechowują tylko wskaźniki do niej. NIE MARNUJ ZASOBÓW PAMIĘCI !!! :P

Offline flexi

  • Użytkownik

# Maj 01, 2014, 22:38:58
Napisz sobie prosty tak zwany 'ResourceManager'.

Pseudo kod jak to dziala
class MyPlayer
{
public:
     MyPlayer() {
      t = ResourceManager::Instance()->GetResource<Texture>("myplayer.png"); /* jesli jest juz wczytane to zwroci wskaznik, a jak nie jest wczytane to wczyta i zwroci wskaznik */
     }
private:
     Texture* t;
};

Jesli cos takiego napiszesz poprawnie to będzie mogło także działać z dźwiękami itp.

Offline zajmundov

  • Użytkownik

# Maj 01, 2014, 23:46:30
Kiedyś napisałem sobie coś co miało przypominać managera spritów i jakoś funkcjonowało :) I właśnie tekstury były wczytywane tylko raz na samym początku, a potem tylko przypisywałem. I się tak teraz zastanawiałem ale jednak dobrze chyba wymyślałem :P Wrzucę kodzik może się komuś przyda (stary SDL)
Pozdrowion!

#ifndef SPRITEMANAGER_H
#define SPRITEMANAGER_H

#include <string>
#include <map>

#include "SDL.h"

class GSMapEditor;
class Sprite;

class SpriteManager
{
public:
SpriteManager()
{
m_spritesLoadedSuccessfully = false;
LoadSprites();
}

bool GetSprite( Sprite& sprite, std::string spriteName );
bool SpritesLoadedSuccessfully( void ) const { return m_spritesLoadedSuccessfully; }
SDL_Surface* LoadSurface( std::string path );

std::map<std::string, SDL_Surface*>& GetSDLSurfaceMap( void ) { return m_SDLSurfaceMap; }

struct SpriteInfo
{
std::string m_name;
std::string m_path;
};

private:
void LoadSprites( void );

bool m_spritesLoadedSuccessfully;
std::map<std::string, SDL_Surface*> m_SDLSurfaceMap;
};

#endif

#include "SpriteManager.h"
#include "Game.h"
#include "Sprite.h"

#include "SDL_image.h"
#include <iostream>
#include <fstream>
#include <vector>

bool SpriteManager::GetSprite( Sprite& sprite, std::string spriteName )
{
if( !SpritesLoadedSuccessfully() )
return false;

std::map<std::string, SDL_Surface*>::iterator it = m_SDLSurfaceMap.find( spriteName );

if( it != m_SDLSurfaceMap.end() )
{
sprite.m_surface = it->second;
sprite.m_name = spriteName;
return true;
}

else
{
std::cout << "Nie istnieje plik graficzny o nazwie:\t" << spriteName << std::endl;
return false;
}

return false;
}

SDL_Surface* SpriteManager::LoadSurface( std::string path )
{
SDL_Surface* loadedImage = NULL;
SDL_Surface* optimizedImage = NULL;

loadedImage = IMG_Load( path.c_str() );
optimizedImage = SDL_DisplayFormat( loadedImage );

return optimizedImage;
}

void SpriteManager::LoadSprites( void )
{
std::ifstream sprites;
sprites.open( "pliki/grafika/grafika.txt" );

if( sprites )
{
std::vector<SpriteInfo> spriteInfoVector;

while( !sprites.eof() )
{
SpriteInfo info;

sprites >> info.m_name;
sprites >> info.m_path;

spriteInfoVector.push_back( info );
}

sprites.close();

for( std::vector<SpriteInfo>::const_iterator cit = spriteInfoVector.begin() ; cit != spriteInfoVector.end() ; ++cit )
{
if( ( m_SDLSurfaceMap[cit->m_name] = IMG_Load( cit->m_path.c_str() ) ) != NULL )
{
m_spritesLoadedSuccessfully = true;
std::cout << "Wczytalem:\t" << cit->m_path << std::endl;
}

else
{
m_spritesLoadedSuccessfully = false;
std::cout << "Blad wczytania:\t" << cit->m_path << std::endl;

break;
}
}
}

else
{
m_spritesLoadedSuccessfully = false;
std::cout << "Blad otwarcia pliku:\tpliki/grafika/grafika.txt" << std::endl;
}
}

Offline Estivo

  • Użytkownik
    • Blog

# Maj 02, 2014, 00:06:30
Może najprościej to zobrazuje pytaniem - pomalować jeszcze raz świeżo pomalowaną ścianę?

Offline Krzysiek K.

  • Moderator
    • DevKK.net

  • +11
# Maj 02, 2014, 00:49:04
Może najprościej to zobrazuje pytaniem - pomalować jeszcze raz świeżo pomalowaną ścianę?
Jeżeli słabo kryje - oczywiście że tak.

Offline Estivo

  • Użytkownik
    • Blog

# Maj 02, 2014, 16:23:52
Od razu najczarniejszy scenariusz ;p

Offline Krzysiek K.

  • Moderator
    • DevKK.net

  • +2
# Maj 02, 2014, 17:54:05
Od razu najczarniejszy scenariusz ;p
Najczarniejszy? Powiedział bym, że typowy [1]. ;)


[1] http://malarz.blox.pl/2014/01/Ile-razy-trzeba-malowac-sciany-i-sufit.html