标签: directdraw

我认为*.DDS文件意味着可以快速加载?

好吧,所以我试图权衡使用各种不同纹理压缩技术的专业人士和骗子.我花了99.999%的时间使用DirectX为Windows机器编写2D精灵游戏.

到目前为止,我已经看了纹理打包(SpriteSheets)与alpha修剪,这似乎是获得更多性能的好方法.现在我开始看看它们存储的纹理格式; 目前所有内容都存储为*.PNGs.

我听说*.DDS文件很好,尤其是当与DXT5(/ 3/1取决于任务)压缩一起使用时,因为纹理在VRAM中保持压缩状态?还有人说,因为它们已经是DirectDraw Surfaces,所以它们加载的速度也快得多.

所以我创建了一个应用程序来测试它; 我将该行调用20次以下,在每次调用之间释放纹理.

    for (int i = 0; i < 20; i++)
 {
  if( FAILED( D3DXCreateTextureFromFile( g_pd3dDevice, L"Test.dds", &g_pTexture ) ) )
  {
   return E_FAIL;
  }

  g_pTexture->Release();
  g_pTexture = NULL;
 }
Run Code Online (Sandbox Code Playgroud)

现在,如果我尝试使用DXT5纹理,它需要比在简单的*.PNG中加载要长5倍.我听说如果你不生成Mipmap,它会变慢,所以我仔细检查了一下.然后我改变了我用来生成*.DDS文件的程序,切换到NVIDIA自己的nvcompress.exe,但没有任何效果.

编辑:我忘了提到文件(*.png和*.dds)都是相同的图像,只是以不同的格式保存.(相同大小,alpha数量,一切!)

编辑2:当使用以下参数时,它的加载速度提高了近2.5倍,并且消耗的VRAM少了很少!

 D3DXCreateTextureFromFileEx( g_pd3dDevice, L"Test.dds", D3DX_DEFAULT_NONPOW2, D3DX_DEFAULT_NONPOW2, D3DX_FROM_FILE, 0, D3DFMT_FROM_FILE, D3DPOOL_MANAGED, D3DX_FILTER_NONE, D3DX_FILTER_NONE, 0, NULL, NULL, &g_pTexture )
Run Code Online (Sandbox Code Playgroud)

但是,我现在正在失去纹理的所有透明度,我看了DXT5纹理,它在Paint.NET和DirectX DDS Viewer中看起来很好.但是当装入所有透明度时变成纯黑色.ColorKey问题?

编辑3:忽略最后一点,我是愚蠢的,在我的"快速示例"中,我忘了在D3DXSprite-> Begin()上启用Alpha-Blending.卫生署!

compression directx textures directdraw dds-format

4
推荐指数
1
解决办法
5964
查看次数

在OpenGL中加载DDS DXT1,崩溃

我的代码有什么问题吗?当我执行glCompressedTexImage2D()时程序崩溃(来自Windows XP崩溃消息的东西...)

我试图加载没有mipmap的DDS图像,图像格式是DDS DXT1

我错过了一些包含文件,或者我做错了什么?我从以下网址下载了包含的文件:http: //sourceforge.net/projects/glew/files/glew/1.5.1/glew-1.5.1-win32.zip/download

我在与.exe相同的文件夹中有glew32.dll.

下面的代码只有我更改的部分才能加载DDS图像:

#pragma comment(lib, "glew32.lib")
#include <GL\glew.h>
#include <GL\gl.h>


...


typedef struct {
    GLuint dwSize;
    GLuint dwFlags;
    GLuint dwFourCC;
    GLuint dwRGBBitCount;
    GLuint dwRBitMask;
    GLuint dwGBitMask;
    GLuint dwBBitMask;
    GLuint dwABitMask;
} DDS_PIXELFORMAT;

typedef struct {
    GLuint dwMagic;
    GLuint dwSize;
    GLuint dwFlags;
    GLuint dwHeight;
    GLuint dwWidth;
    GLuint dwLinearSize;
    GLuint dwDepth;
    GLuint dwMipMapCount;
    GLuint dwReserved1[11];
    DDS_PIXELFORMAT ddpf;
    GLuint dwCaps;
    GLuint dwCaps2;
    GLuint dwCaps3;
    GLuint dwCaps4;
    GLuint dwReserved2;
} DDS_HEADER;

DDS_HEADER DDS_headers;


...


FILE …
Run Code Online (Sandbox Code Playgroud)

c++ opengl directdraw dds-format

2
推荐指数
1
解决办法
5166
查看次数

DirectX9,DirectDraw,优化?

首先,我正在编写游戏.目前在渲染功能中有两个不同函数的调用.一个呈现一些文本,一个呈现精灵.

在我的电脑上(AMD Phenom(TM)II X4 955处理器(4个CPU),~3.2GHz,4096MB RAM DDR2,NVIDIA GeForce GTX 285)当渲染大约200个精灵和大约100 FPS时,我的渲染速度约为2200 FPS渲染约14,500.

我正在使用向量来存储我正在渲染的每个对象的信息,并使用一个具有许多绘制调用的精灵.

VS2008发布模式,完全优化了C++.我知道我听说过左右不要过早地进行优化,但是在这一点上,它对我来说非常好,但在某些计算机上并不是那么好.

我无法想象为数组改变向量,因为我以不确定的方法每帧推动和拉动向量.几乎是随机的.

我尝试了浮动和双打,速度也没有什么不同.

使用DirectDraw而不是DirectX和Sprite Render方法会有所不同吗?由于我不知道DirectDraw和DirectX之间的区别,我不是100%我应该考虑的事情.

游戏在普通计算机上运行良好,但我比较我的游戏是东方.在我试过的最弱的电脑上,东方以60 FPS的速度运行,但我的游戏速度不会超过36~42 FPS.我无法想象我做错了什么,对DirectX和C++这么新.

在这个问题上的任何帮助都会很棒,不幸的是,我不会在一段时间内添加信息或回答问题.

c++ directx optimization directdraw

2
推荐指数
1
解决办法
1513
查看次数

错误LNK2001:未解析的外部符号_IID_IDirectDraw2

我使用一些使用直接绘制的遗留代码,我处于相当尴尬的境地.不久前我已更新我的系统,不得不适应新的情况(加载ddraw.dll),一切正常.今天我探索了另一个传统的解决方案,它也使用了我已经改变的类(文件),但我坚持上面提到的链接错误.我检查并比较了项目属性,他们缝得很好.

这是directX初始化的代码,"麻烦"的代码是粗体.

 typedef int (__stdcall *DirectDrawCreateFunc)(GUID FAR* a ,LPDIRECTDRAW FAR* b, IUnknown FAR* c);

    /* init_directx:
     *  Low-level DirectDraw initialization routine.
     */
    int CDCUtils::init_directx(HWND allegro_wnd)
    {
       LPDIRECTDRAW directdraw1;
       HRESULT hr;
       LPVOID temp;
       HINSTANCE ddraw = LoadLibrary("%WINDIR%\system32\ddraw.dll");
       if(ddraw== NULL)
       {
           return -1;
       }
       _ddrawLib =ddraw;
    DirectDrawCreateFunc ddFunc = (DirectDrawCreateFunc)GetProcAddress(ddraw,"DirectDrawCreate");
    if(ddFunc)
    {
     /* first we have to set up the DirectDraw1 interface... */
       hr = ddFunc(NULL, &directdraw1, NULL);
       if (FAILED(hr))
          return -1;
    }

       ///* first we have to set up the DirectDraw1 …
Run Code Online (Sandbox Code Playgroud)

c++ linker directdraw

2
推荐指数
1
解决办法
5960
查看次数

从 IWICBitmapSource、IWICBitmap、IWICBitmapDecoder 获取位图 BitsPerPixel(无论在何处)

我想主题已经说明了一切。但在一些细节上,我正在加载、操作、然后显示位图,并且是在 GDI 中完成的。现在我想增加一些速度,因为它反复发生。

许多年前,我将 DirectX 用于其他用途,但我所看到的一切都表明要摆脱 DirectX,转向 Direct2D。所以是时候扔掉所有这些知识并重新开始了。真正的 MS 方式;-)

好吧,为了操作位图,在进行渲染之前,我发现可以使用“Lock()”来获取它。界面上的功能也会告诉我尺寸。但我还需要了解 BBP,并跨步。

在有人说“你为什么不使用 ::GetBBP()... DUH”之前,经过数小时的 MSDN 和其他来源搜索后,我一直无法远程找到类似的东西。还有很多非常令人困惑的 COM 接口。

我唯一能找到的是 GetPixelFormat(),它返回一个 GUID,然后我编写大约 150 个“if (...)”语句来比较它。这样我就可以测试它的三个值,如果不是其中一个值则拒绝(1,8,32),这几乎不是处理这个问题的有效方法。

GetPixelFormat() 也不告诉我步幅。

有没有办法做到这一点?

(位图也是未压缩的,所以我什至不需要通过 IWICBitmapDecoder 运行它们,但我还没有弄清楚如何简单地告诉 IWICBitmap“这是一个 blob,将其用作大小为 xy 的位图”)

感谢您的任何帮助。

-斯科特

bitmap directdraw direct2d

2
推荐指数
1
解决办法
2354
查看次数

你如何在DirectX 12中绘制文本?

这是如何在DirectX 11中绘制文本的后续问题

在Direct3D-12中,事情变得更加复杂,因为它是新的,我无法在线找到任何合适的库.

我正在构建一个基本的Direct3D12 FPS测试应用程序,我喜欢用我的渲染图像在屏幕上显示FPS数据.

directdraw directx-12 direct3d12

1
推荐指数
1
解决办法
3660
查看次数