forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Проекты C++ (http://forum.boolean.name/forumdisplay.php?f=56)
-   -   Sigel (http://forum.boolean.name/showthread.php?t=4960)

-=SCiP=- 28.03.2009 21:15

Ответ: Sigel
 
Эх как обычно у меня не запустилось! :(

HolyDel 28.03.2009 21:28

Ответ: Sigel
 
-=SCiP=- логи давай. файл sigel.log

Taugeshtu 28.03.2009 22:44

Ответ: Sigel
 
работает, ФПС скачет от 2,5 до 3,5к

HolyDel 28.03.2009 22:48

Ответ: Sigel
 
а разница на глаз заметна между режимами? (1,2)?

Taugeshtu 28.03.2009 23:22

Ответ: Sigel
 
не заметна...

HolyDel 30.03.2009 05:48

Ответ: Sigel
 
добавил команды проецирования на экран.
camera::Project.
может принимать три флоата, ссылку на трехмерный вектор или ссылку на объект (Entity). результат записывает в последний параметр - трехмерный вектор.

пример:
Код:

Vector3D result;
cam->Project(megaboss,result);
Text("MegaBOSS!!!",result.x,result.y-20,1,0);


moka 30.03.2009 05:49

Ответ: Sigel
 
А почему в 3д вектор, а не в 2д? Зачем возвращаемая Z?

HolyDel 30.03.2009 05:55

Ответ: Sigel
 
чтобы определить удалось спроецировать на экран или нет. если объект у нас за спиной то z будет 0, если видим - то 1. правда оно пока глючит.

скорость на моей машине 100к проецирований делаются за 34-37мс. не очень шустро. для сравнения, на блице тоже количество - за 19 мс выполняется.

moka 30.03.2009 06:05

Ответ: Sigel
 
HolyDel, дык в блице функция возвращения видим/нет, отдельна ведь (EntityInView).
Хотя там ведь вроде если не в камере, тогда будут по нулям возвращаться?
А у тебя как понял будет за экран выходить? Если да - то это очень удобно!

HolyDel 30.03.2009 06:08

Ответ: Sigel
 
ну да. за экран выходит. но и в блице тоже выходит за экран. т.е. в том примере если бы даже объект не было видно (например он справа за экраном) кусок текста все равно бы торчал.

но это работает только до тех пор, пока объект ПЕРЕД камерой - когда он ЗА камерой - результат не определен.
у меня скорее всего будет два варианта определения видимости объекта (аналог EntityInView)
1 - на основе фрустум куллинга (плоскости отсечения тоже считаются)
2 - на основе попиксельного запроса (т.е будет рисоваться объект, и считаться сколько пикселей прошли Z-тест, если больше 0 - объект видим).
естественно 1 намного быстрее 2.

impersonalis 30.03.2009 11:35

Ответ: Sigel
 
Цитата:

Сообщение от MoKa (Сообщение 102190)
HolyDel, дык в блице функция возвращения видим/нет, отдельна ведь (EntityInView).
Хотя там ведь вроде если не в камере, тогда будут по нулям возвращаться?
А у тебя как понял будет за экран выходить? Если да - то это очень удобно!

В блитце также есть аппликата проекции, представляющая из себя булево состояние, описанное ХолиДелом.
Насколько я помню, EntityInView определяет видимость объекта в камере, т.е. в некоем конусе видимости, доступном камере (бокового зрения у неё нет). ProjectedZ() же свидетельствует о позиции объекта по локальной оси аппликат относительно камеры в разбросе 1;0.
Т.е. для двигающихся линией ботов каждый имеет истинную аппликату для каждого, но ложную сущность_во_взгляде.
:) :)
/|\ /|\
/ \ / \

HolyDel 30.03.2009 14:55

Ответ: Sigel
 
аналог EntityInView сделал.
пример:
Код:

if(megaboss->InView())
  terribly++;
else
  terribly = max(0,terribly-1);


-=Jack=- 31.03.2009 18:01

Ответ: Sigel
 
ммм... а InView чего? Кто его видит? У меня, к приимеру, это идёт как Entity::InView(Camera cam) и проверяет, видит ли эту ентитю указанная камера.

HolyDel 31.03.2009 18:08

Ответ: Sigel
 
-=Jack=-, и то правда. я просто пока с многокамерами не возился. а так да, по идее надо задавать камеру.

HolyDel 01.04.2009 15:19

Ответ: Sigel
 
добавил 4 новых типа блендинга.

Цитата:

const int BM_DETAIL = 5;
const int BM_MAX = 6;
const int BM_MIN = 7;
const int BM_DECAL = 8;
BM_DETAIL аналог блицового 5-ого режима блендинга. т.е. двойное умножение. годится в первую очередь для detail карт, потому и константа так называется.

BM_MAX, BM_MIN я думаю из названия понятно. выбирается соотвесвенно максимальное и минимальное значение компоненты пикселя. того, который рисуем и того, на котором рисуем. аналог lighter color и darker color из фотошопа.

BM_DECAL - нужен для записи в текстуру с альфой. цвет пишется как с обычной полупрозрачностью. а альфа складывается.

moka 01.04.2009 23:42

Ответ: Sigel
 
DETAIL переименуй на OVERLAY, так более интуитивно понятно. Сужу по разным графическим редакторам и т.д. OVERLAY подрузумевается под перемножением.

FFP развиваешь? Я бы делал ставку на более непривязанные фичи чем к FFP, всёравно нынче FFP не используется практически вообще..

HolyDel 02.04.2009 00:25

Ответ: Sigel
 
ок. пусть будет BM_OVERLAY
это не только для FFP.

HolyDel 02.04.2009 03:21

Ответ: Sigel
 
сделал дополнительный набор текстурных координат.
создать набор можно так:

somesurface->AddTexCoordsLayer(index);
index может быть от 1 до 31. для максимальной производительности они должны идти по порядку.
т.е не так, что есть 2, 7 и 26 слой тк. а лучше 1,2,3. (хотя можно и 2,7 и 26).

Код:

        sfloor->MakeQuad(34.0f,8.0f);

        sfloor->Lock();

        sfloor->AddTexCoordsLayer(1);
        sfloor->VertexUV(1,0,0,0);
        sfloor->VertexUV(1,1,1,0);
        sfloor->VertexUV(1,2,0,1);
        sfloor->VertexUV(1,3,1,1);

        sfloor->UnLock();

в данном случае 34 -это размер квада. а 8 - множитель тк. т.е на этом кваде тексткура первого юнита будет повторяться 8 раз.

дальше добавляется второй текстурный юнит и задаются UV координаты для всех вершин.

moka 02.04.2009 04:37

Ответ: Sigel
 
Как понял функция VertexUV(Layer%,Vertex%,U#,V#)? А где W позабыл? Часто в шейдерах юзается в виде индексов (я юзал для инстансинга). Плюс для 3D текстур нужен будет.

HolyDel 02.04.2009 04:48

Ответ: Sigel
 
эээ. нету его. пока. спасибо за замечание.
скорее всего тогда будет не
sfloor->AddTexCoordsLayer(1);
а
sfloor->AddTexCoordsLayer(1,n);
где n число от 1 до 4 - число компонент на одну тк. для 3д тк - нужно указать 3.

второй параметр задает кол-во компонент у тк.

HolyDel 02.04.2009 06:08

Ответ: Sigel
 
Вложений: 2
добавил возможность работы с 2д фигурами.

в аттаче пример.

в примере space - менять режим отрисовки.
динамический или статический.
в фигуре 128 трисов. 128*3 вершин.
за кадр рендерятся 100 таких фигур.

-=Jack=- 03.04.2009 02:04

Ответ: Sigel
 
фпс - 200/600
А как понять 2д фигуры? Рисование мешей в экранных координатах?

HolyDel 03.04.2009 02:34

Ответ: Sigel
 
Цитата:

Рисование мешей в экранных координатах?
бинго! и без z координаты.

moka 03.04.2009 03:59

Ответ: Sigel
 
Цитата:

Сообщение от HolyDel (Сообщение 102532)
эээ. нету его. пока. спасибо за замечание.
скорее всего тогда будет не
sfloor->AddTexCoordsLayer(1);
а
sfloor->AddTexCoordsLayer(1,n);
где n число от 1 до 4 - число компонент на одну тк. для 3д тк - нужно указать 3.

второй параметр задает кол-во компонент у тк.

Как понимаю это в целях экономии видео памяти?
А много будет экономии, к примеру хранить не float4 а float2 в модели с 2к вершин, это по 8 бит на значение (так?) - это 2000(float2 vars) = 24000bits(2000*2*8 ) = 31Kb - Правильно? Просто я хз по этому вопросу (образование нуна)..
Тоесть если в памяти примерно 4 миллиона вершин, по дефолту (float2 на uv), то это почти 60мб, чисто на UV! Ух.. Я уже не говорю о цвете вершин, их нормалей, позиций. Тоесть приблезительно на 1 миллион вершин, тратится инфы: float4 (position) + float3 (normal) + float4 (rgba color) + float2 (UV) = 13 float's; 13f*1000v*8b=100mb! Весьма не мало.

Вот интерестно, я в шейдерах заметил правило и использование W компонента расстояния, но так и не понимал какую инфу он несёт (что он содержит), и можно ли от него избавиться.
Цвет вершин, юзается, но редко (хотя тут раз на раз не приходится, зависит от стиля кодера графических техник). Вроди как щас уже можно отрубать?
UV - уже опционально, и слои, и колличество компонентов.

Вроди ничего не забыл..

HolyDel 03.04.2009 04:29

Ответ: Sigel
 
1 float - 4 байта.
весь цвет занимает всего 4 байта.
позиция - 3 float -а.
получается жестко задано:
float3 (position) + float3(normal) + float2(UV). - 32 байта на вершину.
опционально:
float1 (rgba) - еще 4 байта.

т.е. в самом простом случае будет 32 мегобайта грубо говоря.
с цветом - 36.
если еще одни UV - 44
если еще одни UVWT - 60

W компонента в позиции - это проецирование ккординат.
т.е правильная позиция вершины это не x,y,z а
x/w,y/w,z/w

цвет вершин на данный момент совсем не используется. но позже обязательно будет добавлена его поддержка опционально.

* сделал сохранение и загрузку шейпов из файла

-=Jack=- 03.04.2009 12:08

Ответ: Sigel
 
Цитата:

Сообщение от HolyDel (Сообщение 102641)
бинго! и без z координаты.

А почему? Имхо, нужно хотябы одно значение для одной фигуры, чтобы знать, какая над какой нарисуется. Или у тебя идёт ручная прорисовка после рендера?

HolyDel 03.04.2009 14:00

Ответ: Sigel
 
Цитата:

Или у тебя идёт ручная прорисовка после рендера?
именно. это аналог картонк, текста и т.д.

HolyDel 07.04.2009 10:58

Ответ: Sigel
 
Вложений: 2
решил немного переделать 2д систему. теперь можно выводить 2д графику так называемыми кусками. Причем внетри одного куска может быть дргой (вся графика внутреннего куска будет выводиться с учетом трансформации родительской геометрии).
как то так:
Код:

Begin2D();
Translate2D(carx,cary);
Turn2D(carangle);
car->Draw();

 Begin2D();
 Translate(-10,wheel1_suspendy);
 wheel->Draw();
 End2D();


 Begin2D();
 Translate(10,wheel2_suspendy);
 wheel->Draw();
 End2D();

End2D();

(осторожно, скрин получился весомым)
Вложение 5843

Вложение 5842


Код:

#define SIGEL_USE_ONLY

#include <sigel/ISigel.h>
float a=0;
Shape *star = 0;

void DrawFigure(int x,int y)
{
        Begin2D();
        Translate2D(x,y);
        Turn2D(a);
        Scale2D(2);
       
        StartTextDraw();
        for(int i=0;i<360;i+=5)
        {

                Color(hsl(i*255/360,255,128));

                Begin2D();
                Turn2D(i);
                Translate2D(100,0);
                Scale2D(0.75f);
                char buff[32];
                sprintf_s(buff,32,"angle: %f",AngleNormalize(a+i));
                Text(buff,0,0);
                End2D();
        }
        EndTextDraw();

        star->Draw();
        Begin2D();
        Turn2D(a * -2);
        Scale2D(2.3);
        star->Draw();
        End2D();

        for(int i=0;i<6;++i)
        {
                Scale2D(0.8f);
                Turn2D(a * 0.5);
                star->Draw();
        }
       
        End2D();
}
sGAME
{
        debug::startlog();
        //Init(800,600,32,2,8);
        Init();

        AppTitle("ShapesTest");

        VWait(0);
        CameraHelper ch;

        TFont *fnt = new TFont("tahoma.txt");
        fnt->Bind();

#define CREATE_NEW_STAR_SHAPE
#ifdef CREATE_NEW_STAR_SHAPE

        int cntl = 128;

        star = new Shape(cntl*3,cntl*3);
       
        for(int i=0;i<cntl*3;++i)
        {
                star->SetIndex(i,i);
        }

        float r1 = 75;
        float r2 = 100;

        for(int i=0;i<cntl;++i)
        {
                float a = (float)i * 6.283f / (float)cntl;
                float da = 6.283f / (float)(cntl*2);

                float x,y;

                x = sin(a)*r2;
                y = cos(a)*r2;

                star->SetVertexPos(i*3 + 0,x,y);
                star->SetVertexColor(i*3 + 0,255,255,0);

                x = sin(a-da)*r1;
                y = cos(a-da)*r1;

                star->SetVertexPos(i*3 + 2,x,y);
                star->SetVertexColor(i*3 + 2,255,0,0);

                x = sin(a+da)*r1;
                y = cos(a+da)*r1;

                star->SetVertexPos(i*3 + 1,x,y);
                star->SetVertexColor(i*3 + 1,255,0,0);

        }

        star->SetPrimType(GL_TRIANGLES);

        star->Save("megastar.shape");

        star->DrawMode(SDM_STATIC);       
#else
        star = new Shape("megastar.shape");
#endif

        float dt=0;

        a=0;
        Start2D();

        while(!KeyDown(VK_ESCAPE))
        {
                dt = GetFrameTime();
                a+=dt*0.01f;

                Render();
                Blend(BM_ADD);

                fnt->Smooth(1);

                DrawFigure(0,0);
                DrawFigure(0,ScreenHeight());
                DrawFigure(ScreenWidth(),0);
                DrawFigure(ScreenWidth(),ScreenHeight());
                DrawFigure(ScreenWidth()/2,ScreenHeight()/2);

                fnt->Smooth(0);
                Color(255,255,255,255);
                Text(GetFPS(),10,10);
                Flip();

                //Delay(16.67f);
        }

        DeInit();
        debug::endlog();
};


Taugeshtu 07.04.2009 13:06

Ответ: Sigel
 
Мьсье, вы маньяк!) В самом лучшем смысле этого слова

-=Jack=- 07.04.2009 16:12

Ответ: Sigel
 
320 фпс.
Насчёт реализации 2д - у меня тоже так :) только у меня не нужно рисовать объекты вручную, просто нужно вызвать одну функцию рендеринга 2д...

ЗЫ: можно ли загружать 2д-фигуры из файла? если да, то в каком редакторе можно их создавать?

HolyDel 07.04.2009 21:06

Ответ: Sigel
 
Код:

можно ли загружать 2д-фигуры из файла?
да. более того, можно фигуру даже сохранять в файл.

Код:

если да, то в каком редакторе можно их создавать?
это сделано скорее для кеширования, чем для чего то еще.

Цитата:

Насчёт реализации 2д - у меня тоже так только у меня не нужно рисовать объекты вручную, просто нужно вызвать одну функцию рендеринга 2д...
значит у тебя 2д картинки это такие же ентити как и 3д объекты :)
я решил оставить блицовую схему, потому, что она мне кажется удобнее.
т.е порядок и прочее я оставляю на совести пользователя.

*добавил макросы для отладки, чтобы писался файл, строка, и собственно текст в логи. из __FILE__ и __LINE__ естественно.
*доработал вывод текста (ато раньше он был кривым, сам менял блендинг)
*теперь текстурный шрифт тоже можно "забиндить". После этого текст можно выводить просто командой Text.

moka 07.04.2009 22:23

Ответ: Sigel
 
Олег, а ты знаком с Max2D (BlitzMax) отрисовкой 2D, или с FastImage (он аналогичен), я про логику и синтаксис, они отличаются от Blitz2D, расширенее и удобнее.
Что насчёт блендов, цвета, альфы?
Можешь написать пожалуста перечень функций по сопровождению 2D рендеринга (позиции, цвет ну и т.д.).
Обрати внимание на синтаксис, очень важный моммент, Очень, от синтаксиса будет сильно меняться комфорт, учитывай это :)

ABTOMAT 07.04.2009 22:23

Ответ: Sigel
 
ИМХО рисовать картинки ручками удобнее: больше контроля над ситуацией!

HolyDel 07.04.2009 22:38

Ответ: Sigel
 
MoKa
есть два основных способа вывести 2д графику.
1-й - простой. аля блитц3д. тупо выводим ее и все (указывая позицию и прочие параметры).
например:
Код:

Render();
Rect(10,10,20,50);
Oval(100,400,100);
usershape->Draw(400,100);
Flip();

2-й - сложный.
Код:

Render();

Begin2D();
Translate2D(10,20);
Rect(0,0,20,50);
End2D();

Begin2D();
Translate2D(100,400);
Oval(0,0,100);
End2D();

Begin2D();
Translate2D(400,100);
usershape->Draw();
End2D();
Flip();

во втором случае мы получаем больший контроль за матрицей трансформацией, например можно легко поворачивать, скалить, перемещать объект. Кроме того получаем дополнительный бонус - некое подобие родительской привязки.

Цвет, Блендиг, Альфа-тест, Шейдеры, Фбо, привязка текстур и прочее обрабатывается одинаково для обоих случаев.

moka 07.04.2009 22:53

Ответ: Sigel
 
В Max2D будет так:
Код:

SetColor 255,128,0
SetAlpha .5
SetBlend LIGHTBLEND
DrawOval 100,50,30,30

SetScale 2,3
SetRotation 45
DrawRect 10,10,50,50

При этом там можно указывать центр рисования от куда хочешь, таким образом можно легко реализовать камеру (в 2D).
По мне так такой способ весьма функциональный, чем он будет уступать кроме как родительственной концепции?

HolyDel 07.04.2009 23:08

Ответ: Sigel
 
по сути - этот метод на уровне гапи реализуется также как и у меня. просто уровень выше.

его можно расписать так:
Код:

SetScale(x,y)
{
scalex = x; //некая глобальная переменная
scaley = y; //некая глобальная переменная
}

SetRotation(a)
{
rotation = a; //некая глобальная переменная
}

DrawRect(x,y,w,h)
{
Begin2D();
Translate2D(x,y);
Turn2D(rotation);
Scale2D(scalex,scaley);
_DrawRect(0,0,w,h);
End2D();
}

я просто предоставляю доступ к более низкому уровню.

FDsagizi 08.04.2009 08:51

Ответ: Sigel
 
HolyDel - А по чему все функции для работы с 2д глобальны ?

-=Jack=- 08.04.2009 09:28

Ответ: Sigel
 
>значит у тебя 2д картинки это такие же ентити как и 3д объекты
угу
>ИМХО рисовать картинки ручками удобнее: больше контроля над ситуацией!
Программировать на ассемблере удобнее: больше контроля над ситуацией! Может и 3д хочешь ручками рисовать?)

HolyDel 08.04.2009 09:48

Ответ: Sigel
 
Вложений: 2
Цитата:

HolyDel - А по чему все функции для работы с 2д глобальны ?
у меня половина функций глобальны. я даже хз зачем их по неймспейсам или graphics2dmanager-ам прятать. Впринципе я знаю, так принято писать типа:
Код:

Engine *engine = new Enging();
engine->Init();
Renderer *renderer = new OpenGLRenderer();
engine->ApplyRenderer(renderer);

и т.д. но мне это кажется лишним. по крайней мере пока. зачем громоздить тонны кода, когда можно не громоздить :) ?

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

ABTOMAT 08.04.2009 16:15

Ответ: Sigel
 
Респект! Давно пора :super:

FDsagizi 08.04.2009 20:43

Ответ: Sigel
 
Цитата:

Сообщение от HolyDel (Сообщение 103141)
у меня половина функций глобальны. я даже хз зачем их по неймспейсам или graphics2dmanager-ам прятать. Впринципе я знаю, так принято писать типа:
Код:

Engine *engine = new Enging();
engine->Init();
Renderer *renderer = new OpenGLRenderer();
engine->ApplyRenderer(renderer);

и т.д. но мне это кажется лишним. по крайней мере пока. зачем громоздить тонны кода, когда можно не громоздить :) ?

Ну ООП не зря же люди придумали.
Очень удобно когда все лежит в своих кслассах, intellisence очень облегчает жизнь, и увеличивает скорость разработки.

render-> (и вуаля мы видим все что можно сделать с этим рендером.)

HolyDel 08.04.2009 20:51

Ответ: Sigel
 
Цитата:

intellisence очень облегчает жизнь, и увеличивает скорость разработки.

render-> (и вуаля мы видим все что можно сделать с этим рендером.)
ну в принципе тоже верно )
в конце концов заврапить ООП код в функциональный никогда не поздно. обратно - немного сложнее :)


Цитата:

Респект! Давно пора
спасибо. только вчера нашел простую и понятную статью. чтобы можно было идти от простого к сложному.
вот она, если кому надо:
http://xproger.mirgames.ru/?id=1&page=2&doc=anim3d
там сурсы есть. правда на делфи.

в любом случае пока скининг очень слаб. к примеру сотня megacop-ов обрабатывается за 10 фпс. к примеру блиц ту же сотню обрабатывает в два раза быстрее. (правда у него одна кость на вершину, а у меня несколько)

dimanche13 09.04.2009 11:46

Ответ: Sigel
 
кстати, Xproger делает новый движок, можно попросить его поучаствовать в тестах движков с нашего сайта.

HolyDel 09.04.2009 12:20

Ответ: Sigel
 
я только за.

HolyDel 09.04.2009 13:02

Ответ: Sigel
 
удалось ускорить рендер заскиненой модели примерно в 4 раза.
вот сравнительный тест:
http://forum.boolean.name/showthread...newpost&t=8171

*ускорен вывод мд2 в два раза. (интерполяция на цпу)

HolyDel 21.04.2009 22:52

Ответ: Sigel
 
теперь двиг живет тут:
http://code.google.com/p/sigelengine/

последняя версия:
http://code.google.com/p/sigelengine...q=label:engine

утилиты:
http://code.google.com/p/sigelengine...=label:utility

последния версия сурсов доступна на SVN:
http://sigelengine.googlecode.com/svn/trunk/

пофиксил пару багов.
добавил возможность менять разрешение без потери графики (хотя фреймбуфера под актуальное разрешение прийдется пересоздавать по всей видимости).
добавил возможность подгружать png файлы в ядре (тем ни менее я рекомендую пользовать DevIL, так как проблем будет меньше).

HolyDel 22.04.2009 15:59

Ответ: Sigel
 
добавил поддержку загрузки во втором потоке.

результат для одноядерных систем меня огорчил - основной поток идет рывками, даже если загрузочному потоку ставить самый минимальный приоритет.

а вот у двух (и более ядерных) все хорошо.

почему то во втором потоке не работает оптимизация индексов через NVTriStrip. Причем не работает в Xp, но работает в висте.

вот демка:
http://sigelengine.googlecode.com/fi...therThread.zip

ну и прошлая демка со сменой разрешения (1-6 кнопки давите):
http://sigelengine.googlecode.com/fi...lutionTest.zip

и еще есть dot3 иммитация на ффп:
http://sigelengine.googlecode.com/files/Dot3Test2.zip

