Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.net  
   

Die mobilen Seiten von c++.net:
https://m.c-plusplus.net

  
C++ Forum :: C++ (alle ISO-Standards) ::  Versuche Directx Programmcode zu Optimieren (c++)  
Gehen Sie zu Seite 1, 2  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
TippoMax
Mitglied

Benutzerprofil
Anmeldungsdatum: 12.01.2016
Beiträge: 2
Beitrag TippoMax Mitglied 11:19:25 20.03.2018   Titel:   Versuche Directx Programmcode zu Optimieren (c++)            Zitieren

Hallo zusammen,

ich versuche schon seit langem mit die DX Programmierung beizubringen.
Als erstes habe ich mir ein Tutorial geschnappt und wollte es so umschreiben wie ich es gerne haben möchte, und da komme ich einfach nicht weiter!

1. In der Hauptdatei sollte wenn möglich nur die wMain sein.
2. Alle anderen Programmteile rufe ich dann über Funktionen auf.( Quasi alle Positionen im Inhaltsverzeichnis )

Nun einige haben bei meinem Projekt Funktioniert und manche nicht.



Ich hoffe mir kann jemand sagen, warum ich z.B die Funktion ( FrameRender() ) nicht in eine andere Datei auslagern kann ...--> Fehlermeldung "Zugriffsverletzung Pointer--> NULL"



Hauptdatei:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
 (Tutorial01.cpp)
//--------------------------------------------------------------------------------------
// File: Tutorial01.cpp
//
// This application demonstrates creating a Direct3D 11 device
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//--------------------------------------------------------------------------------------
//---------------------------------INHALTSVERZEICHNIS-----------------------------------
 
//----1--------DECLARATION+Foward declaration
//----2--------WINMAIN zur initalisierung
//----3--------Registrieren der Klassen und erzeugen eines Fensters
//----4--------Nachrichtenschleife
//----5--------Erzeugen eines "Direct3D Gerätes" und eines  "swap chain" (Übersetzt Tauschkette )
//----6--------Frame wird gerändert
//----7--------Grafikkarte wird geleert und Heruntergefahren
/*
Benötigtes Werkzeug:
 
MessageBox(0, L"Haltepunkt 2", L"Meine App", MB_OK);
 
*/

//----1----------------------------------------------------------------------------------
#include <iostream>
#include <windows.h>
#include <d3dcompiler.h>
#include <d3d10_1.h>
#include <d3d11.h>
#include <d3dx11.h>
#include "GlobDefinitionen.cpp"
#include "DXGeräteini.h"
#include "Resourcedefinitionen.h"
#include "DXHerrunterfahren.h"
#include "DXRendern.h"
#include <directxcolors.h>
#include <directxmath.h>
#include "WINFenster.h"
#include <math.h>
#include <assert.h>
using namespace DirectX;
 
// Forward Dekleration
HRESULT FensterInit( HINSTANCE hInstance, int nCmdShow );
 
 
HRESULT GeräteInit();
void FrameRender();
 
void FrameRender()
{
    // "backbuffer" wird geleert
    float ClearColor[4] = { 0.3f, 0.125f, 0.3f, 1.0f };                     //red,green,blue,alpha->AbstandzurKamera            Hintergrundfarbe
                                                                           
    (*g_pImmediateContext).ClearRenderTargetView(g_pRenderTargetView, ClearColor);
    //
    // Präsentieren Sie unseren Rückenpuffer zu unserem Frontpuffer
    //
    (*g_pSwapChain).Present(0, 0);
}
 
 
 
 
//----2----------------------------------------------------------------------------------
// Einstiegspunkt zum Programm Initialisiert alles und geht in eine Nachrichtenverarbeitung Schleife.
// Die Leerlaufzeit wird zum Rendern der Szene verwendet.
//--------------------------------------------------------------------------------------
int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow )
{
   
   
    UNREFERENCED_PARAMETER( hPrevInstance );
    UNREFERENCED_PARAMETER( lpCmdLine );
 
    if( FAILED( FensterInit( hInstance, nCmdShow ) ) )
    {
        MessageBox(0, L"Fehler! Windows Fenster Initialisierung", L"Meine App", MB_OK);
        return 0;
    }
   
   
    if ( FAILED (GeräteInit ()))
    {
        MessageBox(0, L"Fehler! Geräte Initialisierung", L"Meine App", MB_OK);
        Gerätherunterfahren();
        return 0;
    }
 
    // Haupt Nachrichtenschleife
    MSG msg = {0};
    while( WM_QUIT != msg.message )
    {
        if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
        {
            TranslateMessage( &msg );
            DispatchMessage( &msg );
        }
        else
        {
        FrameRender();
        }
    }
    //--------7------------------------------------------------------------------------------
    // Grafikkarte wird geleert und Heruntergefahren
    //--------------------------------------------------------------------------------------
    Gerätherunterfahren();
 
    return ( int )msg.wParam;
}
 
//-----4---------------------------------------------------------------------------------
// Wird jedes Mal aufgerufen, wenn die Anwendung eine Nachricht erhält
//--------------------------------------------------------------------------------------
LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
   
    PAINTSTRUCT ps;
    HDC hdc;
    switch( message )
    {
        case WM_PAINT:
            hdc = BeginPaint( hWnd, &ps );
 
           
           
            //Ausgabe von Text---------------------------
 
            SetTextColor(hdc, RGB(220, 100, 0));
            TextOut(hdc, 10, 10, TEXT("Hallo ihr futzies" ), 17);
                       
            //--------------------------------------------
            EndPaint( hWnd, &ps );
            break;
 
        case WM_DESTROY:
            PostQuitMessage( 0 );
            break;
 
        default:
            return DefWindowProc( hWnd, message, wParam, lParam );
    }
   
    return 0;
}
 
 
 
//-----3---------------------------------------------------------------------------------
// Register class and create window
//--------------------------------------------------------------------------------------
HRESULT FensterInit(HINSTANCE hInstance, int nCmdShow)
{
    //// Register class
   
    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc = WndProc;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = hInstance;
    wcex.hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MYICON));                                  //ICON im Fenster wenn ALT+TAB verwendet wird
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)CreateSolidBrush(RGB(255, 0, 0));
    wcex.lpszMenuName = MAKEINTRESOURCE(IDR_MYMENU);
    wcex.lpszClassName = L"TutorialWindowClass";
    wcex.hIconSm = (HICON)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MYICON), IMAGE_ICON, 16, 16, 0); //ICON links oben im Fenster
    if (!RegisterClassEx(&wcex))
    {
        MessageBox(0, L"Windows Klasse konnte nicht Registriert werden!", L"Meine App", MB_OK);
 
        return 0;
    }
   
    // Create window
    g_hInst = hInstance;
    RECT rc = { 0, 0, 640, 480 };
    AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, FALSE);
    g_hWnd = CreateWindowEx(WS_EX_CLIENTEDGE, L"TutorialWindowClass", L"Direct3D Version 11 Tutorial 1", WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, rc.right - rc.left, rc.bottom - rc.top, NULL, NULL, hInstance,NULL);
    if (!g_hWnd)
    {
        MessageBox(0, L"Windows konnte das Fenster nicht umsetzen!", L"Meine App", MB_OK);
        return E_FAIL;
    }
    //Fenster wird angezeigt
    ShowWindow(g_hWnd, nCmdShow);
 
    return S_OK;
}
//*/
 
 
 
 
 
 
///*
//-------5-------------------------------------------------------------------------------
// Create Direct3D device and swap chain
//--------------------------------------------------------------------------------------
HRESULT GeräteInit()
{
    static HRESULT hr = S_OK;
    static RECT rc;                                         //Die RECT-Struktur definiert die Koordinaten der oberen linken und unteren rechten Ecke eines Rechtecks.
    GetClientRect( g_hWnd, &rc );
    UINT width = rc.right - rc.left;
    UINT height = rc.bottom - rc.top;
 
    UINT createDeviceFlags = 0;
#ifdef _DEBUG
    createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG;
#endif
 
    D3D_DRIVER_TYPE driverTypes[] =
    {
        D3D_DRIVER_TYPE_HARDWARE,
        D3D_DRIVER_TYPE_WARP,
        D3D_DRIVER_TYPE_REFERENCE,
    };
    UINT numDriverTypes = ARRAYSIZE( driverTypes );
 
    D3D_FEATURE_LEVEL featureLevels[] =
    {
        D3D_FEATURE_LEVEL_11_0,
        D3D_FEATURE_LEVEL_10_1,
        D3D_FEATURE_LEVEL_10_0,
    };
    UINT numFeatureLevels = ARRAYSIZE( featureLevels );
   
    DXGI_SWAP_CHAIN_DESC sd;
    ZeroMemory( &sd, sizeof( sd ) );
    sd.BufferCount = 1;
    sd.BufferDesc.Width = width;
    sd.BufferDesc.Height = height;
    sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    sd.BufferDesc.RefreshRate.Numerator = 60;
    sd.BufferDesc.RefreshRate.Denominator = 1;
    sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
    sd.OutputWindow = g_hWnd;
    sd.SampleDesc.Count = 1;
    sd.SampleDesc.Quality = 0;
    sd.Windowed = TRUE;
 
    for( UINT driverTypeIndex = 0; driverTypeIndex < numDriverTypes; driverTypeIndex++ )
    {
        g_driverType = driverTypes[driverTypeIndex];
        hr = D3D11CreateDeviceAndSwapChain(NULL, g_driverType, NULL, createDeviceFlags, featureLevels, numFeatureLevels,
                                            D3D11_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice, &g_featureLevel, &g_pImmediateContext );
        if( SUCCEEDED( hr ) )
            break;
    }
    if( FAILED( hr ) )
        return hr;
 
    // Create a render target view
    ID3D11Texture2D* pBackBuffer = NULL;
    hr = g_pSwapChain->GetBuffer( 0, __uuidof( ID3D11Texture2D ), ( LPVOID* )&pBackBuffer );
    if( FAILED( hr ) )
        return hr;
 
    hr = g_pd3dDevice->CreateRenderTargetView( pBackBuffer, NULL, &g_pRenderTargetView );
    (*pBackBuffer).Release();
    if( FAILED( hr ) )
        return hr;
 
    (*g_pImmediateContext).OMSetRenderTargets( 1, &g_pRenderTargetView, NULL );
 
    // Einrichten der Kamera
    D3D11_VIEWPORT vp;
    vp.Width = (FLOAT)width;
    vp.Height = (FLOAT)height;
    vp.MinDepth = 0.0f;
    vp.MaxDepth = 1.0f;
    vp.TopLeftX = 0;
    vp.TopLeftY = 0;
    g_pImmediateContext->RSSetViewports( 1, &vp );
   
    return S_OK;
}
//*/





//DXRender.h Datei
Code:
#ifndef DXRENDERN_H
#define DXRENDERN_H
 
 
void FrameRender();
#endif

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  DXRender.CPP   // Text ist der Hauptdatei nur rauskopiert worden

 
#include "GlobDefinitionen.cpp"

#include "DXRendern.h"
 
 
 
//--------6------------------------------------------------------------------------------
// Frame wird gerändert
//--------------------------------------------------------------------------------------
void FrameRender()
{
    // "backbuffer" wird geleert
    float Hintergrundfarbe[4] = { 0.3f, 0.125f, 0.3f, 1.0f };                       //red,green,blue,alpha->AbstandzurKamera            Hintergrundfarbe
   
    (*g_pImmediateContext).ClearRenderTargetView(g_pRenderTargetView, Hintergrundfarbe);
    //
    // Präsentieren Sie unseren Rückenpuffer zu unserem Frontpuffer
    //
    (*g_pSwapChain).Present(0, 0);
}



C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
 // Globeldefinitions.cpp

 
#ifndef GLOBDEFINITIONEN_CPP

#define GLOBDEFINITIONEN_CPP
#include <d3d10_1.h>
#include <d3d11.h>
#include <d3dx11.h>
 
 
//Windows Script Definitionen
#define ID_ICON_SMALL 1
#define IDI_MYICON 2
#define IDR_MYMENU 3
 
    //--------------------------------------------------------------------------------------
    // Globale Variables
    //--------------------------------------------------------------------------------------
   
    static D3D_DRIVER_TYPE         g_driverType = D3D_DRIVER_TYPE_NULL;
    static D3D_FEATURE_LEVEL       g_featureLevel = D3D_FEATURE_LEVEL_11_0;
    static ID3D11Device*           g_pd3dDevice = nullptr;
    static ID3D11DeviceContext*    g_pImmediateContext = nullptr;
    static IDXGISwapChain*         g_pSwapChain = nullptr;
    static ID3D11RenderTargetView* g_pRenderTargetView = nullptr;
 
    //--------------------------------------------------------------------------------------
    // Globale Variables Windows Parameter
    //--------------------------------------------------------------------------------------
    static WNDCLASSEX wcex;
    static HINSTANCE               g_hInst = nullptr;
    static HWND                    g_hWnd = nullptr;

 
#endif
rapso
Moderator

Benutzerprofil
Anmeldungsdatum: 17.06.2002
Beiträge: 8807
Beitrag rapso Moderator 17:07:07 20.03.2018   Titel:              Zitieren

was sagt dein debugger welcher pointer null ist?

_________________
follow me|
-Mod im Spiele-/Grafikprogrammierung
TippoMax2
Unregistrierter




Beitrag TippoMax2 Unregistrierter 18:32:54 20.03.2018   Titel:   Antwort des Compilers:            Zitieren

rapso schrieb:
was sagt dein debugger welcher pointer null ist?



Antwort des Compilers: :live:

Ausgelöste Ausnahme: Lesezugriffsverletzung

"g_pImmediateContext" war "nullptr".

Falls ein Handler für diese Ausnahme vorhanden ist, kann das Programm möglicherweise weiterhin sicher ausgeführt werden.
rapso
Moderator

Benutzerprofil
Anmeldungsdatum: 17.06.2002
Beiträge: 8807
Beitrag rapso Moderator 13:19:53 21.03.2018   Titel:   Re: Antwort des Compilers:            Zitieren

TippoMax2 schrieb:
rapso schrieb:
was sagt dein debugger welcher pointer null ist?

Antwort des Compilers: :live:

Ausgelöste Ausnahme: Lesezugriffsverletzung

"g_pImmediateContext" war "nullptr".

Falls ein Handler für diese Ausnahme vorhanden ist, kann das Programm möglicherweise weiterhin sicher ausgeführt werden.

Der compiler erstellt nur das program, zur laufzeit ist dieser nicht mehr vorhanden. Du wirst das wohl in deiner IDE vom debugger erhalten.

Jetzt musst du den pointer nur noch iniitialisieren.


ach ja, kannst du mir sagen, was du durch das "static" in:
C++:
static IDXGISwapChain*         g_pSwapChain = nullptr;

beabsichtigst?

_________________
follow me|
-Mod im Spiele-/Grafikprogrammierung
TippoMax3
Unregistrierter




Beitrag TippoMax3 Unregistrierter 13:38:30 21.03.2018   Titel:   Re: Antwort des Compilers:            Zitieren

rapso schrieb:
TippoMax2 schrieb:
rapso schrieb:
was sagt dein debugger welcher pointer null ist?

Antwort des Compilers: :live:

Ausgelöste Ausnahme: Lesezugriffsverletzung

"g_pImmediateContext" war "nullptr".

Falls ein Handler für diese Ausnahme vorhanden ist, kann das Programm möglicherweise weiterhin sicher ausgeführt werden.

Der compiler erstellt nur das program, zur laufzeit ist dieser nicht mehr vorhanden. Du wirst das wohl in deiner IDE vom debugger erhalten.

Jetzt musst du den pointer nur noch iniitialisieren.


ach ja, kannst du mir sagen, was du durch das "static" in:
C++:
static IDXGISwapChain*         g_pSwapChain = nullptr;

beabsichtigst?



Hallo ,

