Problem wynika głównie z chęci przeniesienia się z Dev'a na Visuala - chodzi o tablice o nieznanym w czasie kompilacji rozmiarze. Jako że Visual, w przeciwieństwie do Dev'a, takich praktyk nie akceptuje, muszę przerobić ów tablicę na tablicę dynamiczną (z góry zdefiniowany rozmiar tablicy to raczej ostateczność), lub zastosować jakiś inny myk.
Tak wygląda części programu, której problem dotyczy:
...
int main()
{
... //wczytywanie danych, inicjalizacja zmiennych etc...
float Map[x][y][2]; //kłopotliwa tablica - rozmiar x i y wczytywane są z pliku
... //dalsza część inicjalizacji
...
{ //wnętrze głównej pętli programu
... //obsługa zdarzeń
for(int n=0; n<precision; n++) //główna pętla licząca
{
for(int l=1; l<x-1; l++)
{
... //obsługa krawędzi tablicy
for(int h=1; h<y-1; h++) //a oto główny winowajca procesorożerności programu
{
Map[l][h][1]-=(Map[l][h][0]-(Map[l+1][h][0]+Map[l-1][h][0]+Map[l][h+1][0]+Map[l][h-1][0])*0.25)*factorA;
}
}
for(int h=1; h<y-1; h++)
{
... //obsługa krawędzi tablicy
}
... //obsługa rogów tablicy
for(int l=0; l<x; l++)
{
for(int h=0; h<y; h++)
{
Map[l][h][1]*=(1-factorB); //a oto poboczni winowajcy procesorożerności
Map[l][h][0]+=(Map[l][h][1]*factorC);
}
}
}
... //wyświetlanie tablicy i inne pomniejsze czynności(Allegro inside)
}
Tak zorganizowany program, przy rozmiarach tablicy 255/255 i precyzji ustawionej w celach testowych na 16 wyciągał ~31 fps'ów. Ale tablicę tę musiałem przerobić na wersję dynamiczną, jeśli chciałbym przejść na Visuala. W celu tym utworzyłem strukturę która zastępuje 3 wymiar tablicy, i z tej struktury utowrzyłem vector vectorów. wszystko wygląda teraz mniej więcej tak:
struct Cell //komórka zastępująca 3 wymiar tablicy
{
float x, dx;
Cell::Cell(float nx = 0, float ndx = 0):
x(nx), dx(ndx){}
};
Cell zeroCell(0.5, 0);
...
int main()
{
... //wczytywanie danych, inicjalizacja zmiennych etc...
vector<Cell> buf;
for(int h=0; h<y; h++)
buf.push_back(zeroCell);
vector<vector<Cell> > Map;
for(int w=0; w<x; w++)
Map.push_back(buf); //utworzenie jeszcze bardziej kłopotliwej tablicy
... //dalsza część inicjalizacji
...
{ //wnętrze głównej pętli programu
... //obsługa zdarzeń
for(int n=0; n<precision; n++) //główna pętla licząca
{
for(int l=1; l<x-1; l++)
{
... //obsługa krawędzi tablicy
for(int h=1; h<y-1; h++) //a oto główny winowajca procesorożerności programu
{
Map[l][h].dx-=(Map[l][h].x-(Map[l+1][h].x+Map[l-1][h].x+Map[l][h+1].x+Map[l][h-1].x)*0.25)*factorA;
}
}
for(int h=1; h<y-1; h++)
{
... //obsługa krawędzi tablicy
}
... //obsługa rogów tablicy
for(int l=0; l<x; l++)
{
for(int h=0; h<y; h++)
{
Map[l][h].dx*=(1-factorB); //a oto poboczni winowajcy procesorożerności
Map[l][h].x+=(Map[l][h].dx*factorC);
}
}
}
... //wyświetlanie tablicy i inne pomniejsze czynności(Allegro inside)
}
I ku mojemu ogromnemu zasmuceniu, program wyciągał... ledwie ponad 3 klatki na sekundę.
Czy jest jakiś sposób na przeniesienie się z tym kodem do visuala bez utraty prędkości? niby fajne środowisko, ale nie będę przez to tak kaleczył programu.
Może 'ręczne' utworzenie tablicy dynamicznej poprawi tą sytuację? spodziewam się że trochę roboty z tym będzie, a nie chcę marnować czasu, poza tym wątpię żeby twórcy vectora tak nawalili...
Poza tym, jak to jest z tymi tablicami o rozmiarach ustalonych przez zmienne - powinno tak się robić, można tak robić? jaki jest status takich praktyk? W visualu to error, w Dev'ie nawet ostrzeżenie nie wyskakuje...
Gdyby kogoś interesowało - program jest symulatorem fal.