forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   С# (http://forum.boolean.name/forumdisplay.php?f=128)
-   -   Вопросы по XNA. (http://forum.boolean.name/showthread.php?t=16854)

Nikich 31.05.2012 15:45

Вопросы по XNA.
 
Вопросов скапливается немерено, поэтому решил отписываться здесь. Просьба не кидаться помидорами, ведь я только учусь.
Как изменить x и y в Vector2?
То есть у меня есть:
Код:

Vector2 player_position=new Vector2(100,100)
И как мне изменить координаты этого вектора?
Кстати, почему это называется вектором? Ведь тут нету направления, а значит это скаляр.
UPD: Всё, разобрался.
Код:

            if (Keyboard.GetState().IsKeyDown(Keys.W))
                player_position.Y -=  5;

            if (Keyboard.GetState().IsKeyDown(Keys.S))
                player_position.Y += 5;
           
            if (Keyboard.GetState().IsKeyDown(Keys.A))
                player_position.X -= 5;

            if (Keyboard.GetState().IsKeyDown(Keys.D))
                player_position.X += 5;

Быдло код?



И ещё. Как следует работать со временем? Есть ли аналог MilliSecs()?

pax 31.05.2012 16:34

Ответ: Вопросы по XNA.
 
Цитата:

Сообщение от Nikich (Сообщение 229130)
Код:

            if (Keyboard.GetState().IsKeyDown(Keys.W))
                player_position.Y -=  5;

            if (Keyboard.GetState().IsKeyDown(Keys.S))
                player_position.Y += 5;
           
            if (Keyboard.GetState().IsKeyDown(Keys.A))
                player_position.X -= 5;

            if (Keyboard.GetState().IsKeyDown(Keys.D))
                player_position.X += 5;

Быдло код?

Думаю надо примерно так:
PHP код:

var kbState Keyboard.GetState();    
if (
kbState.IsKeyDown(Keys.W))
      
player_position.-=  5;

if (
kbState.IsKeyDown(Keys.S))
      
player_position.+= 5;
            
if (
kbState.IsKeyDown(Keys.A))
      
player_position.-= 5;

if (
kbState.IsKeyDown(Keys.D))
     
player_position.+= 5


Цитата:

Сообщение от Nikich (Сообщение 229130)
И ещё. Как следует работать со временем? Есть ли аналог MilliSecs()?

Там же есть TimeSpan

Nikich 31.05.2012 16:39

Ответ: Вопросы по XNA.
 
Спасибо. Только что значит var? В паскале так начинался блок с переменными, но вряд ли это как-то связано с паскалем.

pax 31.05.2012 16:40

Ответ: Вопросы по XNA.
 
Что такое var

moka 31.05.2012 19:13

Ответ: Вопросы по XNA.
 
Вектор обычно выражается в двух числах, и чаще всего подразумевает что первая точка находиться в 0,0.
Есть нормализованный вектор, когда длина между 0,0 и указанными x,y равна 1.0, в данном случае это не нормализованный вектор, и по сути из этих двух чисел ты можешь получить длину вектора и его направление.

Используй официальную документацию, она может быть очень полезной и само-достаточной.
http://msdn.microsoft.com/en-us/libr...2_members.aspx

Чтобы получить X или Y, просто пиши:
Код:

player_position.X;
Да и я любитель придраться, но так по мне читабельнее так:
Код:

Vector2 playerPosition = new Vector2(100, 100)

radiobutton 31.05.2012 23:03

Ответ: Вопросы по XNA.
 
А какой из этих вариантов читабельнее?
Код:

PlayerPosition(playerPosition, playerPosition + enemyPosition, playerPosition * enemyPosition - lolPosition)
Код:

PlayerPosition(player_position, player_position + enemy_position, player_position * enemy_position - lol_position)

Nikich 31.05.2012 23:06

Ответ: Вопросы по XNA.
 
Спасибо. А нет ли у кого примеров по XNA? Просто я не знаю, на что он вообще способен:) В принципе и функционал в БлитцМаксе нормальный был, но мне не кажется что это действительно максимум в 2D. Кстати, может ли кто-нибудь назвать то, чего нельзя сделать на чистом(!) Максе, но можно на XNA?

pax 01.06.2012 00:05

Ответ: Вопросы по XNA.
 
XNA это графическое АПИ (альтернатива DirectX). Можно все, на что способна видеокарта - шейдеры и т.п. И это не только 2d.

Dream 01.06.2012 13:15

Ответ: Вопросы по XNA.
 
в инете куча туториалов с XNA. а на ютубе много роликов в которых показывают его возможности

Nikich 01.06.2012 13:29

Ответ: Вопросы по XNA.
 
http://create.msdn.com/en-US/educati...etting_started
Пока что лучшее из того, что видел. Всё очень понятно, а главное показывают не только функционал XNA, а также и с самим шарпом знакомят.

Nikich 01.06.2012 21:09

Ответ: Вопросы по XNA.
 
Гм.
Решил провести тест на производительность. Выяснилось, что Макс быстрее XNA. Это я быдло-кодер на C#(хотя конечно я быдло-кодер, но до такой ли степени?), или это действительно так?

moka 01.06.2012 21:10

Ответ: Вопросы по XNA.
 
Тест в студию.
Сравнивать столь разные инструменты использующие разные GAPI немного не разумно, ну да ладно..

Nikich 01.06.2012 21:15

Ответ: Вопросы по XNA.
 
XNA
BlitzMax
Сейчас проверю на большем количестве картинок.
Могу кинуть код, если нужно.
З.Ы. В XNA пока не знаю аналога DesktopWidth\DesktopHeight, поэтому разрешение 1280 на 1024.

moka 01.06.2012 21:26

Ответ: Вопросы по XNA.
 
Не корректно выразился, я имел ввиду не сам ехе теста, а его описание (что тестируешь) и исходники.
Не тестируй тупо вывод картинок - это ничего не показывает.
Также реально готовый проект на обоих будет конкретно отличаться по многим аспектам.
Короче говоря, ты сравниваешь BMW с AUDI, разные вещи хоть и имеют по 4 колеса.

Nikich 01.06.2012 21:37

Ответ: Вопросы по XNA.
 
Чем больше картинок, тем хуже.
Кидаю код.
Max:

Код:

Global R1=DesktopWidth()
Global R2=DesktopHeight()
Graphics R1,R2,32
Global lfps,tfps,fps
Global pic=LoadImage("01.jpg")
Global pic_x,pic_y

Function Update_pic()
If KeyDown(KEY_W) pic_y=pic_y-1
If KeyDown(KEY_S) pic_y=pic_y+1
If KeyDown(KEY_D) pic_x=pic_x+1
If KeyDown(KEY_A) pic_x=pic_x-1
DrawText pic_x+"    "+pic_y,0,24
For i=0 To 10
For i1=0 To 10
DrawImage pic,pic_x+256*i,pic_y+256*i1
Next
Next
End Function

Function Update_fps()
lfps=lfps+1
If MilliSecs()-tfps>1000
 tfps=MilliSecs()
 fps=lfps
 lfps=0
EndIf
DrawText fps,0,0
End Function

While Not KeyHit(KEY_ESCAPE)
Cls
Update_pic()
Update_fps()
Flip(0)
Wend


XNA:

PHP код:

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace 
WindowsGame1
{
    
/// <summary>
    /// This is the main type for your game
    /// </summary>
    
public class Game1 Microsoft.Xna.Framework.Game
    
{
        
GraphicsDeviceManager graphics;
        
        
SpriteBatch spriteBatch;

        public 
Game1()
        {
            
graphics = new GraphicsDeviceManager(this);
            

            
graphics.IsFullScreen true;
            
IsFixedTimeStep false;
            
graphics.SynchronizeWithVerticalRetrace false;
            
graphics.PreferredBackBufferHeight 1280;
            
graphics.PreferredBackBufferWidth 1024;
            
Content.RootDirectory "Content";
        }

        
/// <summary>
        /// Allows the game to perform any initialization it needs to before starting to run.
        /// This is where it can query for any required services and load any non-graphic
        /// related content.  Calling base.Initialize will enumerate through any components
        /// and initialize them as well.
        /// </summary>
        /// 
        
Texture2D backgroundTexture;
        
SpriteBatch sprites;
        
Vector2 player_position = new Vector2(100100);
        
SpriteFont Font1;
        
        

        
double elapsedTime;
        
int fps;
        
int l_fps;

        protected 
override void Initialize()
        {

            
            
sprites = new SpriteBatch(graphics.GraphicsDevice);
            

            
// TODO: Add your initialization logic here
            

            
base.Initialize();
        }

        
/// <summary>
        /// LoadContent will be called once per game and is the place to load
        /// all of your content.
        /// </summary>
        
protected override void LoadContent()
        {
            
// Create a new SpriteBatch, which can be used to draw textures.
            
spriteBatch = new SpriteBatch(GraphicsDevice);
            
            
// TODO: use this.Content to load your game content here
            
Font1 Content.Load<SpriteFont>("arial");
            
backgroundTexture Content.Load<Texture2D>("Gert");
        }

        
/// <summary>
        /// UnloadContent will be called once per game and is the place to unload
        /// all content.
        /// </summary>
        
protected override void UnloadContent()
        {
            
// TODO: Unload any non ContentManager content here
        
}

        
/// <summary>
        /// Allows the game to run logic such as updating the world,
        /// checking for collisions, gathering input, and playing audio.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        
protected override void Update(GameTime gameTime)
        {
            
// Allows the game to exit
            
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                
this.Exit();

            if (
Keyboard.GetState().IsKeyDown(Keys.Escape))
                
this.Exit();

            if (
Keyboard.GetState().IsKeyDown(Keys.W))
                
player_position.-=  1;

            if (
Keyboard.GetState().IsKeyDown(Keys.S))
                
player_position.+= 1;
            
            if (
Keyboard.GetState().IsKeyDown(Keys.A))
                
player_position.-= 1;

            if (
Keyboard.GetState().IsKeyDown(Keys.D))
                
player_position.+= 1;
      
            
elapsedTime+=gameTime.ElapsedGameTime.TotalMilliseconds;
            
l_fps++;

            if (
elapsedTime >= 1000)
            {
                
fps l_fps;
                
l_fps 0;
                
elapsedTime 0;
            }

                
// TODO: Add your update logic here

            
base.Update(gameTime);
        }

        
/// <summary>
        /// This is called when the game should draw itself.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        
protected override void Draw(GameTime gameTime)
        {
            
GraphicsDevice.Clear(Color.Black);
            
            
sprites.Begin();
            
            for (
int i=0i<11 i++)
            {
                for (
int i1 0i1 11i1++)
                {
                    
sprites.Draw(backgroundTexture, new Vector2(player_position.256player_position.i1 256), Color.White);
                }
            }
            
sprites.DrawString(Font1Convert.ToString(player_position.X) + " " Convert.ToString(player_position.Y), Vector2.ZeroColor.White);
            
sprites.DrawString(Font1Convert.ToString(fps), new Vector2(024), Color.White);
            
sprites.End();
                
            
// TODO: Add your drawing code here

            
base.Draw(gameTime);
        }
    }



Результаты этого теста:
Max - 2160
XNA - 1816
Не знаю почему, но меня это вообще в шок повергло. А с чем именно это связано? XNA использует DirectX, Max вроде бы тоже.

radiobutton 01.06.2012 22:14

Ответ: Вопросы по XNA.
 
Мб в блицмаксе не рисуются объекты когда выходят за экран? Тоесть в функции рендера такая проверка. А в XNA нужно самому проверять.

moka 01.06.2012 22:17

Ответ: Вопросы по XNA.
 
facepalm

Nikich 01.06.2012 22:25

Ответ: Вопросы по XNA.
 
Тогда бы случай с одной картинкой должен был давать одинаковый результат.
Дело в чем-то другом.
Тут у меня вопрос возник. А есть ли что-нибудь шустрее Макса, в плане вывода картинок?

radiobutton 01.06.2012 22:26

Ответ: Вопросы по XNA.
 
Цитата:

Сообщение от MoKa (Сообщение 229202)
facepalm

ы? .

radiobutton 01.06.2012 22:27

Ответ: Вопросы по XNA.
 
Цитата:

Сообщение от Nikich (Сообщение 229203)
Тогда бы случай с одной картинкой должен был давать одинаковый результат.
Дело в чем-то другом.
Тут у меня вопрос возник. А есть ли что-нибудь шустрее Макса, в плане вывода картинок?

попробуй написать свой шейдер для вывода картинок на XNA и проверь :) Мб там вычислений куда больше чем в максе производится в том что по умолчанию предлогается.

и попробуй вот так потестить

Код:

            for (int i = 0; i < 1100; i++)
            {
                for (int i1 = 0; i1 < 11; i1++)
                {
                    sprites.Draw(backgroundTexture, new Vector2(player_position.X , player_position.Y  ), Color.White);
                }
            }


pax 01.06.2012 22:27

Ответ: Вопросы по XNA.
 
Во втором тесте у картинок есть прозрачность? Спрайт батч имеет еще параметры сортировки спрайтов, что используется по умолчанию?

Nikich 01.06.2012 22:33

Ответ: Вопросы по XNA.
 
Нет, прозрачности нигде нету. Про сортировку ничего не знаю, сейчас посмотрю.
Тут появилось две идеи. Может это связано с форматом картинки? Также, возможно, я неправильно убрал ограничение фпс в XNA?
З.Ы. Исходники двумя моими постами выше, в оффтопе.

radiobutton 01.06.2012 22:34

Ответ: Вопросы по XNA.
 
Цитата:

Сообщение от pax (Сообщение 229206)
Во втором тесте у картинок есть прозрачность? Спрайт батч имеет еще параметры сортировки спрайтов, что используется по умолчанию?

Deferred: спрайты не отображаются до вызова SpriteBatch.End. Затем все вызовы направляются на графическое устройство в том порядке, в каком они были сделаны. В этом режиме многочисленные объекты SpriteBatch могут проводить вызовы Draw без конфликтов друг с другом. (Это режим по умолчанию.)

Цитата:

Immediate: метод Begin сразу же после вызова устанавливает настройки для графического устройства, а новые вызовы Draw сразу же выводят спрайты на экран. Но только один объект SpriteBatch может быть активен в данное время. Это самый быстрый режим
Лол. в Этом режиме в 2 раза меньше фпс чем в других. а то и еще меньше. Хз в каком месте он самый быстрый.)) На счет прозрачности, разные режимы вроде не сильно влияют на результат.

Но самый быстрый это:
Код:

sprites.Begin(SpriteSortMode.Deferred, BlendState.Additive);
Additive: прозрачное смешивание; добавляет цвета спрайта к цвету фона без использования прозрачности.
Попробуй с такой строчкой.
и так попробуй: BlendState.Opaque
Но этот медлеенее у меня чем Additive
Цитата:

Opaque: непрозрачное смешивание; цвет фона заменяется цветом спрайта.
зы: Пользуясь случаем. Где можно почитать подробно про шейдеры разных версий. Чем 2.0 отличаются от 3.0 и 4.0 итд. И по HLSL какой нить учебник, чтобы все подробно, а не вкратце.=0

Nikich 01.06.2012 22:46

Ответ: Вопросы по XNA.
 
Сейчас нет доступа к ПК. А сильно ли это у тебя повлияло?

radiobutton 01.06.2012 22:53

Ответ: Вопросы по XNA.
 
Цитата:

Сообщение от Nikich (Сообщение 229209)
Сейчас нет доступа к ПК. А сильно ли это у тебя повлияло?

м кстати я наврал походу. sprites.Begin(SpriteSortMode.Deferred, BlendState.Opaque); самый быстрый.

Вообщем
sprites.Begin();
8700
sprites.Begin(SpriteSortMode.Deferred, BlendState.Opaque);
8840

не знаю от чего зависит. при каждом запуске разные цифры.
щас вообще 8650 было с
sprites.Begin(SpriteSortMode.Deferred, BlendState.Opaque);

а до этого , как я говорил
sprites.Begin(SpriteSortMode.Deferred, BlendState.Additive);
выдавал больше чем
sprites.Begin(SpriteSortMode.Deferred, BlendState.Opaque);

Nikich 01.06.2012 23:11

Ответ: Вопросы по XNA.
 
Ну-с, будем ждать ответа знающих, что они думают по этому поводу.

pax 01.06.2012 23:42

Ответ: Вопросы по XNA.
 
Сделайте задержку на пару секунд перед тестом в XNA, вероятно влияет начальная подгрузка библиотек Net Framework и т.д.

radiobutton 01.06.2012 23:47

Ответ: Вопросы по XNA.
 
Цитата:

Сообщение от pax (Сообщение 229214)
Сделайте задержку на пару секунд перед тестом в XNA, вероятно влияет начальная подгрузка библиотек Net Framework и т.д.

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

Nikich 02.06.2012 12:19

Ответ: Вопросы по XNA.
 
ППерепробывал все варианты в спрайтбатче, и задержку делал. Как ни крути Макс быстрее.
В общем, решился я на отчаянный шаг. На чем, говорите, велосипед изобретают? C++ + OpenGL/DirectX ?
Попробую сделать тоже самое, банальный вывод картинок, только на DirectX SDK, и посмотреть, будет ли отличаться результат. Кстати, сложно ли это будет, если я раньше не работал с плюсами?

radiobutton 02.06.2012 13:06

Ответ: Вопросы по XNA.
 
Основная нагрузка идет за счет шейдеров. То что ты напишеш на ДиректИкс будит все равно все отсылать данные на видео карту. А та в свою очередь применять шейдеры.

Цитата:

effect.CurrentTechnique = effect.Techniques["Textured"];
Matrix world = Matrix.Identity;// worldRotation* worldTranslation;
effect.Parameters["xWorldViewProjection"].SetValue(
world * camera.view * camera.projection);
effect.Parameters["xColoredTexture"].SetValue(texture);

foreach (EffectPass pass in effect.CurrentTechnique.Passes)
{
pass.Apply();
GraphicsDevice.DrawUserPrimitives<VertexPositionTe xture>
(PrimitiveType.TriangleStrip, verts, 0, 2);
}
Тоесть ты по сути перепишешь этот код только на С++ используя функции DirectX. Но этот код выполняется очень быстро и никакого прироста ты не получишь. А вот шейдеры:


Код:

float4x4 xWorldViewProjection;
Texture xColoredTexture;

sampler ColoredTextureSampler = sampler_state
{
        texture = <xColoredTexture> ;
        magfilter = LINEAR;
        minfilter = LINEAR;
        mipfilter = LINEAR;
        AddressU = mirror;
        AddressV = mirror;
};

struct VertexIn
{
    float4 position : POSITION;
};

struct VertexOut
{
    float4 Position : POSITION;
    float2 textureCoordinates : TEXCOORD0;
};

VertexOut VertexShaderFunction(VertexIn input)
{
    VertexOut Output = (VertexOut)0;
    Output.Position = mul(input.position,xWorldViewProjection);
    Output.textureCoordinates = normalize(input.position.xy);
    return Output;
}

float4 PixelShaderFunction(float2 texCoord: TEXCOORD0) : COLOR0
{
  float ang = atan2 (texCoord.x, texCoord.y);
  float rad = dot (texCoord, texCoord);

  return float4(0.5*(1 + sin (ang *20.0f )),0.5*cos(50.0f * ang),0.5*cos(60.0f),1);
};

technique Textured
{
    pass Pass0
    {
        VertexShader = compile vs_2_0 VertexShaderFunction(  );
        PixelShader = compile ps_2_0 PixelShaderFunction(  );
    }
}



Вот этот код (точнее некоторые функции внутри него, одна для вертексного, другая для пиксельного шейдера) выполняется, как минимум 4 раза для вертексного (ну у обычной картинки 4 вершины же) и 100*100 раз для пиксельного для картинки размером 100 на 100. Тоесть для каждого пикселя.

И если ты хочеш добиться лучшей проиводительности, то тебе нужно помаксимуму упростить код пиксельного шейдера. Тоесть вот эту хрень:
Код:

float4 PixelShaderFunction(float2 texCoord: TEXCOORD0) : COLOR0
{
  float ang = atan2 (texCoord.x, texCoord.y);
  float rad = dot (texCoord, texCoord);

  return float4(0.5*(1 + sin (ang *20.0f )),0.5*cos(50.0f * ang),0.5*cos(60.0f),1);
};

Ведь неизвестно, что прописано в том, что используется по умолчанию в XNA для вывода 2D картинок.

Поэтому лучше учи HLSL.

Nikich 02.06.2012 13:24

Ответ: Вопросы по XNA.
 
Хм. А можно как-нибудь посмотреть, как это в Максе сделано? Ведь там это дело быстрее, чем в XNA.
И еще. Раз вывод картинки все равно происходит благодаря шейдерам, то почему в Максе нельзя с ними работать?

radiobutton 02.06.2012 14:18

Ответ: Вопросы по XNA.
 
Цитата:

Сообщение от Nikich (Сообщение 229232)
Хм. А можно как-нибудь посмотреть, как это в Максе сделано? Ведь там это дело быстрее, чем в XNA.
И еще. Раз вывод картинки все равно происходит благодаря шейдерам, то почему в Максе нельзя с ними работать?

Цитата:

Давайте отвлечемся на минутку от игростроения и поговорим о языке высокоуровневых шейдеров - High Level Shader Language (HLSL). До появления XNA DirectX посылать свои инструкции графическому устройству с помощью механизма, называемого Fixed Function Pipeline (FFP). Но этот механизм работал для простых графических карт, но со временем сложность аппаратных ресурсов все больше возрастала. От FFP требовали соответствия возросшим возможностям аппаратного обеспечения.

Даже на современных видеокартах FFP применяется как шейдер. И по своему действию этот механизм похож на эффект BasicEffect.

Вместо того, чтобы продолжать расширять функционал FFP, в Microsoft решили предоставить возможность разработчиком напрямую взаимодействовать с аппаратными устройствами с помощью специально созданного для этих целей языка.
мб потому что макс использует ffp.

Nikich 02.06.2012 15:36

Ответ: Вопросы по XNA.
 
Нет, что-то не так.
В террарии, которая сделанна на XNA, у меня было 60 фпс. Когда я делал на максе Виво с видом сбоку, выдавало 80 фпс. Из моего теста следует, что при 100 картинках разница между максом и XNA в 300 фпс. В проектах же, картинок куда больше чем 100.Размеры картинок в Террарии и в Виво одни и те же(16х16). А значит, что проблема в чем-то другом.

radiobutton 02.06.2012 15:55

Ответ: Вопросы по XNA.
 
Цитата:

Сообщение от Nikich (Сообщение 229241)
Нет, что-то не так.
В террарии, которая сделанна на XNA, у меня было 60 фпс. Когда я делал на максе Виво с видом сбоку, выдавало 80 фпс. Из моего теста следует, что при 100 картинках разница между максом и XNA в 300 фпс. В проектах же, картинок куда больше чем 100.Размеры картинок в Террарии и в Виво одни и те же(16х16). А значит, что проблема в чем-то другом.

в XNA ограничение на фпс в 60 стоит же.:)

Nikich 02.06.2012 16:05

Ответ: Вопросы по XNA.
 
Так я его снял, чтобы проверить сколько фпс. Возможно я его не так снял:)

radiobutton 02.06.2012 16:15

Ответ: Вопросы по XNA.
 
Цитата:

Сообщение от Nikich (Сообщение 229243)
Так я его снял, чтобы проверить сколько фпс. Возможно я его не так снял:)

я на счет того что
Цитата:

В террарии, которая сделанна на XNA, у меня было 60 фпс.

Nikich 02.06.2012 16:21

Ответ: Вопросы по XNA.
 
Я это к тому, что разница должна быть больше чем на 300 фпс, а разница только на 20.
Так что вопрос еще актуален.

Nikich 03.06.2012 00:22

Ответ: Вопросы по XNA.
 
Хотя я подумал, пока что это не важно. Если меньше 60 выдавать будет, то буду переживать, а пока 2000 тоже хватит.
Появилась идея для игры. И тут как раз нужен шейдер.
У кого-нибудь есть пример самого простого шейдера для XNA? Например, шейдер, который будет цвет каждого пикселя делать ярче, или темнее.

Dream 03.06.2012 01:17

Ответ: Вопросы по XNA.
 
както вы странно тестите. вот сейчас запусти те два кода и фпс -
BlitzMax - ~1500
XNA - ~2300

Shaders - http://forums.create.msdn.com/forums/t/27849.aspx

по поводу разрешения экрана - GraphicsDevice.Adapter.CurrentDisplayMode
и не забываем - после операций сграфикосом или девайсом лучше сделать ApplyChanges

Nikich 03.06.2012 01:43

Ответ: Вопросы по XNA.
 
А картинки какие брал?
UPD
Сегодня я кое-что вспомнил. В Максе ведь есть команды GetPixel WritePixel. А значит, на нем можно писать пиксельные шейдеры?

radiobutton 03.06.2012 14:16

Ответ: Вопросы по XNA.
 
Цитата:

Сообщение от Nikich (Сообщение 229299)
А картинки какие брал?
UPD
Сегодня я кое-что вспомнил. В Максе ведь есть команды GetPixel WritePixel. А значит, на нем можно писать пиксельные шейдеры?

Нет. Шейдеры обрабатываются в графическом процессоре, который специально организован чтобы выполнять операции с векторами за 1 такт.
А те команды что ты привел больше похожи на обычные вин апи функции, которые очень долгие:)

moka 03.06.2012 17:55

Ответ: Вопросы по XNA.
 
Цитата:

Сообщение от radiobutton (Сообщение 229321)
Нет. Шейдеры обрабатываются в графическом процессоре, который специально организован чтобы выполнять операции с векторами за 1 такт.
А те команды что ты привел больше похожи на обычные вин апи функции, которые очень долгие:)

Т.к. выполняются на уровне CPU. И не имеют того конвеера который имеет шейдер, для интерполяции данных и т.п.

Nikich 03.06.2012 22:30

Ответ: Вопросы по XNA.
 
Е-е-е. Видимо я нашёл в чем была проблема. Скорее всего, это было связано с тем, что я всё время создавал новый вектор2.

new Vector2(player_position.X + i * 256, player_position.Y + i1 * 256)

Это строчка работает крайне медленно. Сейчас решил вывести всё в нулевых координатах. Результат - XNA превосходит Макс на 40 фпс.
Но это привело к следующий проблеме: так как тогда выводить картинки? Есть ли какая-нибудь замена вектор2?

radiobutton 03.06.2012 23:02

Ответ: Вопросы по XNA.
 
Цитата:

Сообщение от Nikich (Сообщение 229367)
Е-е-е. Видимо я нашёл в чем была проблема. Скорее всего, это было связано с тем, что я всё время создавал новый вектор2.

new Vector2(player_position.X + i * 256, player_position.Y + i1 * 256)

Это строчка работает крайне медленно. Сейчас решил вывести всё в нулевых координатах. Результат - XNA превосходит Макс на 40 фпс.
Но это привело к следующий проблеме: так как тогда выводить картинки? Есть ли какая-нибудь замена вектор2?

Не хочу разочеровывать, но Vector2.Zero это тоже самое, что new Vector2(0,0) :-D

Мб вся проблема в том, что в максе те картинки что ты рисуешь за экраном просто не рисуются?:)

Vector2 это структура, тоесть тип значения. Что может быть еще быстрее хз. А выделение памяти для 2 переменных типа float происходит так быстро что ппц.

Nikich 03.06.2012 23:08

Ответ: Вопросы по XNA.
 
Нет. Оно не рисуется не в XNA, не в Max'e. Это легко заметить, если выдвинуть картинки за экран - фпс увеличивается в разы.

Nikich 03.06.2012 23:21

Ответ: Вопросы по XNA.
 
Э-э-э. Что за чушь?! Поменял
Код:

sprites.Begin(SpriteSortMode.Immediate, BlendState.Opaque)
; на
Код:

sprites.Begin();
и фпс стало 400. Раньше было 100. В максе 153.
Ой, что-то я совсем запутался.
UPD:
SpriteSortMode.Immediate - ВРАГ. SpriteSortMode.Deferred - ДРУГ.
Теперь всё стало на свои места.



------------

radiobutton 04.06.2012 00:01

Ответ: Вопросы по XNA.
 
Цитата:

Сообщение от Nikich (Сообщение 229374)
Э-э-э. Что за чушь?! Поменял

Цитата:

Deferred: спрайты не отображаются до вызова SpriteBatch.End. Затем все вызовы направляются на графическое устройство в том порядке, в каком они были сделаны. В этом режиме многочисленные объекты SpriteBatch могут проводить вызовы Draw без конфликтов друг с другом. (Это режим по умолчанию.)
Immediate: метод Begin сразу же после вызова устанавливает настройки для графического устройства, а новые вызовы Draw сразу же выводят спрайты на экран. Но только один объект SpriteBatch может быть активен в данное время. Это самый быстрый режим
Правда тут опечатка скорее всего. ) самый медленный. у меня он тоже в 2-3 раза меньше фпс выдает.

pax 04.06.2012 00:13

Ответ: Вопросы по XNA.
 
Тут имеется ввиду то, что в режиме Immediate спрайты выводятся сразу, а не при вызове метода End. Смысл в том, что в этом режиме будет столько вызовов рисования, сколько вызовов Draw. А в других режимах вывод графики будет отсортирован и выведен за меньшее число DIP'ов. В приведенном случае может быть всего один DIP, т.е. текстура всего одна. Но есть один минус сортировок не в "ручную" - вывод графики может быть не в том порядке, в котором был вызов Draw. Например если на экране рисовались две картинки чередуясь, то при сортировке могут сначала вывестись все вызовы первой картинки, потом все вызовы второй, что будет не правильно, если надо было вывести картинки чередуясь. Поэтому выбирать тот или иной режим надо от ситуации. Чаще лучше разделить вывод графики на экран на слои, чтобы добиться высокой производительности. Так же снизить число DIP'ов можно используя атласы, когда рисуются части одной и той же текстуры, но текстура например всего одна.

radiobutton 04.06.2012 16:04

Ответ: Вопросы по XNA.
 
Цитата:

Данный процесс называется отсечение по пирамиде видимости, так как в данном случае мы проверяем, пересекается ли ограничивающая сфера объекта с пирамидой видимости, и если сфера не пересекается, то мы отсекает объект (то есть не отрисовываем его на экране). Стоит заметить, что этот метод не всегда является действенным - например, если мы отрисовываем множество мелких объектов, то на подобное отсечение мы можем и не тратить время, так как видеокарта итак не будет обрабатывать пиксели, которые находятся вне экрана.
Теперь собственно вопрос.
Вот скажем посылаем мы на видео карту объект какой нить. (Пускай будит Куб)
И этот куб не входит в зону видимости камеры. (ну за экраном он.)
Вершины этого объекта пройдут вершинный шейдер. И пиксельный?
На какой стадии определится что не нужно его будит рисовать?

Для мелких объектов не нужно делать проверку потому что эта проверка займет больше времени чем передача вершин этого объекта видеокарте и дальнейший проход по шейдерам?
Или же он пройдет вершинный шейдер, увидит что координаты получаются скажем 1025 500 (и остальные вершины куба тоже за экраном), поймет что Весь куб за экраном и не пошлет ничего в пиксельный шейдер?

Nikich 05.06.2012 17:18

Ответ: Вопросы по XNA.
 
У меня вопрос возник. Кто-нибудь качал исходной код, прилагающийся к книге 3D Graphics with XNA Game Studio 4.0? У меня большая часть не работает, с ошибкой : "Cannot find importer "FbxImporter". Не знаете, с чем это может быть связано?

Dream 05.06.2012 20:15

Ответ: Вопросы по XNA.
 
не хватает проекта "FbxImporter" или он не подключен к проекту

Nikich 05.06.2012 20:48

Ответ: Вопросы по XNA.
 
Такого проекта нету и не должно быть. В обучение ничего про него не говорится.

Dream 05.06.2012 20:55

Ответ: Вопросы по XNA.
 
точно, он должен идти уже с XNA. посмотри версии какие используются в референсах проектов, возможно у тебя другая версия установлена. поудаляй референсы на пеплайны и подобавляй по новой

Nikich 06.06.2012 13:57

Ответ: Вопросы по XNA.
 
Спасибо!
После прочтения этой книги, стало ясно, что она направлена на шейдеры и графон, а не на основы создания 3Д игр. В связи с этим, возникло много вопросов. И вот первый из них: как сделать коллизии?

Dream 06.06.2012 14:14

Ответ: Вопросы по XNA.
 
ну, примитивные колизии - есть классы BoundingBox и BoundingSphere у них есть методы для получения пересечений и всё такое. если чтото сложнее - то всё также как и в любом другом движке - писать своё или использовать уже готовые физ движки

Nikich 06.06.2012 14:43

Ответ: Вопросы по XNA.
 
Спасибо.
А вот например, если у меня есть модель комнаты с дверным проемом, то как сделать так, чтобы я мог попасть в эту комнату? Ведь если создать только один BoundingBox, то внутрь я пройти не смогу. Надо создавать по отдельному BoundingBox на каждую стену?
И еще кое-что. Как делают физику для ступенек? То есть чтобы объект мог подниматься и опускаться по ступенькам.

Dream 06.06.2012 20:06

Ответ: Вопросы по XNA.
 
Цитата:

Сообщение от Nikich (Сообщение 229611)
Спасибо.
А вот например, если у меня есть модель комнаты с дверным проемом, то как сделать так, чтобы я мог попасть в эту комнату? Ведь если создать только один BoundingBox, то внутрь я пройти не смогу. Надо создавать по отдельному BoundingBox на каждую стену?

если использоваться только те примитивы - то да, подругому ни как.
Цитата:

Сообщение от Nikich (Сообщение 229611)
И еще кое-что. Как делают физику для ступенек? То есть чтобы объект мог подниматься и опускаться по ступенькам.

- Если написать такуие примитивные колизии как у блица(там действительно всё очень примитивно) то будет и на небольшие ступеньки вылазить будет и в стены колизится.
Опятьже, повторяюсь - Bounding обьекты XNA не препятствуют ничем(да и как они могут то?) они просто дадут знать есть ли колизии с другими обьектами. не больше не меньше

Nikich 06.06.2012 22:20

Ответ: Вопросы по XNA.
 
Ясно.
Ступени, как я понял, дело вообще проблематичное. Это ведь придётся на каждую ступеньку BoundingBoх свой делать.
Очень интересно, как это в блитце сделали коллизии с объектами произвольной формы, ведь там любую модель загрузить можно, и коллизии правильно работать будут.

pax 07.06.2012 14:44

Ответ: Вопросы по XNA.
 
К XNA подключаются некоторые физические движки без особых проблем. Можно использовать их для определения коллизий.
Вот например http://bepuphysics.codeplex.com/

RegIon 08.06.2012 14:38

Ответ: Вопросы по XNA.
 
Баг:
Каждый ран приложения на XNA вызывает ошибку, библиотека MS C++ 2008 стоит,.NET 4 тоже:
Код:

APPCRASH
  Имя приложения:    WindowsGame1.exe
  Версия приложения:    1.0.0.0
  Отметка времени приложения:    4fc8e4c9
  Имя модуля с ошибкой:    KERNELBASE.dll
  Версия модуля с ошибкой:    6.1.7600.16385
  Отметка времени модуля с ошибкой:    4a5bdaae
  Код исключения:    e0434352
  Смещение исключения:    00009617
  Версия ОС:    6.1.7600.2.0.0.256.1
  Код языка:    1049
  Дополнительные сведения 1:    0a9e
  Дополнительные сведения 2:    0a9e372d3b4ad19135b953a78882e789
  Дополнительные сведения 3:    0a9e
  Дополнительные сведения 4:    0a9e372d3b4ad19135b953a78882e789

Почему?

Dream 08.06.2012 15:32

Ответ: Вопросы по XNA.
 
Цитата:

Сообщение от Костян (Сообщение 229817)
Баг:
Каждый ран приложения на XNA вызывает ошибку, библиотека MS C++ 2008 стоит,.NET 4 тоже:
Код:

APPCRASH
  Имя приложения:    WindowsGame1.exe
  Версия приложения:    1.0.0.0
  Отметка времени приложения:    4fc8e4c9
  Имя модуля с ошибкой:    KERNELBASE.dll
  Версия модуля с ошибкой:    6.1.7600.16385
  Отметка времени модуля с ошибкой:    4a5bdaae
  Код исключения:    e0434352
  Смещение исключения:    00009617
  Версия ОС:    6.1.7600.2.0.0.256.1
  Код языка:    1049
  Дополнительные сведения 1:    0a9e
  Дополнительные сведения 2:    0a9e372d3b4ad19135b953a78882e789
  Дополнительные сведения 3:    0a9e
  Дополнительные сведения 4:    0a9e372d3b4ad19135b953a78882e789

Почему?

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

RegIon 08.06.2012 16:21

Ответ: Вопросы по XNA.
 
Я тупо скачал файлик с темы, запустил его и ошибка...я не пишу на XNA, откуда обычный смертный должен знать был что нужно для этого??

moka 08.06.2012 16:39

Ответ: Вопросы по XNA.
 
Цитата:

Сообщение от Костян (Сообщение 229830)
Я тупо скачал файлик с темы, запустил его и ошибка...я не пишу на XNA, откуда обычный смертный должен знать был что нужно для этого??

Программирование - не для простых смертных..

RegIon 08.06.2012 17:59

Ответ: Вопросы по XNA.
 
Цитата:

Сообщение от MoKa (Сообщение 229832)
Программирование - не для простых смертных..


Ну блин если писать программу, то по твоей логике её должны использовать только программисты??
Нет, тогда почему если задают вопрос от лица "ЮЗЕРА", который, предположим,тупой нуб, ему, понятно для него, не отвечают?


Часовой пояс GMT +4, время: 04:33.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot