 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Fallen JLI MVP


Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 28.09.2006, 23:37 Titel: |
|
|
Ähhm DrawCalls sind Zeitintensiv (!), hier mal eine Tabelle davon mit der Anzahl der Zyklen welche ein Prozesser/GPU für jeden Call braucht.
Als Leitregel gilt je weniger Calls desto besser, das gilt halt besonders für den DX Kram.
Zitat: | SetVertexDeclaration 6500 - 11250
SetFVF 6400 - 11200
SetVertexShader 3000 - 12100
SetPixelShader 6300 - 7000
SPECULARENABLE 1900 - 11200
SetRenderTarget 6000 - 6250
SetPixelShaderConstant (1 Constant) 1500 - 9000
NORMALIZENORMALS 2200 - 8100
LightEnable 1300 - 9000
SetStreamSource 3700 - 5800
LIGHTING 1700 - 7500
DIFFUSEMATERIALSOURCE 900 - 8300
AMBIENTMATERIALSOURCE 900 - 8200
COLORVERTEX 800 - 7800
SetLight 2200 - 5100
SetTransform 3200 - 3750
SetIndices 900 - 5600
AMBIENT 1150 - 4800
SetTexture 2500 - 3100
SPECULARMATERIALSOURCE 900 - 4600
EMISSIVEMATERIALSOURCE 900 - 4500
SetMaterial 1000 - 3700
ZENABLE 700 - 3900
WRAP0 1600 - 2700
MINFILTER 1700 - 2500
MAGFILTER 1700 - 2400
SetVertexShaderConstant (1 Constant) 1000 - 2700
COLOROP 1500 - 2100
COLORARG2 1300 - 2000
COLORARG1 1300 - 1980
CULLMODE 500 - 2570
CLIPPING 500 - 2550
DrawIndexedPrimitive 1200 - 1400
ADDRESSV 1090 - 1500
ADDRESSU 1070 - 1500
DrawPrimitive 1050 - 1150
SRGBTEXTURE 150 - 1500
STENCILMASK 570 - 700
STENCILZFAIL 500 - 800
STENCILREF 550 - 700
ALPHABLENDENABLE 550 - 700
STENCILFUNC 560 - 680
STENCILWRITEMASK 520 - 700
STENCILFAIL 500 - 750
ZFUNC 510 - 700
ZWRITEENABLE 520 - 680
STENCILENABLE 540 - 650
STENCILPASS 560 - 630
SRCBLEND 500 - 685
TWOSIDEDSTENCILMODE 450 - 590
ALPHATESTENABLE 470 - 525
ALPHAREF 460 - 530
ALPHAFUNC 450 - 540
DESTBLEND 475 - 510
COLORWRITEENABLE 465 - 515
CCW_STENCILFAIL 340 - 560
CCW_STENCILPASS 340 - 545
CCW_STENCILZFAIL 330 - 495
SCISSORTESTENABLE 375 - 440
CCW_STENCILFUNC 250 - 480
SetScissorRect 150 - 340 |
In der DirectX Dokumentation gibt es ein Thema dazu, wenn du mehr über diese Zeiten wissen möchtest:
Accurately Profiling Direct3D API Calls
mfg Mark _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
Maxim Senior JLI'ler
Anmeldedatum: 28.03.2004 Beiträge: 249
Medaillen: Keine
|
Verfasst am: 29.09.2006, 10:48 Titel: |
|
|
DrawCalls sind Zeitintensiv. Das ist eine Tatsache, die bei einem Hobby-Projekt (vor allem bei kleineren) total vernachlässigt werden kann. Wenn man zu wenig Frames/sec hat, dann hat man was falsch gemacht und es muss nicht an DrawCalls liegen
@Andy-Mad: mach dir keine Gedanken darüber. Optimieren kannst du später immer noch. |
|
Nach oben |
|
 |
Andy-Mad Mini JLI'ler
Alter: 43 Anmeldedatum: 18.09.2006 Beiträge: 34
Medaillen: Keine
|
Verfasst am: 29.09.2006, 14:03 Titel: |
|
|
Ok ich werde erstmal versuchen die Grundfunktionen zu meinem kleinen Jump and Run hinzubekommen |
|
Nach oben |
|
 |
Andy-Mad Mini JLI'ler
Alter: 43 Anmeldedatum: 18.09.2006 Beiträge: 34
Medaillen: Keine
|
Verfasst am: 29.09.2006, 15:32 Titel: |
|
|
Ich poste jetzt mal den Quelltext der Main Datei vieleicht kannst du mir dort sagen wie ich verhindern kann dass mein Sprite nicht durch das Tile blue durchlaufen oder durchfallen kann
die Map hat keine bedeutung ist nur zum testen
CPP: | // Headerdateien
#include "Direct3D.h"
#include "Sprite.h"
#include "tile.h"
// Anwendungsfenster erzeugen
HWND CreateMainWindow(HINSTANCE hInstance);
// Callback Funktion zur Nachrichtenbehandlung
LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
// Das Fensterhandle
HWND hWnd = 0;
// Instanz der Klasse CDirect3D
CDirect3D Direct3D;
// Instanz der Klasse CSprite
CTile black , blue;
CSprite Sprite;
const unsigned int map_breite = 5;
const unsigned int map_hoehe = 25;
int tilemap[map_hoehe][map_breite] = { 0, 2, 2, 2, 2,
2, 2, 2, 2, 2,
2, 2, 2, 2, 2,
2, 2, 2, 2, 2,
2, 2, 2, 2, 2,
2, 2, 2, 2, 2,
2, 2, 2, 2, 2,
2, 2, 2, 2, 2,
2, 2, 2, 2, 2,
2, 2, 2, 2, 2,
2, 2, 2, 2, 2,
2, 2, 2, 2, 2,
2, 2, 2, 2, 2,
2, 2, 2, 2, 2,
2, 2, 2, 2, 2,
2, 2, 2, 2, 2,
1, 1, 1, 2, 2,
1, 2, 2, 2, 2,
2, 2, 2, 2, 2,
2, 2, 2, 2, 2 ,
2, 2, 2, 2, 2,
2, 2, 2, 2, 2,
2, 2, 1, 2, 2,
1, 1, 1, 1, 2,
};
// Windows main-Funktion
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// Fenster erzeugen und Handle speichern
hWnd = CreateMainWindow(hInstance);
// Wenn der Rückgabewert 0 ist, ist ein Fehler aufgetreten
if(0 == hWnd)
{
MessageBox(0,"Fenster konnte nicht erzeugt werden","Fehler",MB_OK);
return -1;
}
// Direct3D initialisieren
if(!Direct3D.Init(hWnd,FALSE))
{
return -1;
}
// Maus-Cursor verstecken
ShowCursor(FALSE);
// Farbe die beim Löschen verwendet werden soll
Direct3D.SetClearColor(D3DCOLOR_XRGB(0,0,0));
char Filename[128];
// Sprite anlegen
blue.Create(Direct3D.GetDevice(), "tile/blue.bmp");
black.Create(Direct3D.GetDevice(), "tile/black.bmp");
Sprite.Create(Direct3D.GetDevice(),1);// "player/mario1.bmp");
// Grafiken (Texturen) laden
for(int i=0;i<2;i++)
{
sprintf_s(Filename,"player/mario%d.png",i+1);
Sprite.AddTexture(Filename);
}
Sprite.col=blue.m_vPosition.x;
// Struktur, in der Informationen zur Nachricht gespeichert werden
MSG msg = { 0 };
DWORD dwTime1, dwTime2;
float fTime = 0.0f;
while(msg.message != WM_QUIT)
{
dwTime1 = timeGetTime();
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
// Tasten abfragen und Sprite entsprechend bewegen
if(GetAsyncKeyState(VK_LEFT) & 0x8000)
{
Sprite.Move(LEFT,fTime);
}
else if(GetAsyncKeyState(VK_RIGHT) & 0x8000)
{
Sprite.Move(RIGHT,fTime);
//Sprite.Animate(fTime);
}
if(GetAsyncKeyState(VK_UP) & 0x8000)
{
//Sprite.Kraft=50.3f;
Sprite.Move(UP,fTime);
}
else if(GetAsyncKeyState(VK_DOWN) & 0x8000)
{
Sprite.Move(DOWN,fTime);
}
Direct3D.BeginScene();
// map zeichnen (tiles sind 53x38 pixel groß)
for( int i = 0; i < map_hoehe; i++)
{
for( int j = 0; j < map_breite; j++)
{
switch( tilemap[i][j] )
{
case 1:
blue.SetPosition(j*32, i*32);
blue.Draw();
break;
case 2:
black.SetPosition(j*32, i*32);
black.Draw();
break;
default:
break;
}
}
}
Sprite.Draw();
Sprite.jump(fTime);
Direct3D.EndScene();
dwTime2 = timeGetTime();
fTime = (float)(dwTime2 - dwTime1) / 100.0f;
}
}
// Rückgabewert an Windows
return 0;
}
// Fenster erzeugen
HWND CreateMainWindow(HINSTANCE hInstance)
{
WNDCLASSEX wndClass =
{
sizeof(WNDCLASSEX), // Größe angeben
CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW, // Standardstile
MessageHandler, // Callback-Funktion
0, // Zusätzliche Angaben
0, // nicht benötigt
hInstance, // Anwendungsinstanz
LoadIcon(NULL, IDI_WINLOGO), // Windows-Logo
LoadCursor(NULL, IDC_ARROW), // Normaler Cursor
(HBRUSH)GetStockObject(WHITE_BRUSH), // Weißer Pinsel
NULL, // kein Menü
"WindowClass", // Der Name der Klasse
LoadIcon(NULL, IDI_WINLOGO) // Windows Logo
};
// Klasse registrieren
RegisterClassEx(&wndClass);
return CreateWindowEx(NULL, // Keine erweiterten Stile nutzen
"WindowClass", // Klassenname
"SpriteAnim", // Fenstertitel
WS_OVERLAPPEDWINDOW | // Fenster
WS_VISIBLE, // Eigenschaften
0, 0, // Anfangsposition
SCR_WIDTH, SCR_HEIGHT, // und Größe des Fensters
NULL, // Handle des Elternfensters
NULL, // Handle des Menüs
hInstance, // Anwendungsinstanz
NULL); // wird nicht benötigt
}
// Diese Funktion wird von Windows aufgrufen, wenn
// eine Nachricht für Ihr Programm vorliegt
LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
// testen, um welche Nachricht es sich handelt
switch(msg)
{
// Programm beenden, wenn das Fenster
// geschlossen wird
case WM_DESTROY:
PostQuitMessage(0);
return 0;
break;
case WM_KEYDOWN:
switch(wParam)
{
// Bei F1 einen Screenshot speichern
case VK_F1:
Direct3D.CreateScreenshot("c:\\screenshot.bmp");
break;
// Wenn ESC gedrückt, Programm beenden
case VK_ESCAPE:
DestroyWindow(hWnd);
break;
}
break;
}
// Standardnachrichtenverarbeitung von Windows
return DefWindowProc(hwnd, msg, wParam, lParam);
}[/ |
also mein Sprite darf nicht durch die 1 in der Map durchlaufen sondern nur duch die 2
ich weis sind doofe Fragen ich weis nur nicht wie ich es am besten beschreiben soll
Zuletzt bearbeitet von Andy-Mad am 30.09.2006, 13:48, insgesamt 2-mal bearbeitet |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 30.09.2006, 12:05 Titel: |
|
|
Andy-Mad hat Folgendes geschrieben: | also mein Sprite darf nicht durch die 1 in der Map durchlaufen sondern nur duch die 2
ich weis sind doofe Fragen ich weis nur nicht wie ich es am besten beschreiben soll |
Wenn ich dir vorab schon mal empfehlen kann, dass du nicht alles in deine WinMain packst, sondern das in verschiedenen Funktionen aufdröselst, ist das sicher schon um vieles übersichtlicher und auch einfacher zu verstehen/einzubauen
Was die Posts hier im Forum betrifft, so gibt es auch die CPP-Tags (statt [code ] einfach [cpp ] verwenden, ohne die Leerzeichen natürlich), durch das Syntaxhighlighting wirds noch mal einfacher zu lesen.
Also, du hast sicher in irgendeiner Variable die Position deines (Spieler-?)Sprites gespeichert. Wenn du die durch die Größe deiner Tiles teilst, bekommst du schon mal heraus, welche Indizies du bei deinem tilemap-2D-Array ungefähr bei der Überprüfung verwenden musst. (Ich sage "ungefähr", weil das Sprite ja auch zwischen zwei Tiles stehen kann und deshalb eigentlich immer mehrere Tiles auf Kollision überprüft werden müssen). Jedenfalls gehst du jetzt das Umfeld deines Sprites in dem tilemap-Array durch und überprüfst erst mal, welche Tiles massives Material darstellen und welche durchgeh- und durchfallbar sind. (Das sollte wohl nicht schwer fallen )
Jetzt musst du eben je nach gedrückter Taste und aktueller Position des Sprites differenzieren: Wird z.B. die rechte Cursortaste gedrückt, überprüfst du, ob eine Kollision stattfinden würde, wenn du das Sprite bewegen würdest. Wenn dies der Fall ist, brachst du Sprite.Move(RIGHT,fTime); erst gar nicht aufzurufen. So verfährst du für jede Bewegungsrichtung. Ich hoffe, das reicht erst mal als Denkanstoß  _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
 |
Andy-Mad Mini JLI'ler
Alter: 43 Anmeldedatum: 18.09.2006 Beiträge: 34
Medaillen: Keine
|
Verfasst am: 30.09.2006, 13:49 Titel: |
|
|
Ok habs geändert mit dem Code |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|