Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с рисованием спрайтов 
:(
    Опции темы
TheSpecialOne
Дата 5.7.2012, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

//--------------------------------------------------------------------------------------
//  Функция
//  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 раз?
PM MAIL   Вверх
BorisVorontsov
Дата 6.7.2012, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinker
**


Профиль
Группа: Комодератор
Сообщений: 714
Регистрация: 3.11.2005
Где: Молдавия, г. Киши нёв

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



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


--------------------
[code=cpp]
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;
[/code]
PM MAIL ICQ GTalk   Вверх
TheSpecialOne
Дата 6.7.2012, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Видеокарта 256 МБ, текстура 32 на 32 пикселя. Ничего понять не могу, именно 49-й спрайт рисуется 2000 мкс, а 50-й - 20 мкс. Думал, может, таймер неправильно показывает, но проверил, точность таймера +-0.1мкс, а может даже и лучше.  Пробовал другим таймером мерять - тот же результат. Пробовал рисовать спрайты 64 на 64, тот же результат.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

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


 




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


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

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