K.....1
K.....1
#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..
2
  • Najlepsze
  • Wszystkie komentarze
JakTamCoTam
@Kopytko1: no ale jak chcesz w każdym elemencie ustawic to musisz przez każdy element przejść
3
K.....1
K.....1
@JakTamCoTam: liczylem ze mozna to jakims trickiem obejsc, jesli jest to ta sama wartosc..
2
leoha
@Kopytko1: memset tez robi pętle, przeciez ostatecznie w kodzie maszynowym nie da się inaczej... nie kombinuj, bo przekombinowujesz...
2
Saly
@Kopytko1: nie ma opcji, żeby zrobić to szybciej, gdy masz nieciągłą pamięć. Z drugiej strony warto zmierzyć, czy to jest problem wydajnościowy.
2
g.....6
g.....6
@Kopytko1: A dlaczego nie chcesz pętli? Co tu chcesz "obchodzić"? Możesz też ustawiać wartość np. w konstruktorze.
1
selenita66
@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.
1
leoha
@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
1
K.....1
K.....1
@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ę..
0
JakTamCoTam
@Kopytko1: zrownoleglasz ta petle? Ile watkow pracuje?
0
K.....1
K.....1
@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
0
leoha
@Kopytko1: niue rozumiem co chcesz osiągnąć tym? Chcesz to zrównoleglić czy po prostu zapisać jedną linią?
0
leoha
@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; });
0
leoha
liczylem ze mozna to jakims trickiem obejsc, jesli jest to ta sama wartosc..


@Kopytko1: bo sie da, napisałem wyżej
0
K.....1
K.....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..
0
Kaczus2B
Kaczus2B
@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.
0
g.....6
g.....6
jednym poleceniem w kodzie maszynowym tego nie zrobisz

@leoha: w x86 da się zrobić REP STOS
0