Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Xors3D

Xors3D Графический движок с поддержкой DirectX9

Ответ
 
Опции темы
Старый 07.10.2011, 22:23   #91
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.

Сообщение от MoKa Посмотреть сообщение
Если второе, то в таком случае, ты это делаешь очень извращённо и не весьма продуктивно, это как пить из бочки и ли забивать гвозди ложкой.
Мб ты хотел сказать: хлебать щи лаптем?

Вообще я на примере этого пытался научиться использовать классы и вроде как понял, ну кроме ссылок и двоеточий. Плюс в башке более менее выкристализовался алгоритм как получить такой ландшафт. Сейчас я на каждое смещение генерирую данные для всего ландшафта и все пицот тыщ вершин деформирую и обновляю нормали xUpdateN(), что есть плохо, а последние два пункта так и вовсе прискорбно.
Если сочинить алгоритм способный смещать данные на одну строку, то быстродействие вырастет радикально, а разрешение ландшафта в (2048х12^2 пикселей это ведь круто.
(Offline)
 
Ответить с цитированием
Старый 07.10.2011, 22:26   #92
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.

Сообщение от pozitiffcat Посмотреть сообщение
А нахрен тебе это надо если это на ксорсе жрет больше ресурсов если же ты бы просто грузил готовый ландшафт из модельки и не парил себе мозг
Оно не жрет много памяти, если быть до конца честным оно использует памяти для хранения в два числа int, сколько там это байт я не в курсе, в процессе получения оно отжирает просто много памяти, но это от того, что я даже не быдлокодер, а кодерчмо

кстати если тебя заинтересовала картинка номер два, то подобное без извращений генерируется легко и в течении пары десятков миллисекунд
(Offline)
 
Ответить с цитированием
Старый 13.10.2011, 22:45   #93
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 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
.Squid
Дэвелопер
 
Аватар для .Squid
 
Регистрация: 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
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
HolyDel (14.10.2011)
Старый 14.10.2011, 10:20   #96
pozitiffcat
Мастер
 
Аватар для pozitiffcat
 
Регистрация: 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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
dsd (14.10.2011)
Старый 14.10.2011, 10:28   #97
pozitiffcat
Мастер
 
Аватар для pozitiffcat
 
Регистрация: 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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
dsd (14.10.2011)
Старый 14.10.2011, 11:45   #98
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 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
pozitiffcat
Мастер
 
Аватар для pozitiffcat
 
Регистрация: 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
pozitiffcat
Мастер
 
Аватар для pozitiffcat
 
Регистрация: 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
.Squid
Дэвелопер
 
Аватар для .Squid
 
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений
(для 4,642 пользователей)
Ответ: Странное.

Сообщение от pozitiffcat Посмотреть сообщение
что бы исключить случайного приведения float к int юзается не так 0.125, а так 0.125f
Что это за ерунда? 0.125 - это double. 0.125f - это float.

Сообщение от dsd Посмотреть сообщение
Но разыменовывание уж очень какое-то ректальное тайнство из серии: "а я всеравно прав, #$%^@ #$%@^ компилятор!!!" чет я не могу вообразить себе ситуацию, когда это потребутся, у меня все-таки в конце цепочки указателей последний указывает на обычную переменную.
Ты все таки не понял суть указателей. Как ты можешь использовать содержимое ячейки памяти, на которую указывает указатель, без разыменования? Без операции разыменования указатели были бы вещами в себе.
__________________

(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Dream (14.10.2011)
Старый 14.10.2011, 12:56   #102
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 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
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Странное.

double ****strip;
очень нехорошо, когда пишешь в команде. да и все эти многократные new не нужны. память-то фрагментируется. поставь ради эксперимента ету штуку на ночь поработать. если нужна настолько глубокая вложенность (а она нужна) лучше все это дело оборачивать в классы. в скорости не потеряешь, так как все тривиальные функции заинлайнятся, а понятнее будет. хотя пока ты один - то это не больно то и нужно.

xMod(yk,resolution) - зачем использовать хорсовские функции для вычисления модуля? yk % resolution же.

по поводу демки - работает. когда генерируется очередной кусок - есть небольшое подвисание. это на i7 с 8 гигабайтами оперативки. МоКа правильно говорит - хочешь писать низкоуровневые вещи - пиши их на низкоуровневом АПИ. тем ни менее - сам алгоритм работает. все нормально, без косяков.
(Offline)
 
Ответить с цитированием
Старый 14.10.2011, 13:45   #104
pozitiffcat
Мастер
 
Аватар для pozitiffcat
 
Регистрация: 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
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.

Holydel, у меня на всю программу один объект. Командой new я пользуюсь толь ко в конструкторе. А потом как карточный шулер тасую нижние уровни указателей. Если бы я пользовал нью каждый раз вместо перетасовки уровней оно бы каждую секунду по 15 мб памяти отжирало бы, в следствии чего и извращаюсь

Старую версию я бросил и пишу новую в ней подвисаний нет, но она сложней раз в десять структурно, но вроде быстрей и дает над данными много контроля без усилий. К зиме или лету допишу, наверно. Главное что оно кол-во элементов теперь меняет легко и непринужденно

это не блитцевский мод. Оно у меня контролирует индексы массивов, что бы они в чужую память не лезли и в минуса не уходили.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 13:33.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com