|
Xors3D Графический движок с поддержкой DirectX9 |
07.10.2011, 22:23
|
#91
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
Сообщение от MoKa
Если второе, то в таком случае, ты это делаешь очень извращённо и не весьма продуктивно, это как пить из бочки и ли забивать гвозди ложкой.
|
Мб ты хотел сказать: хлебать щи лаптем?
Вообще я на примере этого пытался научиться использовать классы и вроде как понял, ну кроме ссылок и двоеточий. Плюс в башке более менее выкристализовался алгоритм как получить такой ландшафт. Сейчас я на каждое смещение генерирую данные для всего ландшафта и все пицот тыщ вершин деформирую и обновляю нормали xUpdateN(), что есть плохо, а последние два пункта так и вовсе прискорбно.
Если сочинить алгоритм способный смещать данные на одну строку, то быстродействие вырастет радикально, а разрешение ландшафта в (2048х12 ^2 пикселей это ведь круто.
|
(Offline)
|
|
07.10.2011, 22:26
|
#92
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
Сообщение от pozitiffcat
А нахрен тебе это надо если это на ксорсе жрет больше ресурсов если же ты бы просто грузил готовый ландшафт из модельки и не парил себе мозг
|
Оно не жрет много памяти, если быть до конца честным оно использует памяти для хранения в два числа int, сколько там это байт я не в курсе, в процессе получения оно отжирает просто много памяти, но это от того, что я даже не быдлокодер, а кодерчмо
кстати если тебя заинтересовала картинка номер два, то подобное без извращений генерируется легко и в течении пары десятков миллисекунд
|
(Offline)
|
|
13.10.2011, 22:45
|
#93
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
Как лучше?
1)
for(int i=0;i<1000000;i++) {
double z=somedata[i];
anotherdata[i]=z*0.125*i;
}
2)
double z;
for(int i=0;i<1000000;i++) {
z=somedata[i];
anotherdata[i]=z*0.125*i;
}
3)
double *z;
for(int i=0;i<1000000;i++) {
z=somedata[i];
anotherdata[i]=z*0.125*i;
}
Или разницы нет?
|
(Offline)
|
|
14.10.2011, 01:05
|
#94
|
Дэвелопер
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений (для 4,642 пользователей)
|
Ответ: Странное.
Между первым и вторым в плане производительности разницы нет (если использовать нормальный компилятор), т.к. на стеке локальные переменные выделяются в области видимости функции. С точки зрения качества кода, то переменную лучше объявлять как можно ближе к тому месту, где она будет использоваться (ну, не превращая все в кашу, конечно).
Между первыми двумя и третим разница существенная (мне кажется, ты таки еще не разобрался в указателях).
ЗЫ. Вообще это все можно было бы загуглить. А еще лучше проверить самому. Например, глянуть ассемблерный листинг того, что компилятор наделал.
__________________
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо .Squid за это полезное сообщение:
|
dsd (14.10.2011), moka (14.10.2011)
|
14.10.2011, 01:27
|
#95
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
Мне таки с каждым днем кажется, что я в с++ все меньше и меньше понимаю
С указателями я более-менее уловил уже что куда, вроде.
т.к. такая структура данных у меня обрабатывается нормально и выдает то, что и планировалось изначально.
Handle mesh; //его поверхности ближнего плана Handle **surf; //среднего плана Handle **surfm; //дальнего плана // разрешение наиболее детализировнных ячеек. int resolution; int number;
//data for deformations //хранитель мирового зерна. int uppersize; double **seed; //массивы билжнего плана. double ****strip; //шершавость нижнего уровня double sharpness; //сглживание double smothing;
Меня просто интересовал следующий момент:
Если у меня есть цикл с хреновой тучей итераций, то в каждой итерации объявлять переменные служащие для хранения промежуточных данных это то же самое, что объявить их до цикла или нет(в плане производительности).
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
14.10.2011, 10:20
|
#96
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: Странное.
Сообщение от dsd
Мне таки с каждым днем кажется, что я в с++ все меньше и меньше понимаю
С указателями я более-менее уловил уже что куда, вроде.
т.к. такая структура данных у меня обрабатывается нормально и выдает то, что и планировалось изначально.
Handle mesh; //его поверхности ближнего плана Handle **surf; //среднего плана Handle **surfm; //дальнего плана // разрешение наиболее детализировнных ячеек. int resolution; int number; //data for deformations //хранитель мирового зерна. int uppersize; double **seed; //массивы билжнего плана. double ****strip; //шершавость нижнего уровня double sharpness; //сглживание double smothing;
Меня просто интересовал следующий момент:
Если у меня есть цикл с хреновой тучей итераций, то в каждой итерации объявлять переменные служащие для хранения промежуточных данных это то же самое, что объявить их до цикла или нет(в плане производительности).
|
объявляй до цикла что бы юзать переменные вне его, в цикле для защиты от доступа вне области видимасти цикла, хотя на производительность не сказывается, проверял!
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
14.10.2011, 10:28
|
#97
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: Странное.
Сообщение от dsd
Как лучше?
3)
double *z;
for(int i=0;i<1000000;i++) {
z=somedata[i];
anotherdata[i]=z*0.125*i;
}
Или разницы нет?
|
Это вообще не скомпилится! При юзанье указателей таким способом их надо разыменовывать
int _tmain(int argc, _TCHAR* argv[])
{
int somedata[100];
int anotherdata[100];
double* z=(double*)malloc(sizeof(double));//определить размер данных
for(int i=0;i<100;i++) {
*z=somedata[i];//юзать разыменовывая
anotherdata[i]=(*z)*0.125f*i;
}
return 0;
}
что бы исключить случайного приведения float к int юзается не так 0.125, а так 0.125f
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
14.10.2011, 11:45
|
#98
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
Таки да глупость смозорозил под 3.
Но разыменовывание уж очень какое-то ректальное тайнство из серии: "а я всеравно прав, #$%^@ #$%@^ компилятор!!!" чет я не могу вообразить себе ситуацию, когда это потребутся, у меня все-таки в конце цепочки указателей последний указывает на обычную переменную.
что бы исключить случайного приведения float к int юзается не так 0.125, а так 0.125f
|
gnu gcc вроде не пытается такого сделать я бы заметил У него с автоматическим переводом все хорошо, только обрато из int в float надо кой-чо приписывать в формулу для правильного взаимопонимания
|
(Offline)
|
|
14.10.2011, 12:07
|
#99
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: Странное.
Сообщение от dsd
Таки да глупость смозорозил под 3.
Но разыменовывание уж очень какое-то ректальное тайнство из серии: "а я всеравно прав, #$%^@ #$%@^ компилятор!!!" чет я не могу вообразить себе ситуацию, когда это потребутся, у меня все-таки в конце цепочки указателей последний указывает на обычную переменную.
gnu gcc вроде не пытается такого сделать я бы заметил У него с автоматическим переводом все хорошо, только обрато из int в float надо кой-чо приписывать в формулу для правильного взаимопонимания
|
Указатели не используются в таких случаях как в 3 примере, это плохой и сложный стиль =) их нужно использовать для создания экземпляров класса
class mycl
{
public:
void foo();
};
void mycl::foo()
{
printf("foo");
}
........
mycl* m = new mycl();//определение класса в указатель (создание не в стеке а в куче)
//теперь можно юзать объект
cl->foo();
//или
(*cl).foo();//тут уж как тебе проще
/*
при передаче не указателя в функцию, объект копируется, это не есть
хорошо, объекты нужно передавать указателями, следовательно и
создавать их как указатели оператором new
это я так.. своими словами.. в умных книжках конечно по другому написано
так что для того чтобы лучше понять прочитай книгу, читается за 2 дня
300 страниц сам читал!*/
|
(Offline)
|
|
14.10.2011, 12:09
|
#100
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: Странное.
Сообщение от dsd
Таки да глупость смозорозил под 3.
gnu gcc вроде не пытается такого сделать я бы заметил У него с автоматическим переводом все хорошо, только обрато из int в float надо кой-чо приписывать в формулу для правильного взаимопонимания
|
попробуй так float f = 20 / 3; что выдаст и f=20.0f/3.0f
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
float f = 20 / 3;//тут выдаст 6
cout<<f<<endl;
f=20.0f/3.0f;//а тут 6.6 и т.д.
cout<<f<<endl;
Sleep(5000);
return 0;
}
|
(Offline)
|
|
14.10.2011, 12:12
|
#101
|
Дэвелопер
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений (для 4,642 пользователей)
|
Ответ: Странное.
Сообщение от pozitiffcat
что бы исключить случайного приведения float к int юзается не так 0.125, а так 0.125f
|
Что это за ерунда? 0.125 - это double. 0.125f - это float.
Сообщение от dsd
Но разыменовывание уж очень какое-то ректальное тайнство из серии: "а я всеравно прав, #$%^@ #$%@^ компилятор!!!" чет я не могу вообразить себе ситуацию, когда это потребутся, у меня все-таки в конце цепочки указателей последний указывает на обычную переменную.
|
Ты все таки не понял суть указателей. Как ты можешь использовать содержимое ячейки памяти, на которую указывает указатель, без разыменования? Без операции разыменования указатели были бы вещами в себе.
__________________
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
14.10.2011, 12:56
|
#102
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
class ground{
...
double ****strip;
...
ground(){
...
strip= new double ***[number+2];
for(int i=0;i<number+2;i++){strip[i]=new double **[number+2];}
for(int i=0;i<number+2;i++){for(int j=0;j<number+2;j++){
strip[i][j]=new double *[resolution+1];
for(int k=0;k<=resolution;k++){strip[i][j][k]=new double[resolution+1];}}}
for(int i=0;i<number+2;i++){for(int j=0;j<number+2;j++){NullizeStrip(i,j);Diamond_Squa re(i,j,sharpness, smothing);}}
for(int i=0;i<number;i++){for(int j=0;j<number;j++){mesh_deformer(i,j);Surface_Monol itizer(i,j);}}
...
}
...
void Diamond_Square(int a,int b, double sharp, int diff){
...
if(strip[a][b][i][j]==0 && val00!=0 && val01!=0 && val10!=0 && val11!=0){strip[a][b][i][j]=0.25*(val00+val01+val10+val11)+step*xRnd(-sharp,sharp);}
if(strip[a][b][i-step][j]==0 && val00!=0 && val01!=0){strip[a][b][i-step][j]=0.5*(val00+val01)+0.5*step*xRnd(-sharp,sharp);}
if(strip[a][b][i+step][j]==0 && val10!=0 && val11!=0){strip[a][b][i+step][j]=0.5*(val10+val11)+0.5*step*xRnd(-sharp,sharp);}
if(strip[a][b][i][j-step]==0 && val00!=0 && val10!=0){strip[a][b][i][j-step]=0.5*(val00+val10)+0.5*step*xRnd(-sharp,sharp);}
if(strip[a][b][i][j+step]==0 && val01!=0 && val11!=0){strip[a][b][i][j+step]=0.5*(val01+val11)+0.5*step*xRnd(-sharp,sharp);}
...
}
...
void mesh_deformer(int a,int b){
printf("\n index is %d",a);
printf(" index is %d",b);
int qvert=xCountVertices(surf[a][b]);
double xc=xVertexX(surf[a][b],0);
double yc=xVertexZ(surf[a][b],0);
for(int i=0;i<qvert;i++){
double xk=xVertexX(surf[a][b],i);
double yk=xVertexZ(surf[a][b],i);
double val=0;
if(xk-xc<resolution && yk-yc<resolution){
val=strip[a+1][b+1][xMod(xk,resolution)][xMod(yk,resolution)];}
else{
//также необходимо провести сшивку нормалей у соседних мешей
if(xk-xc==resolution && yk-yc<resolution){val=strip[a+1][b+1][resolution][xMod(yk,resolution)];}
if(yk-yc==resolution && xk-xc<resolution){val=strip[a+1][b+1][xMod(xk,resolution)][resolution];}
if(yk-yc==resolution && xk-xc==resolution){val=strip[a+1][b+1][resolution][resolution];}
}
xVertexCoords(surf[a][b],i,xk,val,yk);}}
...
};
|
Значит в цитируемых мной строчках происходит какая-то магия, а не то, что мне воображается. И в обычной вселенной компилятор должен посылать меня нах всвязи с отказом конвертировать double* в double. Но, блин, может я и косноязычен и в употребляемые мной термины вкладываю не общепринятые определения, но коль такой код работает и я представляю себе детально где что куда и как происходит, то отчасти я с указателями разобрался. Хватит, короче, мне самооценку понижать...
|
(Offline)
|
|
14.10.2011, 13:20
|
#103
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Странное.
очень нехорошо, когда пишешь в команде. да и все эти многократные new не нужны. память-то фрагментируется. поставь ради эксперимента ету штуку на ночь поработать. если нужна настолько глубокая вложенность (а она нужна) лучше все это дело оборачивать в классы. в скорости не потеряешь, так как все тривиальные функции заинлайнятся, а понятнее будет. хотя пока ты один - то это не больно то и нужно.
xMod(yk,resolution) - зачем использовать хорсовские функции для вычисления модуля? yk % resolution же.
по поводу демки - работает. когда генерируется очередной кусок - есть небольшое подвисание. это на i7 с 8 гигабайтами оперативки. МоКа правильно говорит - хочешь писать низкоуровневые вещи - пиши их на низкоуровневом АПИ. тем ни менее - сам алгоритм работает. все нормально, без косяков.
|
(Offline)
|
|
14.10.2011, 13:45
|
#104
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: Странное.
то что ты делаешь в коде вообще не понятно, отложи свою программу на пол годика и вернись к ней, ты что нибудь разберешь? Пиши код понятный, как будто ты пишешь его для когото!
double ****strip;
как юзать структуры, если ты это хочешь...
struct Vertex
float x;
float y;
float z
};
Vertex myVerts[100500];
int i=0;
while(100500>i++)
myVerts[i].x = i;
|
(Offline)
|
|
14.10.2011, 14:10
|
#105
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
Holydel, у меня на всю программу один объект. Командой new я пользуюсь толь ко в конструкторе. А потом как карточный шулер тасую нижние уровни указателей. Если бы я пользовал нью каждый раз вместо перетасовки уровней оно бы каждую секунду по 15 мб памяти отжирало бы, в следствии чего и извращаюсь
Старую версию я бросил и пишу новую в ней подвисаний нет, но она сложней раз в десять структурно, но вроде быстрей и дает над данными много контроля без усилий. К зиме или лету допишу, наверно. Главное что оно кол-во элементов теперь меняет легко и непринужденно
это не блитцевский мод. Оно у меня контролирует индексы массивов, что бы они в чужую память не лезли и в минуса не уходили.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 01:53.
|