Создание постоянно обновляемого изображения (WPF)

1

Так что я возился с созданием простого ИИ и материала с базовым С#, и в этом проекте у меня много точек, которые я визуализировал, создавая растровое изображение. Это растровое изображение, которое я отобразил/загрузил в объект изображения в окне WPF.. но моя проблема в том, что это визуализируется каждый миллисекунда, что делает частоту кадров довольно плохими - так как я могу сделать это лучше?

Могу ли я загрузить его "постоянно"? или я должен взять другой подход?

То, что я получил сейчас, довольно просто, но в любом случае я могу показать важные части, взятые из полного класса:

private static Bitmap BitMap = new Bitmap(500, 500);

static Graphics GraphicFromBitMap
{
    get
    {
        return Graphics.FromImage(BitMap);
    }
}

public static BitmapSource loadBitmapAsImage()
{
    IntPtr intPtr = BitMap.GetHbitmap();
    BitmapSource bitmapSource = null;
    try
    {
        bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(intPtr,
        IntPtr.Zero, Int32Rect.Empty,
        System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
    }
    finally
    {
        DeleteObject(intPtr);
    }

    DeleteObject(intPtr);

    return bitmapSource;
}

Это, конечно, только растровая часть - фактическая нагрузка выполняется следующим образом:

DispatcherTimer Timer = new DispatcherTimer();

public MainWindow()
{

        this.Timer.Tick += new EventHandler(Timer_Tick);
        this.Timer.Interval = new TimeSpan(0, 0, 0, 1);

        this.Timer.Start();
}
void Timer_Tick(object sender, EventArgs e)
{
    WorldMap.Draw();
    map.Source = WorldMap.BitMapSource;
}

Это, конечно, только важные части - я надеюсь, что мой вопрос понятен, но просто для того, чтобы уточнить и повторить:

Мне нужен образ WPF для обновления "каждого кадра" или изменения каждого значения времени.

На мой вопрос, возможно, уже был дан ответ, но я не мог найти ничего такого, что бы ни работало, и что-то подходящее для этого экземпляра.

BTW, делающий таймер более частым, создает ошибку с загрузкой, но точный код ошибки, я не могу вспомнить, и я не могу создать его снова - тем не менее, это, вероятно, не самый практичный способ делать это.

РЕДАКТИРОВАТЬ:

Для уточнения, это все, что я получил прямо сейчас: http://imgur.com/EIiSRFQ Я хочу ничего необычного - это просто для личных проектов, играющих с программированием и математикой, и это намного проще, если я смогу визуализировать объекты, которые я есть "перемещение" в моей 2D-плоскости. Прямо сейчас я играю с физикой и гравитацией, пытаясь создать простую солнечную систему с рабочей физикой. это все только побочные проекты, чтобы лучше узнать различные инструменты, когда я слишком устал, чтобы работать над своим основным проектом.

  • 0
    Что означает «обновление» в этом контексте? перезагрузить изображение или просто переключаться между уже загруженными растровыми изображениями для видимого изображения? Каковы требования к вашему приложению при обновлении изображений? Каковы приемлемые частоты кадров?
  • 0
    У вас есть образец изображения? Я предложил альтернативу, но хотел бы посмотреть, есть ли что-то в изображении, которое не может быть напрямую представлено в wpf.
Показать ещё 5 комментариев
Теги:
wpf
bitmap

1 ответ

0
Лучший ответ

Я хотел бы представить визуальные элементы растрового изображения как элементы управления в WPF. Таким образом, вы можете обновлять их напрямую и так же часто, как они меняются, без накладных расходов на создание растрового изображения и его рендеринг.

Производительность будет намного больше, поскольку вы только обновите изменения в стоимости.

Чтобы продемонстрировать суть, создайте элемент управления...

<UserControl x:Class="Sample_Chart.Views.CodeBehindChart"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         >
    <Canvas x:Name="LayoutRoot" />
</UserControl>

Это так же просто, как и они. Затем отредактируйте код за файлом...

public partial class CodeBehindChart : UserControl
{
    public CodeBehindChart()
    {
        InitializeComponent();
        Respond();
    }

    private async void Respond()
    {
        await Task.Delay(2000);
        Random r = new Random();

        while (true)
        {
            this.LayoutRoot.Children.Clear();

            for (int i = 0; i < 100; i++)
            {
                Rectangle rectangle = new Rectangle();
                rectangle.SetValue(Canvas.LeftProperty, r.NextDouble() * this.LayoutRoot.ActualWidth);
                rectangle.SetValue(Canvas.TopProperty, r.NextDouble() * this.LayoutRoot.ActualHeight);

                rectangle.Width = 2;
                rectangle.Height = 2;
                rectangle.Fill = Brushes.Black;

                this.LayoutRoot.Children.Add(rectangle);
            }

            await Task.Delay(500);
        }
    }
}

В этом коде есть метод async void, который сначала ждет 2 секунды (необязательно), а затем создает 100 визуальных элементов в случайных местах внутри элемента управления. Он освежает это каждые 1/2 секунды.

Если вы сделали то же самое, но на основе этих мест, размеров и заполнения - даже использовать разные формы - я думаю, вы будете иметь высокопроизводительное масштабируемое и легко расширяемое решение для ваших требований.

Принимая это на следующем этапе и контролируя ViewModel, потребуется немного больше мысли, которое для вашего "первого проекта", хотя и интересного, может быть амбициозным шагом;)

  • 0
    не уверен о чем ты? перемещение объектов на экране? например, иметь квадратное изображение вместо точки на растровом изображении (например)? Не уверен, как это будет сделано, поскольку у меня есть новые объекты, которые входят в «экран» и покидают его - и независимо от того, каким образом, я должен как-то «активировать» его, и я должен сделать это в главном потоке… что я могу не могу понять, как делать это без повторов, без какого-либо таймера, который выглядит как «плохой» способ сделать это.
  • 0
    Все должно быть возможно с представлением модели и коллекции. Вам все еще нужен регулятор для установки свойств - вот где вы можете обернуть его во второй интервал таймера. Просто мне, перерисовка загрузки элементов xaml, таких как прямоугольник и эллипс, основанных на значениях свойств, кажется проще, чем генерация растровых изображений - плюс она будет масштабироваться, представьте себе, что она выполняется на дисплее 4K. Если вы можете опубликовать изображение того, что вы пытаетесь, я мог бы дать вам более конкретный пример для оценки.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню