Так что я возился с созданием простого ИИ и материала с базовым С#, и в этом проекте у меня много точек, которые я визуализировал, создавая растровое изображение. Это растровое изображение, которое я отобразил/загрузил в объект изображения в окне 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-плоскости. Прямо сейчас я играю с физикой и гравитацией, пытаясь создать простую солнечную систему с рабочей физикой. это все только побочные проекты, чтобы лучше узнать различные инструменты, когда я слишком устал, чтобы работать над своим основным проектом.
Я хотел бы представить визуальные элементы растрового изображения как элементы управления в 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, потребуется немного больше мысли, которое для вашего "первого проекта", хотя и интересного, может быть амбициозным шагом;)