Замедление вывода каждой следующей буквы в моей программе
| |
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 раза)
Понял, спасибо за ответ.
|
|
| |
|