Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Direct3D в диалоге, зависание диалога 
V
    Опции темы
xvr
Дата 17.12.2009, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата

Вы имели ввиду чтото на подобии этого?
Да, именно это
Цитата

Блин чтото не так опять,
Но только этого ОДНОГО недостаточно. Этот кусок кода позволяет работать обычной оконной системе Windows, в частности позволяет реагировать на нажатия кнопок (и мыши). Но эти нажатия тоже надо обрабатывать, и при этом не забыть, что вы находитесь НЕ в основном цикле обработки сообщений, а внутри цикла показа DirectX, и из него сначала нужно выйти. А для этого надо понять, что пора выходить  smile 

PM MAIL   Вверх
toxx
Дата 17.12.2009, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 653
Регистрация: 4.3.2009
Где: НН

Репутация: нет
Всего: 13



Цитата(xvr @ 17.12.2009,  22:20)
Цитата

Вы имели ввиду чтото на подобии этого?
Да, именно это
Цитата

Блин чтото не так опять,
Но только этого ОДНОГО недостаточно. Этот кусок кода позволяет работать обычной оконной системе Windows, в частности позволяет реагировать на нажатия кнопок (и мыши). Но эти нажатия тоже надо обрабатывать, и при этом не забыть, что вы находитесь НЕ в основном цикле обработки сообщений, а внутри цикла показа DirectX, и из него сначала нужно выйти. А для этого надо понять, что пора выходить  smile

АААААА сделал чето
Код

HWND hStream;
    while(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
    {
      if (!IsDialogMessage(hwndDlg, &msg))
          while(msg.message!=WM_QUIT) 
            {
                hStream=GetDlgItem(hwndDlg,ID_CDRAW);
                InitialDirect3D(hStream);
                InitialBufferVershin();
                ShowWindow(hStream, SW_SHOWDEFAULT);
                //UpdateWindow(hStream);
                if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
                {
                     TranslateMessage(&msg);
                     DispatchMessage(&msg);
                }else RenderingDirect3D();
            }
      else{ TranslateMessage(&msg);
      DispatchMessage(&msg);}
    }


Это чето ест 1гб оперативной памяти и причем её потребление растет с каждой секундой...что делать не понятно...
Хотя работает как надо smile 
PM MAIL   Вверх
TGrey
Дата 17.12.2009, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 1.12.2007

Репутация: 1
Всего: 1



А ему обязательно инициализировать буферы в цикле? Возможно оно и есть память? Один раз инициализировать перед циклом, а потом выводить.
PM MAIL   Вверх
toxx
Дата 17.12.2009, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 653
Регистрация: 4.3.2009
Где: НН

Репутация: нет
Всего: 13



Цитата(TGrey @ 17.12.2009,  23:38)
А ему обязательно инициализировать буферы в цикле? Возможно оно и есть память? Один раз инициализировать перед циклом, а потом выводить.

Да это и есть весь этот 1 гб)
Только если это всё убирать из цикла, то ничего не работает(хотя программа в любом случае не работает).
Я уже разные комбинации перепробовал все впустую smile 
Короче я уже не знаю чего делать с этой проблемой, сижу с 5 часов в компиляторе уже,не в радость это всё ужеsmile  + за день нифига не сделалsmile 

Это сообщение отредактировал(а) toxx - 17.12.2009, 23:49
PM MAIL   Вверх
xvr
Дата 18.12.2009, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Попробуй так:
Код

OOL CALLBACK AboutDlgProc(HWND hDlg, UINT iMsg,
                           WPARAM wParam, LPARAM lParam)
{
 static int do_exit=0;

    switch(iMsg)
    {    
        case WM_KEYDOWN:
            {
                if(wParam==VK_ESCAPE)
                {do_exit=1; PostQuitMessage(0);}
            }
        case WM_INITDIALOG :
            {
                return FALSE;
            }
        case WM_COMMAND :
            switch(LOWORD(wParam))
            {
            case ID_DRAW:
                {
                    InitialDirect3D(hDlg);
                    InitialBufferVershin();
                    ShowWindow(hDlg, SW_SHOWDEFAULT);
                    UpdateWindow(hDlg);
                    while(!do_exit)
                    {
                      while(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
                      {
                       if (!IsDialogMessage(hwndDlg, &msg)
                        {
                         TranslateMessage(&msg);
                         DispatchMessage(&msg);
                        }
                      }
                      RenderingDirect3D();
                    }
                    return 0;
                }
                case IDOK :
                case IDCANCEL :
                    do_exit=1;
                    EndDialog(hDlg, 0);
                return TRUE;
            }
            break;
    }
return FALSE;
}



Это сообщение отредактировал(а) xvr - 18.12.2009, 17:34
PM MAIL   Вверх
toxx
Дата 18.12.2009, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 653
Регистрация: 4.3.2009
Где: НН

Репутация: нет
Всего: 13



Цитата

Попробуй так

Щас возможности откомпилировать нет, но думаю не прокатит т.к.
в диалоге iMsg//UINT
а получается обрабатывает сообщения msg//MSG
Мб я не прав, приду сделаю=)
PM MAIL   Вверх
xvr
Дата 18.12.2009, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(toxx @ 18.12.2009,  11:29)
Щас возможности откомпилировать нет, но думаю не прокатит т.к.
в диалоге iMsg//UINT
а получается обрабатывает сообщения msg//MSG

Прокатит - IsDialogMessage и DispatchMessage преобразую что надо куда надо

PM MAIL   Вверх
toxx
Дата 18.12.2009, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 653
Регистрация: 4.3.2009
Где: НН

Репутация: нет
Всего: 13



Цитата(xvr @ 18.12.2009,  17:35)
Цитата(toxx @ 18.12.2009,  11:29)
Щас возможности откомпилировать нет, но думаю не прокатит т.к.
в диалоге iMsg//UINT
а получается обрабатывает сообщения msg//MSG

Прокатит - IsDialogMessage и DispatchMessage преобразую что надо куда надо

Хммм спасибо большое, на деле всё просто.
Только меня ввело в заблуждение то, что я думал что 

Код

MSG msg; 


Действует только в WinMain, вот в этом и все проблемы.
Спасибо еще раз, надолкнули на правильный путь.


Блин а память все так и жрёт....1гб стабильно(
Это ###
Код

BOOL CALLBACK AboutDlgProc(HWND hDlg, UINT iMsg,
                           WPARAM wParam, LPARAM lParam)
{
    HWND hStream;
    MSG msg;
    static int do_exit=0;
    switch(iMsg)
    {
        case WM_DESTROY:
            {
                DeleteDirect3D();
                PostQuitMessage(0);
                return 0;
            }
         case WM_KEYDOWN:
            {
                if(wParam==VK_ESCAPE)
                {
                    do_exit=1; 
                    PostQuitMessage(0);
                    DeleteDirect3D();
                }
                return 0;
            }
        case WM_INITDIALOG :
            {
                return 0;
            }
         case WM_COMMAND :
         { 
             switch(LOWORD(wParam))
             {
                case ID_DRAW:
                {
                    hStream=GetDlgItem(hDlg,ID_CDRAW);
                    InitialDirect3D(hStream);
                    InitialBufferVershin();
                    ShowWindow(hStream, SW_SHOWDEFAULT);
                    UpdateWindow(hStream);
                    while(!do_exit)
                    {
                      while(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
                      {
                       if (!IsDialogMessage(hStream, &msg))
                        {
                         TranslateMessage(&msg);
                         DispatchMessage(&msg);
                        }
                      }
                      RenderingDirect3D();
                    }
                    return 0;
                }
                case IDOK :
                case IDCANCEL :
                {
                    DeleteDirect3D();
                    do_exit=1;
                    EndDialog(hDlg, 0);
                    return 0;
                }
                //return TRUE;
            }
         }
    }
return FALSE;
}


В свете этого поедания памяти проверил и пример c DX там тоже жрёт память пока работает 1гб++ и увеличивается,
что за фигня не понятно, неужели кто писал книгу совсем?)Или я где тупанул...

Это сообщение отредактировал(а) toxx - 18.12.2009, 18:56
PM MAIL   Вверх
toxx
Дата 18.12.2009, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 653
Регистрация: 4.3.2009
Где: НН

Репутация: нет
Всего: 13



На всякий случай проверил код функций, всё как в книге(
PM MAIL   Вверх
xvr
Дата 18.12.2009, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(toxx @ 18.12.2009,  18:08)
Блин а память все так и жрёт....1гб стабильно(

Видимо проблема в RenderingDirect3D. Можно на ее код глянуть?

PM MAIL   Вверх
toxx
Дата 18.12.2009, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 653
Регистрация: 4.3.2009
Где: НН

Репутация: нет
Всего: 13



Цитата(xvr @ 18.12.2009,  19:42)
Цитата(toxx @ 18.12.2009,  18:08)
Блин а память все так и жрёт....1гб стабильно(

Видимо проблема в RenderingDirect3D. Можно на ее код глянуть?

Да конечно, я сам сижу её проверяю, пока ничего криминального и паралельно сравниваю с туториалами и ищу ошибки.
Код

VOID RenderingDirect3D()
{
    if(pDirect3DDevice==NULL)
        return;
    pDirect3DDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,
                            D3DCOLOR_XRGB(60,100,150),1.0f,0);
    pDirect3DDevice->BeginScene();
    /////
    LightMaterial();
    Matrix();
    pDirect3DDevice->SetStreamSource(0,pBufferVershin,0,
                        sizeof(CUSTOMVERTEX));
    pDirect3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
    //pDirect3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,2);
    pDirect3DDevice->SetIndices(pBufferIndex);
    pDirect3DDevice->SetTexture(0,pTextura001);
    pDirect3DDevice->SetTextureStageState(0,D3DTSS_COLORARG1,
                                            D3DTA_TEXTURE);
    pDirect3DDevice->SetTextureStageState(0,D3DTSS_COLOROP,
                                            D3DTOP_MODULATE);
    pDirect3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,
                                    0,0,36,0,12);
    DrawMyText(pDirect3DDevice,hFont,"Calculator",
                       10,10,500,700,D3DCOLOR_ARGB(250,250,250,50));
    /////
    pDirect3DDevice->EndScene();
    pDirect3DDevice->Present(NULL,NULL,NULL,NULL);
}

PM MAIL   Вверх
xvr
Дата 18.12.2009, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Тоже ничего криминального не вижу. А как насчет функций LightMaterial, Matrix и DrawMyText?

PM MAIL   Вверх
toxx
Дата 18.12.2009, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 653
Регистрация: 4.3.2009
Где: НН

Репутация: нет
Всего: 13



Цитата(xvr @ 18.12.2009,  19:57)
Тоже ничего криминального не вижу. А как насчет функций LightMaterial, Matrix и DrawMyText?

Тоже смотрю... ничего тоже пока не нашел.
Вот они
Код

VOID LightMaterial()
{
    D3DMATERIAL9 Material;
    D3DLIGHT9 Light;
    ZeroMemory(&Material,sizeof(D3DMATERIAL9));
    Material.Diffuse.r=Material.Ambient.r=1.0f;
    Material.Diffuse.g=Material.Ambient.g=1.0f;
    Material.Diffuse.b=Material.Ambient.b=1.0f;
    Material.Diffuse.a=Material.Ambient.a=1.0f;
    pDirect3DDevice->SetMaterial(&Material);
    D3DXVECTOR3 VectorDir;
    ZeroMemory(&Light,sizeof(D3DLIGHT9));
    Light.Type=D3DLIGHT_DIRECTIONAL;
    Light.Diffuse.r=1.0f;
    Light.Diffuse.g=1.0f;
    Light.Diffuse.b=1.0f;
    Light.Range=1000.0f;
    VectorDir=D3DXVECTOR3(0.0f,0.0f,1.0f);
    D3DXVec3Normalize((D3DXVECTOR3*)&Light.Direction,&VectorDir);
    pDirect3DDevice->SetLight(0,&Light);
    pDirect3DDevice->LightEnable(0,TRUE);
    pDirect3DDevice->SetRenderState(D3DRS_LIGHTING,TRUE);
    pDirect3DDevice->SetRenderState(D3DRS_AMBIENT,0);
}
VOID DrawMyText(LPDIRECT3DDEVICE9 pDirect3DDevice,
                HFONT hFont,char* StrokaTexta,
                int x,int y,int x1,int y1,
                D3DCOLOR MyColor)
{
    hFont=CreateFont(30,10,0,0,FW_NORMAL,FALSE,FALSE,0,1,
        0,0,0,DEFAULT_PITCH|FF_MODERN,"Arial");
    Rec.left=x;
    Rec.top=y;
    Rec.right=x1;
    Rec.bottom=y1;
    D3DXCreateFont(pDirect3DDevice, 30,10, 1, 0, FALSE, 0,30,0,0, "Arial", &pFont);
    pFont->DrawText(0, StrokaTexta, -1, &Rec, DT_WORDBREAK, MyColor);
}
VOID Matrix()
{
    D3DXMATRIX MatrixWorld,MatrixWorldX,MatrixWorldY,MatrixWorldZ;
    D3DXMATRIX MatrixView;
    D3DXMATRIX MatrixProjection;

    UINT Time=timeGetTime()%5000;
    FLOAT Angle=Time*(2.0f*D3DX_PI)/5000.0f;
    D3DXMatrixRotationY(&MatrixWorldY,Angle);
    D3DXMatrixRotationZ(&MatrixWorldZ,Angle);
    D3DXMatrixMultiply(&MatrixWorld,&MatrixWorldZ,&MatrixWorldY);
    pDirect3DDevice->SetTransform(D3DTS_WORLD,&MatrixWorld);
    D3DXMatrixLookAtLH(&MatrixView,&D3DXVECTOR3(0.0f,0.0f,-8.0f),
                        &D3DXVECTOR3(0.0f,0.0f,0.0f),
                        &D3DXVECTOR3(0.0f,1.0f,0.0f));
    pDirect3DDevice->SetTransform(D3DTS_VIEW,&MatrixView);

    D3DXMatrixPerspectiveFovLH(&MatrixProjection,D3DX_PI/4,
                                1.0f,1.0f,100.0f);
    pDirect3DDevice->SetTransform(D3DTS_PROJECTION,&MatrixProjection);
}

PM MAIL   Вверх
xvr
Дата 19.12.2009, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Есть подозрение (все в функции DrawMyText)
1) Зачем там строка hFont=CreateFont(30,10,0,0,FW_NORMAL,FALSE,FALSE,0,1,0,0,0,DEFAULT_PITCH|FF_MODERN,"Arial");? hFont более нигде не используется (и не удаляется!)
2) D3D фонт, созданный через D3DXCreateFont не удаляется (надо позвать pFont->Release() перед выходом, или использовать smart указатель для pFont).
Кстати, создавать и удалять фонт на каждом кадре мне кажется несколько расточительным - почему бы его не создать в начале и не удалить в самом конце (один раз)?

И последнее - если не поможет рекомендую задать этот вопрос тут

PM MAIL   Вверх
toxx
Дата 19.12.2009, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 653
Регистрация: 4.3.2009
Где: НН

Репутация: нет
Всего: 13



Цитата(xvr @ 19.12.2009,  11:55)
Есть подозрение (все в функции DrawMyText)
1) Зачем там строка hFont=CreateFont(30,10,0,0,FW_NORMAL,FALSE,FALSE,0,1,0,0,0,DEFAULT_PITCH|FF_MODERN,"Arial");? hFont более нигде не используется (и не удаляется!)
2) D3D фонт, созданный через D3DXCreateFont не удаляется (надо позвать pFont->Release() перед выходом, или использовать smart указатель для pFont).
Кстати, создавать и удалять фонт на каждом кадре мне кажется несколько расточительным - почему бы его не создать в начале и не удалить в самом конце (один раз)?

И последнее - если не поможет рекомендую задать этот вопрос тут

Да я тоже сегодня методом исключения функций из цикла добился тогоже результата, что и вы посмотрев функции.
Вычислил что эта функция непомерно ест память...Только вот проблема, пример в книге был нерабочий.
D3DXCreateFont устарела(в книге где она использовалась принималось 3 параметра, а в версии DX9 SDK march 2009
она уже принимает 6 параметров, как ей пользоваться я так и не нашел в интернете...Но понял что DirectX развивается не по
дням , а по часам...))
Спасибо, что посмотрели код.Теперь я практически завершил свой калькулятор.Осталось текст добавить только в DX и будет готово.

Это сообщение отредактировал(а) toxx - 19.12.2009, 13:35
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0654 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.