Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Проблема с рисованием спрайтов


Автор: TheSpecialOne 5.7.2012, 17:55
Здравствуйте уважаемые программисты! Вот уже который день не могу понять в чем проблема.
Вот функция, которая создает спрайт с нужными характеристиками.
Код

//--------------------------------------------------------------------------------------
//  Функция
//  DrawSprite()
//  Выводит спрайт на экран
VOID DrawSprite(LPDIRECT3DTEXTURE9 textura, float X, float Y, float ugol)
{
    sprite->Begin(D3DXSPRITE_ALPHABLEND);
    float scX = 0.5f;//Длина спрайта к1
    float scY = 0.5f;//Ширина спрайта к1
    // Texture being used is 64 by 64:
    float cenX = 16;
    float cenY = 16;
    D3DXVECTOR2 spriteCentre=D3DXVECTOR2(cenX * scX, cenY * scY);

    // Screen position of the sprite
    D3DXVECTOR2 trans=D3DXVECTOR2(X - spriteCentre.x,Y - spriteCentre.y);

    // Rotate based on the time passed
    float rotation=ugol*D3DX_PI/180.0f;

    // Build our matrix to rotate, scale and position our sprite
    D3DXMATRIX mat;

    D3DXVECTOR2 scaling(scX,scY);

    // out, scaling centre, scaling rotation, scaling, rotation centre, rotation, translation
    D3DXMatrixTransformation2D(&mat,NULL,0.0,&scaling,&spriteCentre,rotation,&trans);

    // Tell the sprite about the matrix
    sprite->SetTransform(&mat);

    // Draw the sprite 
    sprite->Draw(textura,NULL,NULL,NULL,0xFFFFFFFF);

    // Thats it
    sprite->End();

}

Потом вывожу определенное количество спрайтов на экран и засекаю время.
Код

//-----------------------------------------------------------------------------------
//  Функция
//  RenderingDirect3D()
//  Рисуем в приложении
//-----------------------------------------------------------------------------------
VOID RenderingDirect3D()
{
    
    if(pDirect3DDevice == NULL)     // Проверяем ошибки
     return;
    //Очищаем задний буфер
    pDirect3DDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0 );//цвет фона
    
    // Здесь происходит прорисовка сцены
    pDirect3DDevice->BeginScene();// Начало сцены
    //-----------------------------------------------------------------------------------------------
    // Вывод спрайта на экран
    //-----------------------------------------------------------------------------------------------
    start_2 = GetCycleCount();//Засекаем время
    
    for(int i=1; i<=8; i++)
    { 
        
        for(int j=1; j<=6; j++)
        {
            DrawSprite(pTex_k1, 100 + (i*15), 100 + (j*15), ug2);
        }
        
    }
    
    raznost = GetCycleCount() - start_2;//Количество тактов
    microSec = (double)raznost/2310; //Время в микросекундах
    
    pDirect3DDevice->EndScene();//Конец сцены       
    
    pDirect3DDevice->Present( NULL, NULL, NULL, NULL );//Копируем задний буфер в передний
     
}


Вывод 1 спрайта занимает 30 мкс.
Вывод 10 спрайтов занимает 70 мкс.
Вывод 48 спрайтов занимает 220 мкс.
Вывод 49 спрайтов занимает 2500 мкс. (Почему?)
Вывод 200 спрайтов занимает 7000 мкс.

Вот никак понять не могу, почему когда рисуется 49 спрайт время выполнения кода возрастает более чем в 10 раз?

Автор: BorisVorontsov 6.7.2012, 12:20
А какого разрешения текстуры и какой объем видеопамяти на видеокарте? Возможно, просто заканчивается доступная "быстрая" видеопамять

Автор: TheSpecialOne 6.7.2012, 13:43
Видеокарта 256 МБ, текстура 32 на 32 пикселя. Ничего понять не могу, именно 49-й спрайт рисуется 2000 мкс, а 50-й - 20 мкс. Думал, может, таймер неправильно показывает, но проверил, точность таймера +-0.1мкс, а может даже и лучше.  Пробовал другим таймером мерять - тот же результат. Пробовал рисовать спрайты 64 на 64, тот же результат.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)