ohne den "Static" Befehl habe ich eine mehrfach deklaration und wie ich die verhindern kann weiß ich nicht.





Fehlercode des Compilers beim weglassen des STATIC befehls


Fehler LNK2005 "struct ID3D11RenderTargetView *
g_pRenderTargetView" (?g_pRenderTargetView@@3PEAUID3D11RenderTargetView@@EA)
ist bereits in DXHerrunterfahren.obj definiert.




Datei Globdefinitionen.cpp
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "DxHerrunterfahren.h"
#include "GlobDefinitionen.cpp"
 
//--------7------------------------------------------------------------------------------
// Grafikkarte wird geleert und Heruntergefahren
//--------------------------------------------------------------------------------------
void Gerätherunterfahren()
{
   
    if (g_pImmediateContext) (*g_pImmediateContext).ClearState();
    if (g_pRenderTargetView) (*g_pRenderTargetView).Release();
    if (g_pSwapChain) (*g_pSwapChain).Release();
    if (g_pImmediateContext) (*g_pImmediateContext).Release();
    if (g_pd3dDevice) (*g_pd3dDevice).Release();
   
}
rapso
Moderator

Benutzerprofil
Anmeldungsdatum: 17.06.2002
Beiträge: 8807
Beitrag rapso Moderator 13:45:11 21.03.2018   Titel:              Zitieren

Das "static" ist die Quelle deines Problems. Du musst die Grundlagen von C++ lernen, damit du etwas bewerkstelligen kannst, ansonsten wirst du wegen solcher grundlegenden Dinge immer wieder steckenbleiben.

Ich verschiebe das mal in den C++ Bereich, da wird dir schneller geholfen. (Weil es nichts mit Spiele-/Grafikprogrammierung zu tun hat ;) )

_________________
follow me|
-Mod im Spiele-/Grafikprogrammierung
C++ Forumbot
Forumbot

Benutzerprofil
Anmeldungsdatum: 29.02.2004
Beiträge: 20525
Beitrag C++ Forumbot Forumbot 13:45:26 21.03.2018   Titel:              Zitieren

Dieser Thread wurde von Moderator/in rapso aus dem Forum Spiele-/Grafikprogrammierung in das Forum C++ (alle ISO-Standards) verschoben.

Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?


Dieses Posting wurde automatisch erzeugt.

_________________
Besuchen Sie unsere Bücherecke.
http://www.c-plusplus.de/bucher.php
Mit jeder Bestellung unterstützen Sie das Forum.
camper
Moderator

Benutzerprofil
Anmeldungsdatum: 06.08.2004
Beiträge: 7363
Beitrag camper Moderator 14:22:03 21.03.2018   Titel:              Zitieren

cpp schrieb:
#include "GlobDefinitionen.cpp"
Wer so etwas macht, darf alle entstehenden Probleme behalten.

1. Wenn es Includeguards hat, dann ist es ein Header und sollte auch so benannt sein. .cpp implizit die Quelle einer eigenständigen Objektdatei, nicht etwas, dass in mehreren Übersetzungseinheiten (ÜE) eingebunden werden soll.
2. Globale Variablen sind böse.
3. Globale Variablen sind böse.
4. Es wird nicht besser
5.
6.
7.
8. ...
9. ...
10. Du sollst keine globalen Variablen einsetzen.

Elftes Gebot:
Im Allgemeinen darf eine Variable nur einmal im Programm definiert werden. Deklarationen dürfen gerne so oft sie wollen auftreten, sofern sie alle übereinstimmen.
Ohne static ist diese One-Definition-Rule (ODR) offenkundig verletzt.
Mit static ist sie bloß deswegen nicht verletzt, weil static (in diesem Zusammenhang; static hat ja noch andere Verwendungen) internal linkage impliziert, der Linker bekommt dieses Symbol nie zu sehen und jede ÜE hat ihre eigene Version dieser Variablen, die mit den Anderen nichts zu tun hat.

Wenn dann also irgendwo in main eine Variable g_pImmediateContext initialisiert, ist das ein anderes Objekt als dasjenige, welches FrameRender, das ja in einer anderen ÜE definiert ist, als die Variable g_pImmediateContext ansieht - dieses Objekt behält seinen Wert, den es beim Programmstart erhalten hat (nämlich nullptr).

Nebenbemerkung: diese Verwendung von static ist in C++ veraltet, für diesen Zweck (wenn man also tatsächlich mal die gleiche Entität in verschiedenen ÜEs mehrfach haben will) sind anonyme Namensräume gedacht.

12.
Wenn also eine einzige globale Variable in mehreren ÜEs verwendet werden soll, dann darf *bisher* im Header nur eine Deklaration dieser Variablen auftreten.
Das geschieht mit dem Schlüsselwort extern. Wichtig ist, dass diese Deklaration keinen Initialisierer enthält, sonst wird es zur Definition.
Header:
C++:
extern int foo;

In einer einzigen Übersetzungseinheit muss diese Variable noch definiert werden, dort gehört dann ggf. ein Initialisierer hin:
C++:
#include "header"
int foo = 42;
Diese Verdopplung des Codes ist unschön, insbesondere wenn man größere Mengen an Konstanten definieren will.

Eine traditionelle Möglichkeit, diese Verdopplung zu vermeiden, setzt den Präprozessor ein. Die Deklaration im Header enthält zusätzlich den Initialisierer aber maskiert durch ein Makro. Dieses Makro hat dann nur in einer einzigen ÜE, die für die Definition zuständig ist, einen anderen Wert.
Beispiel:
Header
C++:
#ifndef DO_INITIALIZE
#define DO_INITIALISE(x)
#endif
 
extern int foo DO_INITIALIZE(42);

Nur in einer Quelldatei:
C++:
#define DO_INITIALIZE(x) = x
#include "header"


13. Mit C++17 und hinreichender Unterstützung durch den Compiler (jetzt auch für die armen Programmierer, die auf Mikroweichs Compiler angewiesen sind, verfügbar), kann das das Schlüsselwort inline ganz analog zu traditionellen Inline-Funktionen eingesetzt werden.
Header:
C++:
inline int foo = 42; // und fertig


14. Globale Variablen sind immer noch böse.
Jockelx
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.12.2009
Beiträge: 1397
Beitrag Jockelx Mitglied 14:29:59 21.03.2018   Titel:              Zitieren

Ich hätte in den 14 Geboten gerne ein 'non-const' gesehen.
TippoMax4
Unregistrierter




Beitrag TippoMax4 Unregistrierter 18:04:21 21.03.2018   Titel:              Zitieren

Ok Vielen Dank für die Erleuterungen.
Es ist wichtig für einen Anfänger zu hören was SINNVOLL ist und was nicht.
Da ich in Büchern nur die Theorie erlernen kann, und nicht die "Sinnvolle" ausführungen.

Ok meine ursprüngliche Frage bleibt dennoch bestehen. Wie fange ich ein sinnvolles Projekt an. ( Auch ohne Globale Variablen ) ;-)
Wie schaffe ich es die Punkte 3-7 aus meiner Haupt Datei zu bekommen ?
Mein Code sah mal vor der Funktionauslagerung so aus.....


C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
//---------------------------------INHALTSVERZEICHNIS-----------------------------------
 
//----1--------DECLARATION+Foward declaration
//----2--------WINMAIN zur initalisierung
//----3--------Registrieren der Klassen und erzeugen eines Fensters
//----4--------Nachrichtenschleife
//----5--------Erzeugen eines "Direct3D Gerätes" und eines  "swap chain" (Übersetzt Tauschkette )
//----6--------Frame wird gerändert
//----7--------Grafikkarte wird geleert und Heruntergefahren
/*
Benötigtes Werkzeug:
 
MessageBox(0, L"Haltepunkt 2", L"Meine App", MB_OK);
 
*/

//----1----------------------------------------------------------------------------------
#include <iostream>
#include <windows.h>
#include <d3d10_1.h>
#include <d3d11.h>
#include <d3dx11.h>
#include "GlobDefinitionen.cpp"
#include "Resourcedefinitionen.h"
#include "DXHerrunterfahren.h"

#include <directxcolors.h>

#include <directxmath.h>
 
 
using namespace std;
 
// Forward Dekleration
HRESULT FensterInit( HINSTANCE hInstance, int nCmdShow );
HRESULT GeräteInit();
 
 
//--------6------------------------------------------------------------------------------
// Frame wird gerändert
//--------------------------------------------------------------------------------------
void Rendern()
{
    // "backbuffer" wird geleert
    float ClearColor[4] = { 0.3f, 0.125f, 0.3f, 1.0f };                     //red,green,blue,alpha->AbstandzurKamera            Hintergrundfarbe
    (*g_pImmediateContext).ClearRenderTargetView(g_pRenderTargetView, ClearColor);
    //
    // Präsentieren Sie unseren Rückenpuffer zu unserem Frontpuffer
    //
    (*g_pSwapChain).Present(0, 0);
}
 
 
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);      //Wird in der Nachrichtenschleife erneut declariert
//---------------------------------------------------------------------------------------
 
//----2----------------------------------------------------------------------------------
// Einstiegspunkt zum Programm Initialisiert alles und geht in eine Nachrichtenverarbeitung Schleife.
// Die Leerlaufzeit wird zum Rendern der Szene verwendet.
//--------------------------------------------------------------------------------------
int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow )
{
   
    UNREFERENCED_PARAMETER( hPrevInstance );
    UNREFERENCED_PARAMETER( lpCmdLine );
 
    if( FAILED( FensterInit( hInstance, nCmdShow ) ) )
        return 0;
 
    if( FAILED( GeräteInit() ) )
    {
        MessageBox(0, L"Fehler!", L"Meine App", MB_OK);
        Gerätherunterfahren();
        return 0;
    }
 
    // Haupt Nachrichtenschleife
    MSG msg = {0};
    while( WM_QUIT != msg.message )
    {
        if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
        {
            TranslateMessage( &msg );
            DispatchMessage( &msg );
        }
        else
        {
       
            Rendern();
        }
    }
    //--------7------------------------------------------------------------------------------
    // Grafikkarte wird geleert und Heruntergefahren
    //--------------------------------------------------------------------------------------
    Gerätherunterfahren();
 
    return ( int )msg.wParam;
}
 
//-----4---------------------------------------------------------------------------------
// Wird jedes Mal aufgerufen, wenn die Anwendung eine Nachricht erhält
//--------------------------------------------------------------------------------------
LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
   
    PAINTSTRUCT ps;
    HDC hdc;
    switch( message )
    {
        case WM_PAINT:
            hdc = BeginPaint( hWnd, &ps );
 
           
           
            //Ausgabe von Text---------------------------
 
            SetTextColor(hdc, RGB(220, 100, 0));
            TextOut(hdc, 10, 10, TEXT("Hallo ihr futzies" ), 17);
                       
            //--------------------------------------------
            EndPaint( hWnd, &ps );
            break;
 
        case WM_DESTROY:
            PostQuitMessage( 0 );
            break;
 
        default:
            return DefWindowProc( hWnd, message, wParam, lParam );
    }
   
    return 0;
}
 
//-----3---------------------------------------------------------------------------------
// Register class and create window
//--------------------------------------------------------------------------------------
HRESULT FensterInit(HINSTANCE hInstance, int nCmdShow)
{
    // Register class
    WNDCLASSEX wcex;
    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc = WndProc;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = hInstance;
    wcex.hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MYICON));                                  //ICON im Fenster wenn ALT+TAB verwendet wird
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)CreateSolidBrush(RGB(255, 0, 0));
    wcex.lpszMenuName = MAKEINTRESOURCE(IDR_MYMENU);
    wcex.lpszClassName = L"TutorialWindowClass";
    wcex.hIconSm = (HICON)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MYICON), IMAGE_ICON, 16, 16, 0); //ICON links oben im Fenster
    if (!RegisterClassEx(&wcex))
        return E_FAIL;
 
    // Create window
    g_hInst = hInstance;
    RECT rc = { 0, 0, 640, 480 };
    AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, FALSE);
    g_hWnd = CreateWindow(L"TutorialWindowClass", L"Direct3D Version 11 Tutorial 1", WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, rc.right - rc.left, rc.bottom - rc.top, NULL, NULL, hInstance,
        NULL);
    if (!g_hWnd)
        return E_FAIL;
    //Fenster wird angezeigt
    ShowWindow(g_hWnd, nCmdShow);
 
    return S_OK;
}
 
//-------5-------------------------------------------------------------------------------
// Create Direct3D device and swap chain
//--------------------------------------------------------------------------------------
HRESULT GeräteInit()
{
    HRESULT hr = S_OK;
    RECT rc;                                            //Die RECT-Struktur definiert die Koordinaten der oberen linken und unteren rechten Ecke eines Rechtecks.
    GetClientRect( g_hWnd, &rc );
    UINT width = rc.right - rc.left;
    UINT height = rc.bottom - rc.top;
 
    UINT createDeviceFlags = 0;
#ifdef _DEBUG
    createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG;
#endif
 
    D3D_DRIVER_TYPE driverTypes[] =
    {
        D3D_DRIVER_TYPE_HARDWARE,
        D3D_DRIVER_TYPE_WARP,
        D3D_DRIVER_TYPE_REFERENCE,
    };
    UINT numDriverTypes = ARRAYSIZE( driverTypes );
 
    D3D_FEATURE_LEVEL featureLevels[] =
    {
        D3D_FEATURE_LEVEL_11_0,
        D3D_FEATURE_LEVEL_10_1,
        D3D_FEATURE_LEVEL_10_0,
    };
    UINT numFeatureLevels = ARRAYSIZE( featureLevels );
   
    DXGI_SWAP_CHAIN_DESC sd;
    ZeroMemory( &sd, sizeof( sd ) );
    sd.BufferCount = 1;
    sd.BufferDesc.Width = width;
    sd.BufferDesc.Height = height;
    sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    sd.BufferDesc.RefreshRate.Numerator = 60;
    sd.BufferDesc.RefreshRate.Denominator = 1;
    sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
    sd.OutputWindow = g_hWnd;
    sd.SampleDesc.Count = 1;
    sd.SampleDesc.Quality = 0;
    sd.Windowed = TRUE;
 
    for( UINT driverTypeIndex = 0; driverTypeIndex < numDriverTypes; driverTypeIndex++ )
    {
        g_driverType = driverTypes[driverTypeIndex];
        hr = D3D11CreateDeviceAndSwapChain(NULL, g_driverType, NULL, createDeviceFlags, featureLevels, numFeatureLevels,
                                            D3D11_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice, &g_featureLevel, &g_pImmediateContext );
        if( SUCCEEDED( hr ) )
            break;
    }
    if( FAILED( hr ) )
        return hr;
 
    // Create a render target view
    ID3D11Texture2D* pBackBuffer = NULL;
    hr = g_pSwapChain->GetBuffer( 0, __uuidof( ID3D11Texture2D ), ( LPVOID* )&pBackBuffer );
    if( FAILED( hr ) )
        return hr;
 
    hr = g_pd3dDevice->CreateRenderTargetView( pBackBuffer, NULL, &g_pRenderTargetView );
    (*pBackBuffer).Release();
    if( FAILED( hr ) )
        return hr;
 
    (*g_pImmediateContext).OMSetRenderTargets( 1, &g_pRenderTargetView, NULL );
 
    // Einrichten der Kamera
    D3D11_VIEWPORT vp;
    vp.Width = (FLOAT)width;
    vp.Height = (FLOAT)height;
    vp.MinDepth = 0.0f;
    vp.MaxDepth = 1.0f;
    vp.TopLeftX = 0;
    vp.TopLeftY = 0;
    g_pImmediateContext->RSSetViewports( 1, &vp );
   
    return S_OK;
}
C++ Forum :: C++ (alle ISO-Standards) ::  Versuche Directx Programmcode zu Optimieren (c++)  
Gehen Sie zu Seite 1, 2  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.net ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.