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

OpenGL glGenTextures(n, texture) - czas tworzenia tekstur w zaleznosci od parametru n

Ostatnio zmodyfikowano 2017-08-25 15:53
Autor Wiadomość
Nazgul
Temat założony przez niniejszego użytkownika
OpenGL glGenTextures(n, texture) - czas tworzenia tekstur w zaleznosci od parametru n
» 2017-08-25 00:36:27
Dzien dobry,
Mysle, ze oczywistym jest, ze kod
C/C++
GLuint textures[ 2 ];
glGenTextures( 2, textures );
Wykona sie szybciej niz
C/C++
GLuint textures[ 2 ];
glGenTextures( 1, & textures[ 0 ] );
glGenTextures( 1, & textures[ 1 ] );

Tylko zastanawia mnie o ile szybciej.. Czy to dziala jak dodawanie elementow std::list, czy bardziej jak std::vector?

Moze przedstawię analogie
C/C++
//Szybka wersja(czas jest proporcjonalny do n)
std::vector < int > v;
v.resize( 3 );
v[ 0 ] = 1;
v[ 1 ] = 2;
v[ 2 ] = 3;

//Wolna wersja(czas dla duzych n moze byc paskudnie olbrzymi)
std::vector < int > v;
v.push_back( 1 );
v.push_back( 2 ); // realokacja(pesymistycznie)
v.push_back( 3 ); //ponownie realokacja

// W liscie z tego co sie orientuje, to przez resize oszczedza sie tylko czas potrzebny na wyslanie żadania do systemu zeby przydzielil pamiec, ale w obu przypadkach czas jest proporcjonalny do n
( zakladam ze system przydziela miejsce w czasie niezaleznym od ilosci potrzebnej pamieci i aktualnego stanu calej pamieci )

Bede bardzie wdzieczny za pomoc
P-164287
pekfos
» 2017-08-25 00:42:40
Dlaczego to ma działać jak kontenery? Przecież w obu przypadkach cała potrzebna pamięć jest dana z góry. Skąd te pytanie? Myślisz że różnica jest na tyle duża, że opłaca się brać uchwyty na zapas?
P-164288
Nazgul
Temat założony przez niniejszego użytkownika
» 2017-08-25 00:57:25
W tym wszystkim nie wiem tylko jak zachowuje sie pamiec karty graficznej. Skoro oba przypadki sa rownowazne, to nie rozumiem dlaczego dali w ogole opcje generowania tablicy tekstur
P-164290
Kinexity
» 2017-08-25 01:11:01
Po pierwsze sprawdź, czy po kompilacji nie wychodzi tak naprawdę to samo - przy tak krótkich i mało zróżnicowanych dwóch wersjach kodu efekt może być ten sam.
P-164291
pekfos
» 2017-08-25 01:17:41
Zaszłość historyczna, pole do popisu dla implementacji sterowników, albo po prostu popularny use case. Jak potrzebujesz naraz kilku nowych tekstur, nie pisz pętli którą zrobiono za ciebie. A jeśli nie jest po drodze tworzyć tekstury hurtem, świat też się nie zawali, bo nawet jeśli jest różnica w wydajności, to przecież tworzenie tekstur to nie jest coś co robi się bez umiaru.
P-164292
Nazgul
Temat założony przez niniejszego użytkownika
» 2017-08-25 01:26:21
Minus dobrych kompilatorow - kompilator moze oba testowe kody skompilowac do takiej samej postaci:P sprobuje, chociaz obawiam sie, ze wyniki beda tak oscylowac, ze nic ciekawego z tego nie wywnioskuje
P-164293
Elaine
» 2017-08-25 02:05:03
Wolna wersja(czas dla duzych n moze byc paskudnie olbrzymi)
Dodawanie N elementów do wektora przy pomocy push_back zajmuje O(n) czasu, więc różnica między wersją "szybką" a "wolną" jest co najwyżej stała.

Minus dobrych kompilatorow - kompilator moze oba testowe kody skompilowac do takiej samej postaci:P
Nie znam żadnego kompilatora, który byłby w stanie tak zoptymalizować wywołania glGenTextures, bo z punktu widzenia kompilatora glGenTextures to zewnętrzna funkcja, o której nic nie wie.
P-164295
Nazgul
Temat założony przez niniejszego użytkownika
» 2017-08-25 15:05:21

Dodawanie N elementów do wektora przy pomocy push_back zajmuje O(n) czasu, więc różnica między wersją "szybką" a "wolną" jest co najwyżej stała.

http://www.cplusplus.com​/reference/vector/vector

Internally, vectors use a dynamically allocated array to store their elements. This array may need to be reallocated in order to grow in size when new elements are inserted, which implies allocating a new array and moving all elements to it. This is a relatively expensive task in terms of processing time, and thus, vectors do not reallocate each time an element is added to the container.

Instead, vector containers may allocate some extra storage to accommodate for possible growth, and thus the container may have an actual capacity greater than the storage strictly needed to contain its elements (i.e., its size). Libraries can implement different strategies for growth to balance between memory usage and reallocations, but in any case, reallocations should only happen at logarithmically growing intervals of size so that the insertion of individual elements at the end of the vector can be provided with amortized constant time complexity (see push_back).
P-164298
« 1 » 2
  Strona 1 z 2 Następna strona