Всем привет.
Просьба протестить то, что в архиве (ето пример маво движка).
и вот етот код: (его надо засунуть в туже папку и отключить Debugger, чтобы было по чесному)
Graphics3D 1024,768,32,1
cam=CreateCamera()
TurnEntity cam,0,180,0
cnt=10000
cube=CreateCube()
tex=LoadTexture("texture.bmp")
EntityTexture cube,tex
last_tick=MilliSecs()
Type cub
Field dx#,dy#,dz#,x#,y#,z#,ax#,ay#,az#,r#
Field ent
End Type
For i=1 To cnt
c.cub=New cub
c\ax=Rnd(-2,2)
c\ay=Rnd(-2,2)
c\az=Rnd(-2,2)
c\dx=Rnd(-0.005,0.005)*57
c\dy=Rnd(-0.005,0.005)*57
c\dz=Rnd(-0.005,0.005)*57
c\r=Rnd(20,50)
c\x=Rnd(-1.57,1.57)*57
c\y=Rnd(-1.57,1.57)*57
c\z=Rnd(-1.57,1.57)*57
c\ent=CopyEntity(cube)
Next
x#=0
y#=0
z#=0
While Not KeyDown(1)
For c.cub=Each cub
x=Sin(c\x)*c\r
y=Cos(c\y)*c\r
z=-50+Sin(c\z)*c\r
c\x=c\x+c\dx
c\y=c\y+c\dy
c\z=c\z+c\dz
PositionEntity(c\ent,x,y,z)
TurnEntity(c\ent,c\ax,c\ay,c\az)
Next
frames=frames+1
If(last_tick<MilliSecs()-1000)
last_tick=MilliSecs()
fps=frames
frames=0
EndIf
RenderWorld
Text 10,10,fps
Flip
Wend
пожалуйста, заметьте фпс и напишите его в етот тред (для обоих случаев)
кстати, вот код из примера
#include "stdafx.h"
#include "..\..\sigel\sigel.cpp" //подрубаем двиг
class Cubes
{
public:
float dx,dy,dz,x,y,z,ax,ay,az,r;
Entity* ent;
};
typedef std::list<Cubes*> culist;
culist cl;
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
AppTitle("Sigle. Texturing"); //нахвание приложения
Init(1024,768,32,1); //инит графического режима
Surface SurfCube; //создание "меша"
SurfCube.MakeCube(1); //что именно создаем (половина размера куба)
Texture CubeTex("texture.bmp");//грузим тексу
const cnt=10000;
for(int i=0;i<cnt;i++)
{
Cubes* cub=new Cubes;
cub->ax=rnd(-2,2);
cub->ay=rnd(-2,2);
cub->az=rnd(-2,2);
cub->dx=rnd(-0.005,0.005);
cub->dy=rnd(-0.005,0.005);
cub->dz=rnd(-0.005,0.005);
cub->r=rnd(20,50);
cub->x=rnd(-1.57,1.57);
cub->y=rnd(-1.57,1.57);
cub->z=rnd(-1.57,1.57);
cub->ent=new Entity(&SurfCube);
cub->ent->BindTex(&CubeTex);
// cub->ent->Hide();
cl.push_back(cub);
}
Font fnt;
fnt.Bind;
float dx=0,dy=0;
char* a=new char[100];
long last_tick=GetTickCount(),fps=0,frames=0;
while(!KeyDown(VK_ESCAPE))//пока не нажали на еск
{
for(culist::const_iterator ci=cl.begin();ci!=cl.end();ci++)
{
float x,y,z;
x=sin((*ci)->x)*(*ci)->r;
y=cos((*ci)->y)*(*ci)->r;
z=-50+sin((*ci)->z)*(*ci)->r;
(*ci)->x+=(*ci)->dx;
(*ci)->y+=(*ci)->dy;
(*ci)->z+=(*ci)->dz;
(*ci)->ent->Position(x,y,z);
(*ci)->ent->Turn((*ci)->ax,(*ci)->ay,(*ci)->az);
}
Render();//рендерим
frames++;
if(last_tick<GetTickCount()-1000)
{
fps=frames;
frames=0;
last_tick=GetTickCount();
}
itoa(fps,a,10);
fnt.DrawText(a,-0.5,0.3);
itoa(Entts::GetInsCount(),a,10);
fnt.DrawText(a,-0.5,0.25);
itoa(Entts::GetOutCount(),a,10);
fnt.DrawText(a,-0.5,0.2);
Flip();//отображаем
}
DeInit();//деинициализация, освобождаем память
return 0;
}
можете заметить, что блицевский синтаксис я не копирую. и не собираюсь.
сам двиг пока ничего не умеет, кроме как выводить объект и текстурить его (ну еще выводить текст). Вывод сделан крайне неоптимально (уже второй день бьюсь над VBO, но пока никак не "побежу", да и от glRotate glTranslate тоже надо избавляться. Однако даже на крайне неоптимальном выводе, мой двиг выводит затекстуренные кубы быстрее чем старичок блиц3д.
сама демка рисует 10000 кубов (и в том и в том случае), затекстуренных тексой 512 на 512.
на моем компе:
sigel - 23-30 фпс
blitz3d - 12-19фпс
к сожалению создать полностью идентичную демку мне не удалось, так что о разумности сравнения не особо заикаюсь, но то, что вывод по крайней мере "не медленнее" - ето имхо факт