EvilChaotic 26.04.2009 23:09

Ответ: Sigel
 
Мегадвиг!

ABTOMAT 27.04.2009 04:19

Ответ: Sigel
 
Цитата:

результат для одноядерных систем меня огорчил - основной поток идет рывками, даже если загрузочному потоку ставить самый минимальный приоритет.
на то они и одноядерные =(
Может, определять, сколько ядер имеет проц и действовать по обстоятельствам?
Например загрузку с анимацией врубать только если 2 и более ядер, а если 1 ядро то оставить просто картинку. (ну млм время от времени менять надпись)
вроде на одноядерных с Hyper-Treading'ом должно быть ок, попроси кого-нить потестить у кого такой проц есть.
Кстати такие процы в системе видно как раз в виде друх ядер (система думает, будто их 2)

FDsagizi 27.04.2009 08:52

Ответ: Sigel
 
Одоядерки уже редкость

SBJoker 27.04.2009 10:29

Ответ: Sigel
 
где-то я видел статью про управление потоками на одно и многоядерных компах... там очень много нюансов насамом деле :) . Ссыку как найду запостю.

HolyDel 27.04.2009 11:45

Ответ: Sigel
 
Цитата:

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

но сам двиг должен быть универсальным.

на нем должно быть можно писать высокотехнологичные вещи с 4-ми шейдерами (и, соответсвенно, с узким кругом железа), и тупой тетрис, который должен даже на s3 работать.

SBJoker 27.04.2009 12:09

Ответ: Sigel
 
Вот нашел о многозадачности в Windows в целом: http://dtf.ru/articles/read.php?id=39888
Надеюсь будет полезно

HolyDel 28.04.2009 01:37

Ответ: Sigel
 
SBJoker, ага, я ету штуку уже читал. понятно что на одноядерных системах честной многозадачности не получится. но ведь есть же еще многоядерные. и таких систем становится все больше и больше. такчто наверное разумно делать нативную поддержку многояерных систем, и раком - одноядерных.

решил также простые примеры заливать на SVN тоже:

вот например:
http://code.google.com/p/sigelengine...HelloWorld.cpp

moka 28.04.2009 04:17

Ответ: Sigel
 
Отличный пример!
Слушай, а что насчёт того чтобы не DeInit сделать, а Destroy? Помоему более понятно и как-то принято так больше.
Вообще простейший пример, ссупер!

HolyDel 28.04.2009 04:24

Ответ: Sigel
 
можно и Destroy. Но тогда все прошлые примеры придется переделывать.
не думаю что это критично (на крайняк можно просто сделать функцию типа int Destroy {return DeInit();} )

moka 28.04.2009 04:27

Ответ: Sigel
 
Но всёже, сам понимаешь, что как никак, а имена функций лучше раньше продумать, нежели потом когда-то делать чуть ли не полный "рефакторинг" имён функций, лишь потому что из-за не продуманности, они все как бордак..

HolyDel 29.04.2009 02:23

Ответ: Sigel
 
посоветоваться.

есть у меня команда ChangeResolution - она позволяет сменить разрешение динамически (т.е. во время выполнения программы). Все бы хорошо, но мешаются динамические screenspace текстуры (это такие текстуры, в которые рендерится картинка, обычно для постпроцесса). Ясно, что при изменении разрешения, такая текстура уже не будет актуальной и ее надо пересоздать (то же относится и к фреймбуферам, но пока речь не о них).

собственно что можно сделать:

1) ничего не делать. все ложиться на плечи конечного программиста.

2) сделать список screenspace текстур. и при изминении разрешения, они будут обновляться (сжиматься или расширяться, по ситуации)

3) при смене разрешения смотреть все текстуры размером с текущее. и если такие есть то обновить их.

4) комбиация 3 и 4 пункта. если размер текстуры совпадает с размерами екрана, то автоматически заносить ее в список screenspace текстур. Если то не так - то в любой момент можно будет убрать из списка такую текстуру вручную.

SBJoker 29.04.2009 02:24

Ответ: Sigel
 
Второе как то логичнее

moka 29.04.2009 02:58

Ответ: Sigel
 
Я считаю не привязывать такой моммент к движку, это создание по мне так "лишнего" интерфейса и каких-то "тонкостей".
Я полностью за 1ое! Это ведь в разы лучше, чем полностью перегружать ВСЮ медию и всё пересоздовать (ведь при потери графикс девайса, вся медия теряется и вся видео память от этого приложения отчищается, так ведь). А тут мы имеем только какую-то текстуру, пересоздать её, проблем нет для кодера. Но я думаю там могут быть завязки во многих других аспектах с текстурами, поэтому и не делал бы ни 3 ни 2 варрианты.

Вот ещё моммент: 2D, как с ним будет дело обстоять при смене разрешения?

HolyDel 29.04.2009 03:21

Ответ: Sigel
 
напишу свои плюсы и минусы каждого метода:

1. плюсы:
* мне ничего писать не надо
* абсолютная гибкость
минусы:
* пользователю писать много. то не один десяток строчек кода скорее всего.

2. плюсы:
* все понятно. нет никаких "тонкостей"
минусы:
* нужно внимательн смотреть при создании screenspace текстур,незабыть добавить ее в етот список (это скорее всего будет просто tex->ScreenSpace(true);, ну или что то в этом роде

3. плюсы:
* все работает автомаически
минусы:
* все работает автомаически
т.е. если нам нужна именно текстура 1024 на 768, и она случайно совпадет с размероим экрана - то она запишется как screenspace, и никак от етого не уйти.

4. сочетает плюсы 2 и 3-его метода. если ето просто текстура то и выкидываем ее из списка. если не просто - то все работает на автомате.


Цитата:

Это ведь в разы лучше, чем полностью перегружать ВСЮ медию и всё пересоздовать (ведь при потери графикс девайса, вся медия теряется и вся видео память от этого приложения отчищается, так ведь).
дык я о чем. вся фишка етого ChangeResolution в том, что не нужно перезагружать медиа, шейдеры и прочее. само изменение работает за 1-2 секунды. единственное что нужно будет пересоздавать - ето renderable текстуры. все остальное не теряется, даже при переходах fullscreen \ windowed.

Цитата:

Вот ещё моммент: 2D, как с ним будет дело обстоять при смене разрешения?
тут есть тонкость...
по умолчанию 2д будет рисоваться тупо, т.е. если мы сделали, меню например, для 1024 на 768, то в разрешении 1600 на 1200 ето меню будет в левом верхнем углу. НО! если до вывода писать Start2D(1024 на 768 ) то ето меню растянется на весь екран. Причем коррекция происходит на уровне обработки вершин, т.е. качество будет не сильно теряться, как, например при рендере в текстуру и растягивание на весь кран. + граница картинка будет четкой, и даже сглаженной при включеном антиалиасинге.

кстати,добавил Destroy.
DeInit теперь считается deprecated.

moka 29.04.2009 03:28

Ответ: Sigel
 
В первом, самостоятельный менеджер этой темы, пишется за 20 минут.
С 2D, ну поидее мы иссключаем любые возможности перехода с разных соотношений вертикали и горизонтали? Это про то что кто-то запустит в 800,600 на вайд-скрине, и потом сменит на вайд..

jimon 29.04.2009 09:11

Ответ: Sigel
 
HolyDel
просто сделай у текстуры метод TieToWindowSize
переход window\fullscreen сделал так же как и у меня (и у trackmania и тд) - разворот окна на полный екран и отключение оформления ?

HolyDel 29.04.2009 13:13

Ответ: Sigel
 
Цитата:

переход window\fullscreen сделал так же как и у меня (и у trackmania и тд) - разворот окна на полный екран и отключение оформления ?
дык в гл вроде по другому и не сделать.

Цитата:

С 2D, ну поидее мы иссключаем любые возможности перехода с разных соотношений вертикали и горизонтали?
для 3d сцены aspct ratio настраивается автоматически. А вот в 2d да, придется конечному пользователю думать, как сделать так, чтобы выглядело нормально. сам переход возможен, но тогда картинку или сплющит или растянет.


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot