Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
13 / 10 / 3
Регистрация: 29.03.2018
Сообщений: 95
1

Из за чего может грузиться ГП при использовании OpenTK?

29.12.2019, 20:05. Показов 831. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Почти сделал remake курсового проекта однокурсника на C#, но при проверке производительности оказалось что идёт большое потребление ГП. В начале смотрел производительность в диспетчере задач, потом в MSI Afterburner RivaTuner, и действительно 20-30% загрузка ГП, контроллер памяти 15-17% (причём видяха gtx 1060 6gb).
Из за чего может грузиться ГП при использовании OpenTK?

При запуске игры потребление ГП 2-4%, но после 10сек начинается активный прирост. Юзаю 1 simple ShaderProgram для всех objects на "сцене" с такими shaders:
Кликните здесь для просмотра всего текста

C
1
2
3
4
5
6
7
8
9
10
// Vertex Shader
#version 330 core
layout (location = 0) in vec3 in_position;
uniform mat4 u_mvp;
void main() { gl_Position = vec4(in_position, 1.0) * u_mvp; }
 
// Fragment Shader
#version 330 core
uniform vec4 u_color;
void main() { gl_FragColor = u_color; }

Размер лабиринта не влияет на производительность, а вот размер окна вроде как влияет. При рандомном переключение между окнами или при переключение maximaze окна игры потребление ГП может сбросится до 1-4% на ~45сек, но после вернётся к 20-30%. GlControl дёргаю таймером из WinForms каждые 15мс:
C#
1
2
Timer renderTimer = new Timer() { Interval = 15, Enabled = true };
renderTimer.Tick += (s, e) => GlControl.Invalidate();
В основном у меня фигуры наследуются от Shape:
Кликните здесь для просмотра всего текста

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
public abstract class Shape : IDisposable
{
    protected int handle;
    protected int vbo;
    protected int verticesCount;
    protected ShaderProgram shaderProgram;
 
    public Matrix4 Mvp { get; set; }
    public Color Color { get; set; }
    public int VerticesCount => verticesCount;
 
    public Shape(ShaderProgram shaderProgram) => this.shaderProgram = shaderProgram;
 
    public virtual void Draw(PrimitiveType primitiveType = PrimitiveType.TriangleFan)
    {
        shaderProgram.Use();
 
        SetMvp(Mvp);
        SetColor(Color);
 
        GL.BindVertexArray(handle);
        GL.DrawArrays(primitiveType, 0, verticesCount);
        GL.BindVertexArray(0);
    }
 
    protected void SetMvp(Matrix4 mvp) => GL.UniformMatrix4(shaderProgram.Mvp, true, ref mvp);
 
    protected void SetColor(Color color) => GL.Uniform4(shaderProgram.Color, NormalizeColor(color));
 
    protected static Vector4 NormalizeColor(Color color) => new Vector4(
        color.R / 255f,
        color.G / 255f,
        color.B / 255f,
        color.A / 255f);
 
    //IDisposable Support
}

А это квадрат:
Кликните здесь для просмотра всего текста

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
public class Rectangle : Shape
{
    public PointF Origin { get; private set; }
    public SizeF Size { get; private set; }
 
    public Rectangle(ShaderProgram shaderProgram, PointF origin, SizeF size) : base(shaderProgram)
    {
        Origin = origin;
        Size = size;
 
        Vector3[] vertices = new Vector3[]
        {
            new Vector3(Origin.X - Size.Width / 2f, Origin.Y + Size.Height / 2f, 0),
            new Vector3(Origin.X - Size.Width / 2f, Origin.Y - Size.Height / 2f, 0),
            new Vector3(Origin.X + Size.Width / 2f, Origin.Y - Size.Height / 2f, 0),
            new Vector3(Origin.X + Size.Width / 2f, Origin.Y + Size.Height / 2f, 0)
        };
 
        verticesCount = vertices.Length;
 
        handle = GL.GenVertexArray();
        
        GL.BindVertexArray(handle);
 
        vbo = GL.GenBuffer(); //Vertex Buffer Object
        GL.BindBuffer(BufferTarget.ArrayBuffer, vbo);
        GL.BufferData(BufferTarget.ArrayBuffer, verticesCount * Vector3.SizeInBytes, vertices, BufferUsageHint.StaticDraw);
 
        GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, Vector3.SizeInBytes, IntPtr.Zero);
        GL.EnableVertexAttribArray(0);
 
        GL.BindVertexArray(0);
 
        GL.DeleteBuffer(vbo);
    }
 
    public override void Draw(PrimitiveType primitiveType = PrimitiveType.Quads) => base.Draw(primitiveType);
 
    public static Vector3[] CreateVectors(PointF origin, SizeF size) => new Vector3[]
        {
            new Vector3(origin.X - size.Width / 2f, origin.Y + size.Height / 2f, 0),
            new Vector3(origin.X - size.Width / 2f, origin.Y - size.Height / 2f, 0),
            new Vector3(origin.X + size.Width / 2f, origin.Y - size.Height / 2f, 0),
            new Vector3(origin.X + size.Width / 2f, origin.Y + size.Height / 2f, 0)
        };
}

, юзаю его для точечной отрисовки квадратов (например, фон карты и выходы из лабиринтов).
А это стены:
Кликните здесь для просмотра всего текста

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
public class RectangleArray : Shape
{
    public RectangleArray(ShaderProgram shaderProgram, Vector3[] vectors) : base(shaderProgram)
    {
        verticesCount = vectors.Length;
 
        handle = GL.GenVertexArray();
 
        GL.BindVertexArray(handle);
 
        vbo = GL.GenBuffer(); //Vertex Buffer Object
        GL.BindBuffer(BufferTarget.ArrayBuffer, vbo);
        GL.BufferData(BufferTarget.ArrayBuffer, verticesCount * Vector3.SizeInBytes, vectors, BufferUsageHint.StaticDraw);
 
        GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, Vector3.SizeInBytes, IntPtr.Zero);
        GL.EnableVertexAttribArray(0);
 
        GL.BindVertexArray(0);
 
        GL.DeleteBuffer(vbo);
    }
 
    public override void Draw(PrimitiveType primitiveType = PrimitiveType.Quads) => base.Draw(primitiveType);
}

Может во времени есть какая-то закономерность? Может я как-то не так отрисовываю VAO? Кста, скачал программу RenderDoc (пока не знаю как её пользоваться), она показывает что стены состоят из 1 VAO с 6420 вершинами, похоже проблема в этом. Ещё кста, без SwapBuffers() в событие render потребление ГП 0-7%, но картинка не выводится.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.12.2019, 20:05
Ответы с готовыми решениями:

Для чего делать Resize при использовании Picasso
Почему нужно иногда использовать resize() когда загружаешь изображения при помощи Picasso? Почему...

Воспроизведение OGG через OpenTK (OpenTK.OpenAL) из ресурсов
Добрый вечер всем! Собственно, мой первый пост :) Имеется проблема с воспроизведением звуков OGG...

Может ли потребоваться применение механизма событий при использовании паттерна MVVM?
Паттерн MVVM провозглашён как базовый паттерн для приложений WPF. В паттерне MVVM используется...

Почему может не грузиться ексель в рнр?
Отлаживал программу на стандартном компе, со стандартной операционной системой win 7 32, и все было...

2
13 / 10 / 3
Регистрация: 29.03.2018
Сообщений: 95
01.01.2020, 17:02  [ТС] 2
Проанализировав examples OpenTK и OpenGL.Net я пришёл к выводу что так так и должно быть. Например, Hello Triangle в обоих проектах нагружает видяху на ~10%
0
1471 / 826 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
02.01.2020, 13:07 3
По идее тут всего 2 текстуры.
При старте проги 1 раз нарисовать текстуру1 лабиринта и текстуру2 красного пятна с альфаканалом.
Движение точки это изменение текстурных координат пятна.
Цитата Сообщение от Dimasikkk1 Посмотреть сообщение
Hello Triangle в обоих проектах нагружает видяху на ~10%
Может тогда просто на помойку такую библиотеку?

А сделанный без этой библиотеки нагружает на 0% ? =)
0
02.01.2020, 13:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.01.2020, 13:07
Помогаю со студенческими работами здесь

Из за чего может появляться такая ошибка при отправке формы?
Подскажите, пожалуйста, из за чего вылезает такая ошибка? Warning: Cannot modify header information...

При использовании функции fgets () и вводе абсолютно правильного имени файла программа не может открыть файл
Прошу прощение за беспокойство и за глупый вопрос, но вoобщем проблема такая: Программа...

На старых компьютерах, BIOS по умолчанию не может грузиться с флешки.
Здравствуйте я создал себе загрузочную флешку, вообще она мне нужна была для работа с жёсткими...

Может ли жесткий диск грузиться на 100% если драйвера не подходят?
Постоянно грузить жесткий диск на 100% и мне сказали что может драйвера не подходить в этом...

Kyocera ecosys M3040dn из-за чего может быть темный фон при двусторонней печати
подскажите из-за чего может быть темный фон при двусторонней печати на kyocera ecosys M3040dn, при...

Компьютер при включение диспетчера задач,приложений,удаления чего-либо может начинать задумываться
Добрый вечер,обращаюсь к вам с такими вопросами. Начну с того,что уже около 2 месяцев у меня...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru