Ответы пользователя по тегу C#
  • Как эффективней рисовать в 2d на C#?

    Nipheris
    @Nipheris Куратор тега C#
    Если вам уже предложенные варианты с использованием OpenGL или D3D не подходят (я вам их также посоветую, т.к. вы с аппаратным ускорением нарисуете 1000 картинок за то же время, за которое рисуете через Graphics, который будучи оберткой вокруг GDI+, рисует все на CPU), то попробуйте воспользоваться стандартным бэк-буфером - отрисовка на него заметно быстрее, чем непосредственно на экран. Если у вас таких изображений несколько, то лучше их отрисовать в буфер, а буфер - на экран.
    А вообще, если серьезно: если у вас анимация и 2D-спрайты с риалтайм отрисовкой - то потратьте время на OpenGL или Direct2D, если у вас чисто вычислительная нагрузка без интерактивности - напишите сами код "рисования" одного битмапа на другом с использованием указателей, или вообще на С++ с вызовом из шарпа (нормальная практика для вычислительных задач).
    Ответ написан
  • C# - PostgreSQL Как работать с GridView?

    Nipheris
    @Nipheris Куратор тега C#
    Вам надо определиться с рядом требований к вашему приложению, в частности - на каком уровне абстракции оно работает с БД. Если на метауровне - т.е. для вашей программы нет ничего кроме набора неких таблиц и вьюх в базе (иными словами у вас чтото вроде стандартного шелла для работы с базой) - то это одна ситуация, и тут вам бы работать с INFORMATION_SCHEMA (чтобы без свитчей) и действительно собирать SQL-запросы самому. Если же у вас стандартные бизнес-задачи (создать запись о клиенте, заказе, ..., сохранить, отредактировать данные), и вы конкретно знаете, что у вас за таблицы и что там хранится, то почитайте про актуальные подходы к работе с данными в базах с использованием ORM, в случае дотнета - Entity Framework и NHibernate.
    Ответ написан
    Комментировать
  • C# отключение звука в программе?

    Nipheris
    @Nipheris Куратор тега C#
    Попробуйте воспользоваться WinAPI функцией waveOutSetVolume. Вроде как начиная с Висты, вызов функции приводит к заданию уровня громкости для конкретного приложения. Если не сталкивались ранее с вызовами WinAPI - почитайте о P/Invoke.
    Ответ написан
    Комментировать
  • Как сделать изменение окна в OpenGL, что бы при изменении размера окна картинка не масштабировалась?

    Nipheris
    @Nipheris Куратор тега C#
    В общем случае вам нужно поработать с проекционной матрицей (у вас - gluPerspective) и glViewport. Можете попробовать у вьюпорта поставить константы вместо ширины и высоты контрола.
    Ответ написан
    Комментировать
  • C# sharpGL рендеринг текста как вывести кириллицу?

    Nipheris
    @Nipheris Куратор тега C#
    может быть когда в c код буквы "я", она в операции с+1 превращается в ноль? Вы бы объяснили сначала цель этого преобразования (+1 ко всем байтам).
    Ответ написан
    Комментировать
  • Какую студию использовать?

    Nipheris
    @Nipheris Куратор тега C#
    Сидим до сих пор на 2008-й студии (большой проект на C++), пытались перейти года два назад на 2012-ю, но не смогли из-за проблем поддержки продукта под Windows XP - были проблемы с работой рантаймов. Майкрософт их потом вроде пофиксил, но мы уже не стали второй раз пытаться. Теперь ждем, когда пользователи слезут с XP. А в 2012-й только дампы смотрим и профайлимся.

    C .NET-ом в этом плане намного проще, в студии сейчас есть возможность выбирать в качестве целевой платформы любой фреймворк, начиная с 2.0, поэтому обновиться в большинстве случаев не проблема.
    Ответ написан
    Комментировать
  • Как реализовать "бегающие" точки?

    Nipheris
    @Nipheris Куратор тега C#
    Вопрос действительно академический: вам нужно основательно разобраться с событийно-управляемой (event-driven) архитектурой приложений. Пожалуй, все современные графические подсистемы так или иначе построены на ней (а вообще - не только графические). И в первую очередь нужно понять, что выполнение действий в своем цикле без передачи управления обработчикам сообщений - неверный подход. Дело в том, что GUI-приложение, в отличие от консольного, для того чтобы "не зависать", должно постоянно выполнять некоторые действия помимо нужных для вашей задачи, а именно - перерисовываться, обрабатывать события клавиатуры и мыши и т.д. Изза того что ваша программа "крутится" в цикле, то все те стандартные обработчики событий, которые должны получать управление, не получают его. Поэтому, если нужно выполнять интенсивные вычисления в графическом приложении, нужно либо:
    а) выполнять их в другом потоке - тогда получится сохранить структуру приложения и циклы, но встанет задача межпоточной передачи данных;
    б) выполнять работу порционно, время от времени передавая управления обработчикам системных событий. Это т.н. вызов DoEvents, в разных API он разный, но суть одна и та же.

    Конкретно для вашей задачи цикл на самом деле совершенно не нужен - вся анимация, какой бы они ни была, в современных приложениях (старые DOSовские игры не в счет) строится на таймерах и событиях их срабатывания. Поэтому вам нужно разобраться, как пользоваться в вашей среде таймерами и генерировать периодические события, и уже в обработчике события таймера делать label1.Text = "." , ".." , "..." в зависимости от того, какой "кадр" был предыдущий.
    Ответ написан
    Комментировать
  • Как запустить проект С# на другом пк?

    Nipheris
    @Nipheris Куратор тега C#
    Во-первых, как уже отметил GavriKos, соберите проект в Release-конфигурации - exe-шник, собранный в релизе, будет оптимизирован не для отладки, а для использования в продакшене. Во-вторых, определитесь с версиями Винды, на которых будете запускать проект - с 7-кой идет .net 3.5 (включающий в себя 3.0 и 2.0), c 8-кой - 4.5 (который включает в себя 4.0). Если попали в эти пары версия ОС/версия .net - то отдельно фреймворк ставить не надо, если не попали (например, ваше приложение под .net 4.5 нужно запустить на семерке), то тогда нужно получить инсталлятор с microsoft.com и установить на целевую машину. В-третьих, не забудьте с экзешником приложить все зависимости - если вы использовали какие-то библиотеки, то их сборки должны лежать вместе с exe. В общем все, остальное уже специфично для конкретного приложения. Для целей тестирования, если нужно свести риски незапуска к минимуму, могу посоветовать поднять чистую виртуалку с соотв. версией винды, и попытаться запустить там приложение в том виде, в котором вы его подготовили. Тогда станет понятно, что не учли и что нужно еще поставить.
    Ответ написан
    Комментировать
  • C#. DataAdapter нужно ли вызывать Dispose?

    Nipheris
    @Nipheris Куратор тега C#
    Толк от вызова метода Dispose есть всегда, когда есть сам метод Dispose (а если быть точным - если реализован интерфейс System.IDisposable). Тут просто не ваша ответственность разбираться - нужно ли вызывать Dispose или нет. Если автор класса реализовал этот интерфейс, значит для чего-то это ему нужно. Как правило это нужно, если используются управляемые вручную ресурсы (например, открытые файлы), либо в объекте создаются другие объекты, которые также IDisposable, и они должны подчищаться при disposing-е основного объекта, их создавшего.
    Если вы сталкивались с С++, то на мой взгляд Dispose - это и есть настоящий "деструктор" для объекта, который нужно вызывать самому (прямо или косвенно, с помощью using), чтобы корректно завершить жизненный цикл объекта. Так или иначе, вызывайте Dispose всегда, когда завершаете взаимодействие с объектом. Важно, что даже если СЕЙЧАС в реализации этого метода особо ничего не происходит, функционал может быть добавлен ПОЗДНЕЕ, в новой версии библиотеки которую вы используете. И тогда вам придется исправлять ваш код, чтобы избежать утечки ресурсов (незакрытые файлы или коннекции к БД часто гораздо бОльшая проблема, чем подтекающая память).
    Ответ написан
  • Как просто разбить грань фигуры на полигоны (триангуляция)?

    Nipheris
    @Nipheris Куратор тега C#
    Если используете OpenGL, рассмотрите алгоритмы, имеющиеся в библиотеке GLU - там есть достаточно качественный алгоритм тесселяции, поддерживающий сложные поверхности, в том числе с отверстиями. Т.е. вы передаете контуры поверхности: внешний и контуры дырок, алгоритм вам возвращает полигоны для отрисовки. Когда-то мне удалось применить его даже в паре с DirectX, т.к. времени на свою реализацию не было.
    Один из многих туториалов: www.glprogramming.com/red/chapter11.html
    Ответ написан