Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 10.12.2010
Сообщений: 3

Direct3D и Многопоточность.

10.12.2010, 14:12. Показов 1714. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток, долго искал ответ на мой вопрос с помощью Гугла, но так ничего и не разузнал, по сему решил зарегистрироваться на этом форуме.
Изначальная задача состоит в том, что необходимо создать вращающиеся объекты в разных потоках, скажу сразу, DirectX никогда не пользовал раньше, по этому изучал с нуля. В итоге разобрался как создавать вращающиеся объекты, и с помощью треугольников и с помощью Mesh-объектов. Затем стал запускать их в потоках, с мешобъектами сразу начала происходить какая-то беда , в общем вызывалось исключение D3DERR_INVALIDCALL, где ошибка так и не смог понять, переделал всё с помощью треугольников, такого исключения больше не появляется, однако мои кубики начали моргать, то есть они отрисовываются на панели не вместе, а по очереди. Зато потоки работают.

Вот привожу код:

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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
using System.Threading;
    
namespace RenderCube
{
    public partial class Form2 : Form
    {
        VertBuf veb = new VertBuf();
        DrawCube DC = new DrawCube();
        List<CubeParam> lDC = new List<CubeParam>();
        List<Thread> LisThread = new List<Thread>();
        TimeDraw TD = new TimeDraw();
        InOutFile inOut = new InOutFile();
        
        
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
 
            using (Form2 frm = new Form2())
            {
                // Показать форму перед созданием движка
                frm.Show();
                // Создать и инициализировать графический движок
                // нашей функцией
                frm.InitializeGraphics();
                // Войти в цикл сообщений
                Application.Run(frm);
            }
        }
 
        public Form2()
        {
            InitializeComponent();
        }
    
        private Device device = null;
        private VertexBuffer vb = null;
    
        public void InitializeGraphics()
        {
            // Создание объекта и настройка параметров представления
            // Создать объект параметров представления
            PresentParameters presentParams = new PresentParameters();
            // Установить оконный режим
            presentParams.Windowed = true;
            // Сбрасывать содержимое буфера, если он не готов к представлению
            presentParams.SwapEffect = SwapEffect.Discard;
            // Создать объект устройства и сохранить ссылку на него
            device = new Device(0, DeviceType.Hardware, myPanel1,
                CreateFlags.MultiThreaded | CreateFlags.SoftwareVertexProcessing, presentParams);
    
            // Создать вершинный буфер
            vb = new VertexBuffer(typeof(CustomVertex.PositionColored),
                                  36,
                                  device,
                                  Usage.Dynamic | Usage.WriteOnly,
                                  CustomVertex.PositionColored.Format,
                                  Pool.Default);
    
            // Регистрация события Created вершинного буфера
            vb.Created += new EventHandler(veb.vb_Created);
    
            // Принудительный вызов создания треугольника 
            // и заполнения вершинного буфера при первом 
            // создании формы
            veb.vb_Created(vb, null);
        }
    
        private float angle = 0;// Закрытый член класса
        
    
        // Установка камеры в сцену
        private void SetupCamera()
        {
            //Создание перспективы 
            device.Transform.Projection = Matrix.PerspectiveFovLH(
                (float)Math.PI / 4, // Угол зрения равен 45 градусов
                                    // Форматное соотношение сторон
                (float)this.ClientSize.Width / (float)this.ClientSize.Height, 
                1.0F,               // Ближний план
                100.0F);            // Дальний план
    
            //Добавление камеры 
            device.Transform.View = Matrix.LookAtLH(
                new Vector3(0, 0, 15.0F),    // Положение камеры
                new Vector3(),              // Положение объекта текущее
                new Vector3(0, 1, 0));      // Направление камеры
    
            // Освещение
           device.RenderState.Lighting = false;
    
            if (flagRotate)
                angle += 0.02F;
 
        }
 
        private void myPanel1_Paint(object sender, PaintEventArgs e)
        {
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            CubeParam cubeParam = new CubeParam();
 
            cubeParam.CoordinateX  = (float)Convert.ToDouble(textBox1.Text);
            cubeParam.CoordinateY = (float)Convert.ToDouble(textBox2.Text);
            cubeParam.Angle = angle;
 
           // Создание процессов
 
            Thread t = new Thread(delegate() { DC.DrawBox(cubeParam, device); });
 
            string nm = Convert.ToString(t.ManagedThreadId);
            t.Name = nm;
            t.IsBackground = false;
            t.Priority = ThreadPriority.Normal;
 
            LisThread.Add(t);
            
            lDC.Add(cubeParam);
            timer1.Start();
            timer2.Start();
            
 
        }
 
        public void timer1_Tick(object sender, EventArgs e)
        {
            // Очистить цветом клиентскую область формы
            device.Clear(ClearFlags.Target,
                System.Drawing.Color.CornflowerBlue,
                1.0F, 0);
 
            // Вызов нашей функции установки камеры
            SetupCamera();
 
            // Сформировать сцену с учетом параметров 
            // "положение-нормаль-цвет"
            device.BeginScene();
            // Установить формат обработки вершин при отображении
            device.VertexFormat = CustomVertex.PositionColored.Format;
            // Заполнить устройство данными из буфера
            device.SetStreamSource(0, vb, 0);
 
           //Вызов процессов
 
            foreach (Thread t in LisThread)
            {
                while (t.ThreadState == ThreadState.Unstarted)
                {
                    t.IsBackground = true;
                    t.Start();
                }
            }
            device.DrawPrimitives(PrimitiveType.TriangleList, 0, 12);
            device.EndScene();
            // Показать буфер кадра 
            device.Present();
        }
 
        public void timer2_Tick(object sender, EventArgs e)
        {
           //textBox3.Text = inOut.ReadFile(AppDomain.CurrentDomain.BaseDirectory + "log.txt");
        }
    }
}
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
class VertBuf
    {
        public void vb_Created(object sender, EventArgs e)
        {
            // Определить внутреннюю ссылку на вершинный буфер
            VertexBuffer buffer = (VertexBuffer)sender; // Явное приведение типов
 
            // Создать локальный массив структур непреобразованных координат
            CustomVertex.PositionColored[] verts = new
                CustomVertex.PositionColored[36];
 
            // Задать параметры аппроксимирующих треугольников
            verts[0] = new CustomVertex.PositionColored(-1.0F, 1.0F, 1.0F, Color.Red.ToArgb());
            verts[1] = new CustomVertex.PositionColored(-1.0F, -1.0F, 1.0F, Color.Red.ToArgb());
            verts[2] = new CustomVertex.PositionColored(1.0F, 1.0F, 1.0F, Color.Red.ToArgb());
            verts[3] = new CustomVertex.PositionColored(-1.0F, -1.0F, 1.0F, Color.Red.ToArgb());
            verts[4] = new CustomVertex.PositionColored(1.0F, -1.0F, 1.0F, Color.Red.ToArgb());
            verts[5] = new CustomVertex.PositionColored(1.0F, 1.0F, 1.0F, Color.Red.ToArgb());
 
            verts[6] = new CustomVertex.PositionColored(-1.0F, 1.0F, -1.0F, Color.Blue.ToArgb());
            verts[7] = new CustomVertex.PositionColored(1.0F, 1.0F, -1.0F, Color.Blue.ToArgb());
            verts[8] = new CustomVertex.PositionColored(-1.0F, -1.0F, -1.0F, Color.Blue.ToArgb());
            verts[9] = new CustomVertex.PositionColored(-1.0F, -1.0F, -1.0F, Color.Blue.ToArgb());
            verts[10] = new CustomVertex.PositionColored(1.0F, 1.0F, -1.0F, Color.Blue.ToArgb());
            verts[11] = new CustomVertex.PositionColored(1.0F, -1.0F, -1.0F, Color.Blue.ToArgb());
 
            verts[12] = new CustomVertex.PositionColored(-1.0F, 1.0F, 1.0F, Color.Yellow.ToArgb());
            verts[13] = new CustomVertex.PositionColored(1.0F, 1.0F, -1.0F, Color.Yellow.ToArgb());
            verts[14] = new CustomVertex.PositionColored(-1.0F, 1.0F, -1.0F, Color.Yellow.ToArgb());
            verts[15] = new CustomVertex.PositionColored(-1.0F, 1.0F, 1.0F, Color.Yellow.ToArgb());
            verts[16] = new CustomVertex.PositionColored(1.0F, 1.0F, 1.0F, Color.Yellow.ToArgb());
            verts[17] = new CustomVertex.PositionColored(1.0F, 1.0F, -1.0F, Color.Yellow.ToArgb());
 
            verts[18] = new CustomVertex.PositionColored(-1.0F, -1.0F, 1.0F, Color.Black.ToArgb());
            verts[19] = new CustomVertex.PositionColored(-1.0F, -1.0F, -1.0F, Color.Black.ToArgb());
            verts[20] = new CustomVertex.PositionColored(1.0F, -1.0F, -1.0F, Color.Black.ToArgb());
            verts[21] = new CustomVertex.PositionColored(-1.0F, -1.0F, 1.0F, Color.Black.ToArgb());
            verts[22] = new CustomVertex.PositionColored(1.0F, -1.0F, -1.0F, Color.Black.ToArgb());
            verts[23] = new CustomVertex.PositionColored(1.0F, -1.0F, 1.0F, Color.Black.ToArgb());
 
            verts[24] = new CustomVertex.PositionColored(-1.0F, 1.0F, 1.0F, Color.Gray.ToArgb());
            verts[25] = new CustomVertex.PositionColored(-1.0F, -1.0F, -1.0F, Color.Gray.ToArgb());
            verts[26] = new CustomVertex.PositionColored(-1.0F, -1.0F, 1.0F, Color.Gray.ToArgb());
            verts[27] = new CustomVertex.PositionColored(-1.0F, 1.0F, -1.0F, Color.Gray.ToArgb());
            verts[28] = new CustomVertex.PositionColored(-1.0F, -1.0F, -1.0F, Color.Gray.ToArgb());
            verts[29] = new CustomVertex.PositionColored(-1.0F, 1.0F, 1.0F, Color.Gray.ToArgb());
 
            verts[30] = new CustomVertex.PositionColored(1.0F, 1.0F, 1.0F, Color.Green.ToArgb());
            verts[31] = new CustomVertex.PositionColored(1.0F, -1.0F, 1.0F, Color.Green.ToArgb());
            verts[32] = new CustomVertex.PositionColored(1.0F, -1.0F, -1.0F, Color.Green.ToArgb());
            verts[33] = new CustomVertex.PositionColored(1.0F, 1.0F, -1.0F, Color.Green.ToArgb());
            verts[34] = new CustomVertex.PositionColored(1.0F, 1.0F, 1.0F, Color.Green.ToArgb());
            verts[35] = new CustomVertex.PositionColored(1.0F, -1.0F, -1.0F, Color.Green.ToArgb());
 
            // Заполнить вершинный буфер данными треугольников
            buffer.SetData(verts, 0, LockFlags.None);
        }
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
class DrawCube
    {
        private InOutFile wf = new InOutFile();
        private string val;
        public void DrawBox(CubeParam cp, Device device)
        {
            while (true)
            {
                float yaw =cp.Angle / (float)Math.PI;
                float pitch = cp.Angle / (float)Math.PI * 4.0F;
                float roll = cp.Angle / (float)Math.PI / 2.0F;
 
                device.Transform.World = Matrix.RotationYawPitchRoll(
                   yaw,
                   pitch,
                   roll) *
                   Matrix.Translation(cp.CoordinateX, cp.CoordinateY, 0.0F);
 
                val = Thread.CurrentThread.Name+' '+ Convert.ToString(yaw);
 
                wf.WriteFile(val, AppDomain.CurrentDomain.BaseDirectory + "log.txt");
 
                cp.Angle += 0.02f;
                Thread.Sleep(100);
            }
        }
    }
Вот сам проект: RenderCube.7z

В общем необходимо что бы перересовывались кубики вместе, а не по очереди.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.12.2010, 14:12
Ответы с готовыми решениями:

Qt + Direct3D
Здрасте :) Понимаю, что бред делаю, но: #ifndef MAINWINDOW_H #define MAINWINDOW_H #include &lt;QMainWindow&gt; #include...

Direct3D
Здравствуйте, после покупки системника поставили винду 7 bit32 Но при загрузке игр Lineage 2 и других по типу AION выскакивает...

Direct3D
Пытаюсь разобратся с программированием графики на Builder C++ не могу найти материала.

3
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
11.12.2010, 13:07
HS_GiGa, зачем тебе многопоточность? Я проект не смотрел, задам вопрос ты думал о том, что-бы перерисовать все кубики и только потом отобразить это на мониторе, используя двойную буферизацию?
0
0 / 0 / 0
Регистрация: 10.12.2010
Сообщений: 3
11.12.2010, 15:07  [ТС]
Да, что то типо этого, это контрольная в универ. Самое смешное что это контрольная по ОС, типо изучение работы процессов. Я просто не понимаю почему перерисовываются по очереди, я догадываюсь, что в устройство только из одного потока передаются данные, но это лишь догадка, и что бы я не делал, даже при создании устройства флаг мультипоточность поставил, ничего не помогает...
0
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
12.12.2010, 18:43
HS_GiGa, не понимаю как ты хочешь присобачить много поточность а главное зачем? Если ты хочешь крутить камеру так это делается в одном потоке, но если крутить Mesh объекты тогда можно на поворот каждого объекта выделять по потоку, ожидать завершения всех и только после этого писать их в буфер. Опять таки не пойму зачем, если это не намного медленней, а при большем количестве малых вычислений и наоборот быстрей, можно делать все в один поток.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.12.2010, 18:43
Помогаю со студенческими работами здесь

DirectX9 Direct3D
Здравствуйте! Возникла проблема: При загрузке х. файлов из пакета ДиректХ все нормально (тот же самый тигр). Но если я експортирую из...

Direct3D.dll
Ситуация такова: В Visual Studio 2013 создаю проект, подключаю библиотеки DirectX из C:\Windows\Microsoft.NET\DirectX for Managed...

Спрайты в Direct3D
Как средствами Direct3D сделать анимированный спрайт нарезкой из битмапа? И вывести полученную анимацию на экран? Есть пример для...

Инициализация Direct3D на С++
Столкнулся с проблемами при изучении DirectX. Останавился на инициализации Direct3D, потому что 1. Пробую пример из самплов SDK - все...

Треугольник в Direct3D 9
Рисую простой треугольник по книге Ф.Луны. Не отображается последняя грань треугольника... В чем может быть проблема??? Исходники и...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru