Wpis z mikrobloga

#programowanie #cpp #grafika3d #gamedev #programowaniegrafiki Mireczki, da się zrobić coś takiego? Chodzi o to zeby nie przechodzi w petli for przez kazdy element tablicy i ustawiac wartosc jakiejs zmiennej tylko zrobic to za jednym razem dzieki np. memset, ponizej szczegoły:

// ta klasa definiuje jeden trojkat, ma jakies metody i zmienne i chodzi mi tu o konkretną zmienną DWORD flags;
class Face
{
...
DWORD flags;
...
}

I teraz mam oczywiście całą wieloelementową tablicę typu Face, np. Face[100]
i chciałbym za pomoca np. memset, ustawić w całej tablicy wszystkie wartosci flags np. na 1.. ale to w uproszeczniu, docelowo chodzi o ustawienie HIWORD zmiennej flags na np. 1

czy tak się da, czy muszę przechodzić przez całą tablicę w pętli i ustawiać, wiadomo, chodzi mi o wydajnosc..
  • 16
@Kopytko1: Jeśli uważasz, że to istotnie wpłynęłoby na wydajność, to może warto rozwiązać to na etapie projektowania struktury danych. I zamiast takiej interleaved array, gdzie masz klasy zawierające składową flags, to utworzyć osobno ciągłą tablicę samych flag. Ale zysk wydajnościowy raczej byłby znikomy, jeśli używałbyś w pętli prostej arytmetyki wskaźników.
@selenita66: @grzegorzx86: klasa Face jak i struktura Mesh jest narzucona z góry, bo robie plugin.. krótko mówiąc: generuje np. kulkę, muszę przejsc przez wszystkie fejsy i ustawić flag i tak przez wszystkie np. 100 kulek wiec troche performance moze spasc, a nie widze metody ktora by globalnie ustawiła tą flagę co chcę..
@JakTamCoTam: nie rozdzielałem tego na osobne watki, gdy wczesniej sprawdzalem podzial na jakies operacji na watki to plugin tracił mocno na wydajnosci, wiec olałem, bez tego mialem wystarczajaco dobra wydajnosc.. staram sie optymalizować wszystko zeby miec jak najlepsze wyniki.. ten problem o ktorym mowie nie potrzebnie mi zabiera pare klatek
@Kopytko1: jesli tylko chcesz to zapisac jedna linia to oczywiscie ze sie da:
zakladajac ze masz tablice

Face faces[100]
to

std::for_each(faces, faces + 100, [](auto& face) { face.flags = 1; });
@leoha: nie, nie.. chodziło mi o to aby nie przechodzić w pętli po każdym elemencie, a zrobić jakąś operacje bezpośrednio na tym obszarze pamięci żeby ustawić od razu wartości tak jak robi to np. memset..
@leoha: robi, ale w pewnych wypadkach moze zoptymalizowac, vide kopiowanie danych po 4/8 bajtow zamiasto po bajcie :) Jak pobawisz sie w embeded i jakies wolniejsze procki, to sobie zobaczysz roznice przy kopiowaniu w petli danych po bajcie a po 2 czy 4 bajty :) Na PC roznice sa niezauwazalne, ale w innych wypadkach i owszem.
@Kaczus2B: panie, ja 5 lat pracowalem w embedded i doskonale wiem jak to dziala. Chodzilo mi tylko o to, ze jak masz tablice 100 elementow to chocby skaly srały jednym poleceniem w kodzie maszynowym tego nie zrobisz, a to czy petla jest "petla" czy jest zunrollowana czy moze robisz to jednym czy 8 bajtami to sprawa drugorzedna