Воскресенье, 03 Июля 2022, 08:58

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » Delphi/Pascal/Object Pascal » Замедление вывода каждой следующей буквы в моей программе (Программа написана на SDL + SDL_ttf + OpenGL)
Замедление вывода каждой следующей буквы в моей программе
cannДата: Суббота, 20 Февраля 2016, 08:50 | Сообщение # 1
частый гость
Сейчас нет на сайте
Я написал простую программу, которая выводит строки по буквам. Для написания программы использовал библиотеки SDL + SDL_ttf + OpenGL. Проблема в том, что при выводе каждой последующей буквы наблюдается замедление, т.е. следующая за очередной буквой отображается визуально медленнее, чем предыдущая. Замедления вывода букв, в коде программы, я нигде не прописывал. Я тестировал программу на домашнем ноутбуке, все работает нормально, а на рабочем компьютере проявляется такой визуальный эффект. Из-за чего так может происходить?

Код программы:

Код

program sdl_p4;

{$mode objfpc}{$H+}

uses sdl, sdl_ttf, gl, glu;

var
  screen :pSDL_SURFACE;
  loopstop: boolean = FALSE;
  event: pSDL_EVENT;

  font : pointer;
  sFont: pSDL_SURFACE;
  color: pSDL_COLOR;

  text: array[0..3] of String = ('aaaaaaaaaaaa',
                    'bbbbbbbbbbbb',
                    'cccccccccccc',
                    'dddddddddddd');
  b: integer;
  cur: integer;
  all: String;
  i,i1: Integer;

procedure addchar;
begin
  if cur = 4 then Exit;
  if length(all)=length(text[cur]) then
  begin
       //writeln(length(all));
       //writeln(length(text[cur]));
       inc(cur);
       all:='';
       Exit;
  end;

  if cur<4 then
  begin
    all := all + text[cur][length(all)+1];
    //writeln(all);
  end;
end;

procedure RenderText(const message : PChar; r : GLubyte; g : GLubyte; b : GLubyte; x : Integer; y : Integer; size : Integer);
var
  texture: GLuint;
begin
    glGenTextures(1, @texture);
    glBindTexture(GL_TEXTURE_2D, texture);

    font := TTF_OpenFont('cour.ttf', size);

    new(color);

    color^.r:=r;
    color^.g:=g;
    color^.b:=b;

    sFont := TTF_RenderText_Blended(font, message, color^);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, sFont^.w, sFont^.h, 0, GL_RGBA, GL_UNSIGNED_BYTE, sFont^.pixels);

    glBegin(GL_QUADS);
     glTexCoord2f(0,1-0); glVertex2f(x, y);
     glTexCoord2f(1,1-0); glVertex2f(x + sFont^.w, y);
     glTexCoord2f(1,1-1); glVertex2f(x + sFont^.w, y + sFont^.h);
     glTexCoord2f(0,1-1); glVertex2f(x, y + sFont^.h);
    glEnd();

    glDeleteTextures(1, @texture);
    Dispose(color);

    TTF_CloseFont(font);
    SDL_FreeSurface(sFont);
end;

procedure DrawGLScene();
  var
    i: integer;
  begin

    glClear(GL_COLOR_BUFFER_BIT);

    glDisable(GL_DEPTH_TEST);
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    inc(B);
    if b=20 then addchar;
    if b>20 then b:=0;

    //addchar;

    for i := 0 to cur - 1 do
    begin
         if cur = 4 then Exit;
         RenderText(PChar(text[i]), 255, 255, 255, 0, 448 - i*32, 32);
    end;

    if Length(all) <> 0 then RenderText(PChar(all), 255, 255, 255, 0, 448 - cur*32, 32);

    glDisable(GL_BLEND);
    glDisable(GL_TEXTURE_2D);
    glEnable(GL_DEPTH_TEST);
  end;
var
   m_Width, m_height: Integer;
   frame_rate: Integer = 30;
   frame_ms: Integer;
   start_ms: Integer;
   end_ms: Integer;
   delay_ms: Integer;

begin
     SDL_Init(SDL_INIT_VIDEO);

     screen := SDL_SetVideoMode(640, 480, 0, SDL_OPENGL);
     if screen = NIL then Halt;

     if Ttf_Init = -1 then Halt;

    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    glLoadIdentity();

    m_Width := screen^.w;
    m_Height := screen^.h;

    gluOrtho2D(0, m_Width, 0, m_Height);
    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    glLoadIdentity();

     b:=0;
     cur:=0;
     all:='';

     new(event);

     frame_ms := 1000 div frame_rate;

     while loopstop = FALSE do
     begin

          if SDL_PollEvent(event) = 1 then
          begin
               case event^.type_ of
                    SDL_KEYDOWN:
                    begin
                         if event^.key.keysym.sym = 27 then loopstop := TRUE;
                    end;
                    SDL_QUITEV:
                    begin
                         loopstop := TRUE;
                    end;
               end;
          end;
          start_ms := sdl_getticks();
          DrawGLScene;
          end_ms := sdl_getticks();

          delay_ms := (end_ms - start_ms);

          writeln(delay_ms);

          SDL_GL_SWAPBUFFERS;

     end;

     Dispose(event);
     SDL_FreeSurface(screen);
     TTF_QUIT;
     SDL_QUIT;
end.
OrdanДата: Суббота, 20 Февраля 2016, 09:06 | Сообщение # 2
Главный зомби
Сейчас нет на сайте
cann, работает медленней потому что каждая буква увеличивает строку и чем больше строка тем сильнее оно тупит. Может дело в библиотеках, потому что я вывожу огромные тексты через опенГЛ и никаких тупняков.

Цитата недели: Из-за леса, из-за гор, кишки, месиво, хардкор. (Берсерк ТВ-2)

Мои проекты ТЫК
Мои видяхи на ютубэ ТЫК

Если ты споришь с идиотом, вероятно тоже самое делает и он.
OpenGOOДата: Суббота, 20 Февраля 2016, 10:24 | Сообщение # 3
почти ветеран
Сейчас нет на сайте
Созданные шрифты и текстуры используй повторно. Насчет Blended режима. Как написано в документации это Slow Slow Slow, but Ultra Nice over another image, т.е. ну очень медленно работает. Тебе нужен Solid режим, если текст так часто обновляется.

Мои проекты:
- Свободный и открытый клон World Of Goo
- TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)

[GameMaker: Studio v1.4.9999]
cannДата: Суббота, 20 Февраля 2016, 11:24 | Сообщение # 4
частый гость
Сейчас нет на сайте
Спасибо за ответы.

Сейчас попробовал собрать мою программу на втором рабочем компьютере и вместо выводимых букв получаю белые квадраты. Бред какой-то, на первом компьютере буквы выводятся с замедлением каждой последующей, на втором компьютере вместо вывода букв выводит мне белые квадраты, при этом скорость вывода у всех квадратов одинаковая. На домашнем ноутбуке буквы отображаются нормально и без замедления. Может я не правильно использую OpenGL функции при создание текстур и вывода текстуры на экран? Может использую какой-то не универсальный способ, который мог бы работать на всех компьютерах одинаково?
OrdanДата: Суббота, 20 Февраля 2016, 11:41 | Сообщение # 5
Главный зомби
Сейчас нет на сайте
cann, видимо ты делаешь такой жесткачь что видюха не тянет. Обычно белые квадраты когда видеокарта не смогла прогрузить текстуру ну или у тебя древняя видюха и она не поддерживает твою версию опенГЛ.

Цитата недели: Из-за леса, из-за гор, кишки, месиво, хардкор. (Берсерк ТВ-2)

Мои проекты ТЫК
Мои видяхи на ютубэ ТЫК

Если ты споришь с идиотом, вероятно тоже самое делает и он.
cannДата: Суббота, 20 Февраля 2016, 11:59 | Сообщение # 6
частый гость
Сейчас нет на сайте
Цитата Ordan ()
видимо ты делаешь такой жесткачь что видюха не тянет. Обычно белые квадраты когда видеокарта не смогла прогрузить текстуру ну или у тебя древняя видюха и она не поддерживает твою версию опенГЛ.


Ну на первом компьютере установлена Nvidia Geforce FX5500 128mb - На ней буквы тормозят.
На втором компьютере Nvidia Geforce2 MX400 64mb - На ней квадраты, вместо букв.
Ноутбук Nvidia Geforce G105M 512Mb - на ней все нормально работает.

А как узнать мою версию OpenGL можно? На каждом компьютере она разная, я так понимаю. Но функции OpenGL, которые использует моя программа, одни из самых простых и я думаю все эти видеокарты должны с ними работать.
OrdanДата: Суббота, 20 Февраля 2016, 12:37 | Сообщение # 7
Главный зомби
Сейчас нет на сайте
Цитата cann ()
На втором компьютере Nvidia Geforce2 MX400 64mb - На ней квадраты, вместо букв.

Не думал что такие компьютеры еще существуют. На нем будут белые квадраты, что бы их небыло уменьши размер текстуры.


Цитата недели: Из-за леса, из-за гор, кишки, месиво, хардкор. (Берсерк ТВ-2)

Мои проекты ТЫК
Мои видяхи на ютубэ ТЫК

Если ты споришь с идиотом, вероятно тоже самое делает и он.
cannДата: Суббота, 20 Февраля 2016, 15:04 | Сообщение # 8
частый гость
Сейчас нет на сайте
Цитата Ordan ()

Не думал что такие компьютеры еще существуют.


Да, есть несколько.

Цитата Ordan ()
На нем будут белые квадраты, что бы их небыло уменьши размер текстуры.


Уменьшение размера текстур ничего не дало. Теперь и на первом компьютере с FX5500 буквы не отображаются, а отображаются размытые текстуры в виде каких-то цветных пиксельных шумов. На ноутбуке пока все работает. Думаю, я где-то напортачил с OpenGL кодом. Буду искать корень проблемы. Спасибо всем кто отвечал.
OrdanДата: Суббота, 20 Февраля 2016, 15:07 | Сообщение # 9
Главный зомби
Сейчас нет на сайте
cann, ну значит видюха не поддерживает твою версию опенГЛ, либо недостаточно сильно уменьшил текстуру.

Цитата недели: Из-за леса, из-за гор, кишки, месиво, хардкор. (Берсерк ТВ-2)

Мои проекты ТЫК
Мои видяхи на ютубэ ТЫК

Если ты споришь с идиотом, вероятно тоже самое делает и он.
cannДата: Суббота, 20 Февраля 2016, 15:18 | Сообщение # 10
частый гость
Сейчас нет на сайте
Цитата Ordan ()
недостаточно сильно уменьшил текстуру


Если я правильно понимаю, то размер текстуры задается этой OpenGL функцией

Код
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, sFont^.w, sFont^.h, 0, GL_RGBA, GL_UNSIGNED_BYTE, sFont^.pixels);


нормальный размер букв, который видны в окне программы это значение 32, как и у меня в программе и установлено было. Я пробовал устанавливать значения и в 16, в 8, в 4, но у меня только уменьшались размеры белых квадратов. При размерах 16, 8, 4 квадраты становятся очень маленькими и их плохо видно в окне программы.
OrdanДата: Суббота, 20 Февраля 2016, 15:35 | Сообщение # 11
Главный зомби
Сейчас нет на сайте
cann, нет, размер текстурки это размер самой картинки которую ты загружаешь в память.

Цитата недели: Из-за леса, из-за гор, кишки, месиво, хардкор. (Берсерк ТВ-2)

Мои проекты ТЫК
Мои видяхи на ютубэ ТЫК

Если ты споришь с идиотом, вероятно тоже самое делает и он.
cannДата: Суббота, 20 Февраля 2016, 16:12 | Сообщение # 12
частый гость
Сейчас нет на сайте
Цитата Ordan ()
нет, размер текстурки это размер самой картинки которую ты загружаешь в память.


Тогда можешь подсказать как задать размер текстуры? Приведи пример кода на OpenGL, пожалуйста.
OrdanДата: Суббота, 20 Февраля 2016, 16:14 | Сообщение # 13
Главный зомби
Сейчас нет на сайте
cann, берешь текстуру, отрываешь её в фотошопе или ином граф редакторе и уменьшаешь в 2 раза)

Цитата недели: Из-за леса, из-за гор, кишки, месиво, хардкор. (Берсерк ТВ-2)

Мои проекты ТЫК
Мои видяхи на ютубэ ТЫК

Если ты споришь с идиотом, вероятно тоже самое делает и он.
cannДата: Суббота, 20 Февраля 2016, 16:24 | Сообщение # 14
частый гость
Сейчас нет на сайте
Цитата Ordan ()
cann, берешь текстуру, отрываешь её в фотошопе или ином граф редакторе и уменьшаешь в 2 раза)


Понял, спасибо за ответ.
Форум игроделов » Программирование » Delphi/Pascal/Object Pascal » Замедление вывода каждой следующей буквы в моей программе (Программа написана на SDL + SDL_ttf + OpenGL)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2022 Рейтинг