Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
dt
9 / 8 / 1
Регистрация: 08.10.2009
Сообщений: 18

Как использовать DirectX для отрисовки сложных графиков

16.05.2012, 17:48. Показов 1409. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Появилась необходимость реализовать очень производительную прорисовку графики в WinForms приложении (в реальном времени поступает множество данных на их основе строится сложный график). Решил сделать так: все расчеты и формирование изображения выполняется в фоновом потоке и формируется битмап, а потом при перерисовке или при необходимости обновить просто выводится этот битмап. Но, захотелось это дело еще более ускорить и смотру в сторону DirectX (к сожалению ранее с ним никогда не сталкивался). Для теста написал приложение и смотрю drawingsPerSecond, выходит где-то 14-15 тысяч раз за секунду, что вполне устраивает:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
using System;
using System.Drawing;
using System.Windows.Forms;
using Microsoft.DirectX.DirectDraw;
 
namespace Draw6
{
    public partial class Form1 : Form
    {
        public Device MyDevice = null;
        public Surface PrimarySurface;
        public Clipper MyClipper = null;
 
 
        Bitmap bm1;
        Bitmap bm2;
 
        public Form1()
        {
            InitializeComponent();
 
            bm1 = new Bitmap(@"d:\123.png");
            bm2 = new Bitmap(@"d:\1234.png");
 
            MyDevice = new Device();
            MyDevice.SetCooperativeLevel(this, CooperativeLevelFlags.Normal);
 
            SurfaceDescription MySurfaceDescription = new SurfaceDescription();
            MySurfaceDescription.SurfaceCaps.PrimarySurface = true;
 
            PrimarySurface = new Surface(MySurfaceDescription, MyDevice);
 
            Clipper clippy = new Clipper(MyDevice);
            clippy.Window = this;
            PrimarySurface.Clipper = clippy;
 
            this.FormClosed += new FormClosedEventHandler(MainForm_FormClosed);
        }
 
         public void MainForm_FormClosed(object sender, FormClosedEventArgs e)
        {
            MyDevice.Dispose();
            PrimarySurface.Dispose();
        }
 
        public void Render()
        {
            if (counter % 2 == 0)
                PrimarySurface.Draw(surf1, DrawFlags.DoNotWait);
            else
                PrimarySurface.Draw(surf2, DrawFlags.DoNotWait);            
        }
 
        Surface surf1;
        Surface surf2;
 
        long counter = 0;
 
 
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
 
            surf1 = new Surface(bm1, new SurfaceDescription(), MyDevice);
            surf2 = new Surface(bm2, new SurfaceDescription(), MyDevice);
 
            DateTime now = DateTime.Now;
            DateTime end = now.AddSeconds(10);
                        
            while (DateTime.Now < end)
            {
                Render();
                counter++;
            }          
 
            long drawingsPerSecond = counter / 10;
 
            surf1.Dispose();
            surf2.Dispose();
        }
    }
}
Суть вопроса: реально у меня не 2 изображения, а грубо говоря поток битмапов, и каждый раз необходимо выводить новый битмап. Если в методе Render каждый раз создавать новый Surface с новым битмапом, то производительнось падает где-то до 150 прорисовок за секунду. И так подскажите как в Surface просто поменять битмап на новый, или другой способ как наиболее производительным образом выводить поток битмапов.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.05.2012, 17:48
Ответы с готовыми решениями:

Класс для отрисовки графиков в Qt
Очень нужен класс для отрисовки графиков в QT Creator,все сойдут кроме QCustomPlot.Ребята спасайте,курсач горит

Компонент для отрисовки графиков
Где можно скачать для lazarus компонент графика не могу найти подскажыте пожалуста

Что лучше всего использовать для отрисовки простой 2D графики
Здравствуйте. Недавно начал изучать C++ для одного проекта. Передо мной встала задача. Нужно отрисовывать простую 2D графику. Что лучше...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.05.2012, 17:48
Помогаю со студенческими работами здесь

Способы отрисовки графиков
Доброго времени суток! По работе часто необходимо стоить графики по показаниям датчиков. И хотелось бы узнать больше методов построения, ...

Динамическая смена параметров функции отрисовки графиков
Всем привет! Не могу понять, что написать в файле html, чтобы была возможность смены параметра min прямо в рабочей программе. Есть...

Построение сложных графиков функций
Как же построить это в MathCAD Prime?

Как использовать directx 11?
Как в vb.net 2010/1012 использовать directx 11 ?

Принцип построения графиков сложных степенных функций.
подскажите ,пожалуйста ,каков принцип построения графиков сложных степенных функций . Например , e^{\operatorname{tg}x}, график то я...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru