реклама на сайте
подробности

 
 
> Програмирование графики, вопрос
whale_nik
сообщение Sep 1 2016, 14:49
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 364
Регистрация: 25-09-08
Пользователь №: 40 483



Народ, надо вывести двумерный массив данных 1000*800 в виде точек на image (прогаю в buildere)
причем надо его сдвигать на одну координату скоростью 0,1сек ( с вводом новых )
Если делать тупо в лоб то страшные тормоза, посоветуйте куда копать, явно есть методы быстрого вывода,
задача для меня вновье.
Те в итоге видим экран 1000*800, по нему ползет изображение, которое обновляется справа на одну линию все время.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
_pv
сообщение Sep 2 2016, 23:34
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



у openGL есть glDrawPixels.
инициализация через GLFW

а вот winAPI функции лучше запихать в... <Гусары, МОЛЧАТЬ!>
можно заодно с builder 6.0

Код
#include "GLFW/glfw3.h"
#include <stdio.h>
#include <windows.h>

unsigned char pic[1000*800*3];

int main(void){
    int t0 = GetTickCount();
    GLFWwindow* window;

    /* Initialize the library */
    if (!glfwInit()) return -1;

    /* Create a windowed mode window and its OpenGL context */
    window = glfwCreateWindow(1000, 800, "Hello World", NULL, NULL);
    if (!window) {
        glfwTerminate();
        return -1;
    }

    /* Make the window's context current */
    glfwMakeContextCurrent(window);
    /* Loop until the user closes the window */
    while (!glfwWindowShouldClose(window)){
        /* Render here */
        glClear(GL_COLOR_BUFFER_BIT);
        for (int i = 0; i < 1000*800*3; i++) pic[i] = rand();
        glDrawPixels(1000,800, GL_RGB, GL_UNSIGNED_BYTE, pic);
        /* Swap front and back buffers */
        glfwSwapBuffers(window);
        /* Poll for and process events */
        glfwPollEvents();
        printf("%d\n", GetTickCount()-t0);
        t0 = GetTickCount();
    }
    glfwTerminate();
    return 0;
}

Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 3 2016, 03:01
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(_pv @ Sep 3 2016, 05:34) *
у openGL есть glDrawPixels.
а вот winAPI функции лучше запихать в... <Гусары, МОЛЧАТЬ!>

И Ваш код будет таким-же тормознутым как и предыдущих дельфи-"специалистов". Главная ошибка: перерисовывать попиксельно каждый раз весь экран. Рисовать по пикселам нужно минимум - только обновлённую часть. Старую часть изображения просто копировать ...Blt-функциями.
Сомневаюсь, что у OpenGL будет выигрыш по сравнению с WinAPI-шными BitBlt/PatBlt/....
В своё время много времени потратил на оптимизацию подобной задачи: переделывал изначальный свой WinAPI-вариант (через BitBlt/PatBlt/...) на DirectDraw. Получил абсолютно то же самое время работы. Сделал вывод, что при возможности, WinAPI-шные BitBlt/PatBlt/... вызывают изнутри DirectX, поэтому и не видно разницы во времени работы. Думаю что с OpenGL будет то же самое.
Конечно в том, что ставить точки лучше не по одной, а пачкой - Вы правы. В WinAPI по-моему тоже есть подобная функция.

Цитата(whale_nik @ Sep 3 2016, 06:36) *
Если бы как то не заносить значения по новой а двигать область памяти этой матрицы, прибавляя справа по одному столбцу, там же все на указателях, нельзя так сделать ? Память как то закольцевать )

Я Вам это советовал ещё несколько сообщений назад. Но видно "чукча - не читатель..."
Go to the top of the page
 
+Quote Post
_pv
сообщение Sep 3 2016, 08:48
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



Цитата(jcxz @ Sep 3 2016, 09:01) *
И Ваш код будет таким-же тормознутым как и предыдущих дельфи-"специалистов".

не будет,
нынче скопировать пару МБайт из памяти в память это долго??? на моём довольно древнем компе, которому лет 10 уже, это занимает 1.5мс.
Код
LARGE_INTEGER t0,t1,f;
QueryPerformanceFrequency(&f);
QueryPerformanceCounter(&t0);
for (int j = 0; j < 800; j++) memcpy(&pic[j*3000],&pic[j*3000+3],3000-3);
QueryPerformanceCounter(&t1);
printf("%G\n", (double)(t1.QuadPart - t0.QuadPart)/  f.QuadPart);


да это криво и правильно было бы сделать два буфера размером с экран и заполнять их по очереди и отрисовывать со сдвигом.
для этого есть glRasterPos3f.
а совсем правильно сложить это сразу в память видеокарты, тогда и сдвиги и отрисовка процессор никак не нагрузят
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- whale_nik   Програмирование графики   Sep 1 2016, 14:49
- - _pv   быстрые методы это аппаратно через opengl. хотя да...   Sep 1 2016, 16:02
- - whale_nik   Не совсем понял а как это все вывести на форму ? Я...   Sep 1 2016, 16:13
|- - whale_nik   Типа такого надо ) Вся картинка должна ехать влево...   Sep 1 2016, 18:00
|- - jcxz   Цитата(whale_nik @ Sep 2 2016, 00:00) Тип...   Sep 2 2016, 04:35
- - AHTOXA   Цитата(whale_nik @ Sep 1 2016, 19:49) Есл...   Sep 2 2016, 06:38
|- - whale_nik   Сделал как советуете, все равно жесть как медленно...   Sep 2 2016, 21:26
|- - AHTOXA   Цитата(whale_nik @ Sep 3 2016, 02:26) Сде...   Sep 3 2016, 06:09
- - sigmaN   ЦитатаОткрываете MSDN на разделе Windows GDI...   Sep 2 2016, 22:16
|- - Onkel   Цитата(_pv @ Sep 3 2016, 11:48) а совсем ...   Sep 3 2016, 09:47
- - whale_nik   Мне кажется основные тормоза и загрузка это инициа...   Sep 3 2016, 00:36
- - k155la3   Курить в сторону направления, заданного jcxz Пер...   Sep 3 2016, 08:42
- - whale_nik   Я правильно понял, что если создать две одинаков...   Sep 3 2016, 09:38
|- - AHTOXA   Цитата(whale_nik @ Sep 3 2016, 14:38) со ...   Sep 3 2016, 10:10
||- - whale_nik   Цитата(AHTOXA @ Sep 3 2016, 14:10) Вы же ...   Sep 3 2016, 11:51
||- - k155la3   Цитата(whale_nik @ Sep 3 2016, 14:51) . ....   Sep 3 2016, 12:35
|||- - whale_nik   Без окон никак, увы. Вот вроде бы нагрузка неболь...   Sep 3 2016, 12:38
||- - AHTOXA   Цитата(whale_nik @ Sep 3 2016, 16:51) Чет...   Sep 3 2016, 13:16
||- - whale_nik   Цитата(AHTOXA @ Sep 3 2016, 17:16) 4,5 мс...   Sep 3 2016, 17:42
||- - whale_nik   Цитата(AHTOXA @ Sep 3 2016, 17:16) Вот ...   Sep 3 2016, 17:58
|- - _pv   Цитата(whale_nik @ Sep 3 2016, 16:38) Я п...   Sep 3 2016, 10:17
- - DASM   а почему побайтно работаете и не пословно?   Sep 3 2016, 12:43
|- - whale_nik   Цитата(DASM @ Sep 3 2016, 16:43) а почему...   Sep 3 2016, 12:44
- - amaora   В лоб будет больше 60 к/с, если оптимизировать как...   Sep 3 2016, 13:26
- - sigmaN   Ребят, я не понимаю зачем нам тут gl и уж тем боле...   Sep 3 2016, 17:46
- - sigmaN   Логичнее было бы в архив прилепить исходник, вмест...   Sep 3 2016, 18:31
|- - whale_nik   Цитата(sigmaN @ Sep 3 2016, 22:31) Логичн...   Sep 3 2016, 19:09
- - sigmaN   Проц не грузит(не более 1 - 2% показывает диспетче...   Sep 3 2016, 19:23
- - whale_nik   Да, наверняка дергается из за того что таймер нест...   Sep 3 2016, 20:29
- - sigmaN   а, ну если чисто для пробы то в цикле while(!A...   Sep 3 2016, 21:59
|- - whale_nik   Цитата(sigmaN @ Sep 4 2016, 01:59) а, ну ...   Sep 4 2016, 19:12
- - DASM   Таймер тут не причем, просто поток, ушедший в Slee...   Sep 3 2016, 22:42
- - sigmaN   Ну Sleep() это я предложил просто. Хотя вы правы, ...   Sep 3 2016, 23:24
- - DASM   Таймера в винде для такого иные, см. BOOL QueryPer...   Sep 3 2016, 23:43
|- - jcxz   Цитата(DASM @ Sep 4 2016, 05:43) Таймера ...   Sep 4 2016, 04:08
- - alexunder   Автор, а чего в сторону Direct2D не посмотрите? Дв...   Sep 4 2016, 09:43
|- - jcxz   Цитата(alexunder @ Sep 4 2016, 15:43) Авт...   Sep 4 2016, 13:51
- - sigmaN   Провел тут пару экспериментов со слипом... за осно...   Sep 4 2016, 10:23
- - sigmaN   Ну а мне было больше даже интересно Sleep() по тес...   Sep 4 2016, 18:14
|- - jcxz   Цитата(sigmaN @ Sep 5 2016, 00:14) Кто зн...   Sep 5 2016, 03:04
- - sigmaN   Странно.. при условии, что в цикле есть вызов Appl...   Sep 4 2016, 19:15
- - whale_nik   Удалил файл проекта так как вы уже свой написали...   Sep 4 2016, 19:32
- - sigmaN   Ну проц и должен грузиться сильно. В цикле же нет ...   Sep 4 2016, 20:42
- - whale_nik   Никаких изменений, просто таймер отключил и все в ...   Sep 4 2016, 21:37
- - sigmaN   Что-то мне подсказывает, что кадровая развертка ту...   Sep 5 2016, 08:14
- - whale_nik   Похоже если надо плавнее и быстрее уже придется в ...   Sep 5 2016, 10:14
- - sigmaN   Глянул пару исходничков тут.. В том числе Quake 3 ...   Sep 5 2016, 10:46
- - DASM   А чем вас DirectX кстати не устраивает? Ничего пла...   Sep 5 2016, 10:49
- - sigmaN   Ну не знаю, тут вопрос как-бы про принципиальную в...   Sep 5 2016, 10:56
- - whale_nik   Жалко что вы не в билдере пишете ) В принципе мне...   Sep 5 2016, 13:24
- - sigmaN   Адаптировать всё это для билдера пара пустяков. К...   Sep 5 2016, 17:42
|- - jcxz   Цитата(sigmaN @ Sep 5 2016, 23:42) Главны...   Sep 6 2016, 05:18
- - sigmaN   Ну или ладно, можно не изменяющуюся не копировать(...   Sep 6 2016, 08:40
|- - jcxz   Цитата(sigmaN @ Sep 6 2016, 14:40) но выв...   Sep 6 2016, 08:54
- - sigmaN   ЦитатаЗачем? Уж не знаю, эксперимент показал, что ...   Sep 6 2016, 09:12
- - whale_nik   Подскажите еще допустим есть переменная 0-256, как...   Sep 8 2016, 22:39
|- - alexr22b   Цитата(whale_nik @ Sep 9 2016, 02:39) Под...   Sep 9 2016, 03:17
|- - whale_nik   Цитата(alexr22b @ Sep 9 2016, 07:17) Сп...   Sep 9 2016, 09:06
- - whale_nik   Работает, красота )))   Sep 14 2016, 22:46


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 00:44
Рейтинг@Mail.ru


Страница сгенерированна за 0.01458 секунд с 7
ELECTRONIX ©2004-2016