青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

戰(zhàn)魂小筑

討論群:309800774 知乎關(guān)注:http://zhihu.com/people/sunicdavy 開(kāi)源項(xiàng)目:https://github.com/davyxu

   :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
  257 隨筆 :: 0 文章 :: 506 評(píng)論 :: 0 Trackbacks

#

本人的設(shè)計(jì)圖可以方便在文本編輯器里查看(>為派生 +為包含)

MAX插件導(dǎo)出的模型資源分:Mesh/Skin, Skeleton, Animation

不同動(dòng)作按照不同的動(dòng)畫文件保存

 

ResourceHandle 包含基本id
        >NamedResourceHandle 帶有名稱資源,包含hashA, hashB, 使用暴雪hash函數(shù)生成
        >ModelHandle       
        >MeshHandle           
        >SkeletonHandle       
        >AnimationHandle

獲取資源,如果資源不存在時(shí),自動(dòng)加載
ModelMaster.ManualCache( &ModelHandle )

直接資源訪問(wèn):
RawSkeleton = ModelMaster.ManualCache( &SkeletonHandle("a.skl") )
RawSkeleton->GetMarker(...)

異步資源加載,異步id保存于ModelHandle中,在callback中根據(jù)id確認(rèn)
ModelMaster.AsyncCache( &ModelHandle )

獲取資源指針,未加載時(shí),返回空
ModelResource = ModelMaster.Fetch( &ModelHandle )

模型資源加載器
    在模型句柄中綁定對(duì)應(yīng)加載器
    可以自行編寫帶換裝的ModelLoader,通過(guò)讀取自己的配置文件,自行加載資源后生成RawModel
ModelLoader
    ModelHandle         ---mapping--->    ModelLoader         ---generate--> RawModel
    MeshHandle          ---mapping--->    MeshLoader             ---generate--> RawMesh
    SkeletonHandle     ---mapping--->    SkeletonLoader      ---generate--> RawSkeleton
    AnimationHandle    ---mapping--->    AnimationLoader   ---generate--> RawAnimation

引用計(jì)數(shù)類   
ModelResource
    >RawModel
    >RawMesh
    >RawSkeleton
    >RawAnimation

RawModel中不保留Handle,只保留指針
RawModel
    +MeshVB    從模型文件中直接讀取頂點(diǎn)格式,包含 靜態(tài),GPU,CPU類型頂點(diǎn)
        +RawMesh
        +MeshIB        一次性填充IB
        >GPUMeshVB    一次性填充VB
        >CPUMeshVB    每幀計(jì)算
    +Animation            運(yùn)行期數(shù)據(jù)(時(shí)間/幀)
        +RawAnimation    原始動(dòng)畫內(nèi)容
    +Skeleton
        +RawSkeleton

posted @ 2010-03-12 16:13 戰(zhàn)魂小筑 閱讀(2009) | 評(píng)論 (0)編輯 收藏

1. System::String 轉(zhuǎn)換到 const wchar_t*

 
   1:  const wchar_t* ToUnmanagedUnicode( System::String^ str )
   2:  {
   3:      pin_ptr<const WCHAR> nativeString1  = PtrToStringChars( str );
   4:      return (const wchar_t*)nativeString1;
   5:  }

 

2.  const wchar_t* / const char* 轉(zhuǎn)換到 System::String

   1:  const wchar_t* p= L"hello";
   2:   
   3:  System::String( p ).ToString();

 

3.  C++數(shù)值類型轉(zhuǎn)CLR數(shù)值類型

   1:  int a;
   2:   
   3:  System::Int32 b = System::Int32( a );

 

4. HWND 轉(zhuǎn)為IWin32Window

   1:  public ref class WindowWrapper : System::Windows::Forms::IWin32Window
   2:  {
   3:      public: WindowWrapper(IntPtr handle)
   4:      {
   5:          _hwnd = handle;
   6:      }
   7:   
   8:  public:
   9:      property IntPtr Handle
  10:      {
  11:          virtual IntPtr get(void){return _hwnd;};
  12:      };
  13:   
  14:      private: IntPtr _hwnd;
  15:  };
  16:   
  17:  HWND nativehwnd;
  18:  IWin32Window^ w = gcnew Managed::WindowWrapper( System::IntPtr( nativehwnd ) );
posted @ 2010-03-11 09:37 戰(zhàn)魂小筑 閱讀(3389) | 評(píng)論 (0)編輯 收藏

Direct3D中的Shader是這樣的:

1. ASM Shader是最元老的也是DX8主要使用Shader

2. fxc編譯器可以同時(shí)編譯ASM,HLSL和fx腳本,其中HLSL和fx可以查看編譯后的GPU匯編代碼

3. D3D9中,fx是HLSL的一種渲染腳本,簡(jiǎn)化了HLSL設(shè)置及常量綁定,并且附帶RenderStateBlock及設(shè)置

但只能用于制作簡(jiǎn)單的Shader

4. DirectXSDK中有一個(gè)概念混淆:C++例子中的BasicHLSL使用的其實(shí)還是fx,HLSLwithoutEffects例子才是真正的純HLSL

5.fx與HLSL程序鑒別:

使用fx程序必定含有:D3DXCreateEffectXXX 系列函數(shù), ID3DXEffect對(duì)象,渲染中能看到SetTechnique,BeginPass,EndPass之類的字眼

使用純HLSL程序含有:D3DXCompileShader,ID3DXConstantTable對(duì)象,GetConstantByName,GetConstantDesc之類的字眼

6. 在fx中包含有 VertexShader,PixelShader代碼及profile,entry,RenderState設(shè)置及簡(jiǎn)單的繪制過(guò)程(pass)。一次編譯后,VS,PS,Texture,Sampler及常量都是在ID3DXEffect對(duì)象中自動(dòng)完成,無(wú)需手動(dòng)設(shè)置。

7. HLSL可以將VS及PS代碼寫入1個(gè).hlsl文件。注意,以下這種代碼可以在HLSL中編譯過(guò),但實(shí)際沒(méi)有任何效果

   1:  sampler_state
   2:  {
   3:      Texture = <tex>;
   4:      MipFilter = LINEAR;
   5:      MinFilter = LINEAR;
   6:      MagFilter = LINEAR;
   7:  };

這點(diǎn)可以參考AMD RenderMonkey中只在shader中使用sampler而忽略texture。

8. fx中往shader設(shè)置紋理使用的是ID3DXBaseEffect::SetTexture下的這個(gè)函數(shù)

   1:  HRESULT SetTexture(
   2:    D3DXHANDLE hParameter,
   3:    LPDIRECT3DBASETEXTURE9 pTexture
   4:  );

但是在HLSL中,這點(diǎn)就變得很麻煩,需要手動(dòng)設(shè)置,可以參考這篇文章

Shader代碼片段:

   1:  sampler Samp0 = sampler_state
   2:  {
   3:      Texture = <Tex0>;
   4:      MipFilter = LINEAR;
   5:      MinFilter = LINEAR;
   6:      MagFilter = LINEAR;
   7:  };

編譯HLSL代碼后得到ConstantTable,然后取出句柄:

   1:  ScalarHandle = pixelConstTable->GetConstantByName(0, "Scalar");
   2:   
   3:  Samp0Handle = pixelConstTable->GetConstantByName(0, "Samp0");
   4:   
   5:  Samp1Handle = pixelConstTable->GetConstantByName(0, "Samp1");

再?gòu)木浔〕鰏ymbol的描述:

   1:  UINT count;
   2:   
   3:  pixelConstTable->GetConstantDesc(Samp0Handle, & Samp0Desc, &count);
   4:   
   5:  pixelConstTable->GetConstantDesc(Samp1Handle, & Samp1Desc, &count);

通過(guò)上面的描述,將紋理變量的寄存器偏移作為紋理的stage

8.  優(yōu)化常量設(shè)置速度的方法一般就是根據(jù)字符串取出句柄,以后每次渲染時(shí),只通過(guò)句柄設(shè)置。但I(xiàn)D3DXConstantTable最后還是通過(guò)

IDirect3DDevice9::SetPixelShaderConstantX 系列函數(shù)來(lái)實(shí)現(xiàn)的

   1:  HRESULT SetPixelShaderConstantF(
   2:    UINT StartRegister,
   3:    CONST float * pConstantData,
   4:    UINT Vector4fCount
   5:  );

9. HLSL將一段包含VS和PS代碼編譯完成后,將得到VS和PS兩個(gè)單獨(dú)的ID3DXConstantTable

posted @ 2010-03-05 14:26 戰(zhàn)魂小筑 閱讀(3319) | 評(píng)論 (0)編輯 收藏

 

最近在寫D3D9模擬D3D10接口的渲染系統(tǒng)中碰到大量的渲染狀態(tài)對(duì)象,不僅成員多,枚舉也多的要命。

 

    struct CORE_API RasterizerState : ResourceHandle            
    {
        eFillMode            mFillMode;        
        eCullMode            mCullMode;
        bool                mFrontFaceCCW;
        float                mDepthBias;
        float                mSlopeScaledDepthBias;
        bool                mDepthClipEnable;
        bool                mScissorEnable;
        bool                mMultisampleEnable;

        RasterizerState();
    };

而要從配置文件中讀取數(shù)據(jù)并填充到這個(gè)結(jié)構(gòu)體,對(duì)于C++來(lái)說(shuō)完全就是吃力不討好的,寫出來(lái)的代碼也是極為過(guò)程,修改和擴(kuò)展極為麻煩的。

因此決定使用反射的方法來(lái)填充數(shù)據(jù),先總結(jié)一下我的C++反射系統(tǒng)

class RTTIObject // 動(dòng)態(tài)類型識(shí)別對(duì)象基類,對(duì)象通過(guò)一些宏后可以很方便的通過(guò)字符串創(chuàng)建出類實(shí)例,并且可以查詢注冊(cè)時(shí)的類型和其他綁定信息
class NameRef  // 名字表,類似于虛幻中的FName,可以定義Const和普通Name,比較和拷貝只是一個(gè)dword耗費(fèi)的時(shí)間
value_parse,value_tostring,value_typename // 一系列類型模板函數(shù),提供對(duì)類型的ToString,Parse及類型名查詢

 

首先需要處理的是枚舉查詢,這里將枚舉通過(guò)宏做成一個(gè)個(gè)枚舉對(duì)象,并可以通過(guò)名字創(chuàng)建實(shí)例

#define DECLARE_ENUMOBJECT( TEnum ) \
    struct EnumObject_##TEnum : EnumObject\
    {\
    DECLARE_RTTIOBJECT( EnumObject_##TEnum );\
    EnumObject_##TEnum( );\
    };


#define IMPLEMENT_ENUMOBJECT_BEGIN( TEnum, TEnum_prefixoffset, TMember_prefixoffset ) \
    IMPLEMENT_RTTIOBJECT_STRING( EnumObject_##TEnum, #TEnum + TEnum_prefixoffset, #TEnum + TEnum_prefixoffset, "EnumObject" )\
    EnumObject_##TEnum::EnumObject_##TEnum(){ const int member_prefixoffset = TMember_prefixoffset;

#define ENUMOBJECT_ADD( enumkey ) AddMember( #enumkey + member_prefixoffset, (dword)enumkey );

#define IMPLEMENT_ENUMOBJECT_END }

#define ENUMOBJECT_STATICINIT( TEnum ) EnumObject_##TEnum::StaticInit();

EnumObject 中通過(guò)宏將枚舉的名稱和值保存在這個(gè)對(duì)象中

IMPLEMENT_ENUMOBJECT_BEGIN( eFillMode, 1, 3 )  // 這里的1,3是將eFillMode及FM_Point轉(zhuǎn)成字符串后去掉前綴
    ENUMOBJECT_ADD( FM_Point )
    ENUMOBJECT_ADD( FM_Line )
    ENUMOBJECT_ADD( FM_Fill )
IMPLEMENT_ENUMOBJECT_END

// 注冊(cè)到RTTIObject系統(tǒng)

ENUMOBJECT_STATICINIT( eFillMode )

 

// 通過(guò)枚舉對(duì)象可以查找到字符串對(duì)應(yīng)的值
dword v;
EnumObject::GetEnumValue( "FillMode", "Point", v )



下一步是將結(jié)構(gòu)體成員信息記錄

    void SettingObject::BindMember( const NameRef& objname, void* instancePtr, void* dataPtr, SettingProxy* proxy )
    {
        proxy->mOffset = dword(dataPtr) - dword(instancePtr);

        MemberList& memberlist = mSettingMap[ objname ];
        memberlist[ proxy->mName ] = proxy;
    }

這里記錄的是結(jié)構(gòu)體成員的內(nèi)存偏移

使用大量的宏,可以讓結(jié)構(gòu)體綁定變得漂亮

#define BIND_SETTINGOBJECT_BEGIN( TClass ) \
    { const NameRef& soname = TClass::StaticGetClassInfo()->mClassName;TClass soobj;

#define BIND_SO_MEMBER( TMemberType, TMember ) \
    so.BindMember( soname, &soobj, &soobj.TMember, new TSettingElement<TMemberType>(#TMember + 1 ) );

#define BIND_SO_MEMBER_NAME( TMemberType, TMember, TName ) \
    so.BindMember( soname, &soobj, &soobj.TMember, new TSettingElement<TMemberType>(TName) );

#define BIND_SO_ENUM( TEnumType, TMember ) \
    so.BindMember( soname, &soobj, &soobj.TMember, new TSettingEnum(#TMember + 1, #TEnumType + 1) );

#define BIND_SO_ENUM_NAME( TEnumType, TMember, TName ) \
    so.BindMember( soname, &soobj, &soobj.TMember, new TSettingEnum(TName, #TEnumType + 1) );

#define BIND_SETTINGOBJECT_END }

綁定代碼如下

        BIND_SETTINGOBJECT_BEGIN( RasterizerState )
            BIND_SO_ENUM    ( eFillMode    , mFillMode )
            BIND_SO_ENUM    ( eCullMode    , mCullMode )
            BIND_SO_MEMBER    ( bool        , mFrontFaceCCW )
            BIND_SO_MEMBER    ( float        , mDepthBias )
            BIND_SO_MEMBER    ( float        , mSlopeScaledDepthBias)
            BIND_SO_MEMBER    ( bool        , mDepthClipEnable)
            BIND_SO_MEMBER    ( bool        , mScissorEnable)
            BIND_SO_MEMBER    ( bool        , mMultisampleEnable)
        BIND_SETTINGOBJECT_END

 

所有結(jié)構(gòu)體的信息被記錄在SettingObject中,讀取配置文件填充結(jié)構(gòu)體的任務(wù)就變得異常的簡(jiǎn)單了

    SettingObject settings;
// 將所有的結(jié)構(gòu)體信息記錄
    InitRenderStateObjectSetting( settings );

    const NameRef& rzname = DepthStencilState::StaticGetClassInfo()->mClassName;

    DepthStencilState a;
 // 這里就是將配置文件的信息填充到結(jié)構(gòu)體
    settings.SetMember( rzname, &a, "BackFace.StencilFunc", "Equal" );
 
posted @ 2010-02-26 17:58 戰(zhàn)魂小筑 閱讀(2549) | 評(píng)論 (0)編輯 收藏

今天在寫一個(gè)宏時(shí)始終報(bào)

fatal error C1075: end of file found before the left brace '{' at 'd:\xxx.cpp(49)' was matched

檢查排除代碼,去除了宏,留下了一句

{__asm int 3;}

將大括號(hào)去掉,能編譯成功。去掉;也能編譯成功

我就奇了怪了,查了MSDN文檔,里面是這么寫的:

__asm assembly-instruction [ ; ]

__asm { assembly-instruction-list } [ ; ]

asm-statement:

__asm assembly-instruction ;opt

__asm { assembly-instruction-list };opt

assembly-instruction-list:

assembly-instruction;opt

assembly-instruction;assembly-instruction-list;opt

也就是說(shuō) 分號(hào)是可選的,這個(gè)類似于lua

不加分號(hào)也可以這樣寫

__asm mov al, 2   __asm mov dx, 0xD007   __asm out dx, al
 
于是乎,我想這成了一個(gè)VC的bug
 
編譯環(huán)境vs2008 c/c++
posted @ 2010-02-24 17:11 戰(zhàn)魂小筑 閱讀(4270) | 評(píng)論 (3)編輯 收藏

最近翻出很早之前自己寫的一套使用Direct3D 9  Effect系統(tǒng)的純shader 3d引擎,打算使用最新技術(shù)重寫。重寫的主要修改在于:

1. 去掉Effect系統(tǒng),改用HLSL + 渲染腳本

2. 優(yōu)化渲染接口,使用材質(zhì)統(tǒng)一shader和渲染狀態(tài)

隨即參考了DirectX SDK的Graphics部分文檔:DirectX9 時(shí)代的Effect系統(tǒng)純粹只是一個(gè)HLSL的簡(jiǎn)單渲染腳本實(shí)現(xiàn),除了DXUT,F(xiàn)XComposer等極少程序使用這套東西外,大型的引擎很少使用這種半成品系統(tǒng)。到了DirectX10甚至11,因?yàn)榧軜?gòu)更改,去掉固定管線,因此Effect成為較為高效和便捷的渲染腳本,如果不是要求較高的3d引擎,一般的游戲使用DirectX10的Effect渲染腳本還是很不錯(cuò)的。

DX10的fx腳本與DX9的差異在于

渲染狀態(tài),采樣器狀態(tài)等都變?yōu)閷?duì)象,并與API高度統(tǒng)一

在腳本與API中均可以設(shè)置

DepthStencilState EnableDepth
{
    DepthEnable = TRUE;
    DepthWriteMask = ALL;
    DepthFunc = LESS_EQUAL;
};

BlendState NoBlending
{
    AlphaToCoverageEnable = FALSE;
    BlendEnable[0] = FALSE;
};

technique10 Render
{
    pass P0
    {

        SetDepthStencilState( EnableDepth, 0 );
        SetBlendState( NoBlending, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF );
    }
}

本人覺(jué)得,這樣的設(shè)計(jì)讓圖形API更為敏捷與歸類化,另外,也便于StateManager或者自己做渲染狀態(tài)轉(zhuǎn)移及差異比較時(shí)更為高效

 

Vista操作系統(tǒng)推出很久后,DX10的顯卡也占有了大量的市場(chǎng)份額。但是由于DX10仍然是一個(gè)過(guò)渡API(類似于DX8),因此,很多3D游戲要么仍然支持DX9,要不然即支持DX9也支持DX10,甚至DX11.

   看博客上有達(dá)人組團(tuán)編寫類似DX10接口和系統(tǒng)的軟渲染,DX10的設(shè)計(jì)是優(yōu)秀的。因此,在DX9 HLSL基礎(chǔ)上,結(jié)合自己編寫的渲染腳本會(huì)是非常好的選擇。

    渲染腳本我的設(shè)計(jì)思路是這樣的:

1. 只是一種預(yù)處理腳本,并非實(shí)時(shí)運(yùn)行腳本。

編譯器將文本解析后,轉(zhuǎn)化為一些運(yùn)行指令,比如:本pass使用一塊小紋理,下一pass的target是這個(gè)紋理,并且開(kāi)啟哪些渲染狀態(tài)。

2. 自定義格式的解析腳本。

使用lua,python等腳本其實(shí)也是可以的。但是在出現(xiàn)錯(cuò)誤時(shí),報(bào)出的錯(cuò)可能會(huì)讓不熟悉這個(gè)腳本語(yǔ)言的人莫名其妙。

使用松鼠sq腳本語(yǔ)言?可惜其在lua基礎(chǔ)上,對(duì)table的slot初次賦值時(shí)必須使用<-而不是統(tǒng)一使用=,因此會(huì)讓你的腳本稀奇古怪

XML腳本? XML可以避免復(fù)雜的語(yǔ)法檢查,寫完就是歸整的,但也是羅嗦的,本來(lái)Texture[2]可以表達(dá)完畢的,非要<Texture index = 2/>來(lái)羅嗦下。

OGRE的compositor腳本和材質(zhì)腳本就是自己解析的,不過(guò)出乎預(yù)料的使用了BNF范式這類較為正規(guī)的方法。這就是說(shuō),需要先解析BNF表達(dá)式,然后再輸入腳本解析,編寫過(guò)程和系統(tǒng)復(fù)雜度會(huì)變得異常復(fù)雜。

最終選擇還是使用自己解析的腳本,使用一些具體代碼結(jié)構(gòu)來(lái)替代BNF這類高深的東西

決定以后,下一步需要制定渲染腳本具體各部分及制作過(guò)程

1. 基本lexer

   從文本得到各種token

1. 渲染狀態(tài)對(duì)象

   照著DX10抄就好

2. Shader導(dǎo)入口

     shader文件來(lái)自于何處,入口怎樣定義

3. 渲染腳本VM及指令

  決定一個(gè)紋理怎樣設(shè)置,RenderTarget怎樣使用等的指令

posted @ 2010-02-15 23:18 戰(zhàn)魂小筑 閱讀(2448) | 評(píng)論 (0)編輯 收藏

Lemon是本人開(kāi)發(fā)的一套適用于2D游戲動(dòng)畫和高級(jí)游戲框架及配套編輯器(LemonComposer)

Lemon系統(tǒng)特性:

1. 支持 Canvas,Sprite,ImageSet(圖片幀存儲(chǔ)于一張圖片,等大小)

2. ImageSetEx(自由擺放的圖片幀于一張圖片)*

3. 支持對(duì)象無(wú)關(guān)鍵幀時(shí)使用靜態(tài)屬性進(jìn)行設(shè)置,類似于HGE里的精靈

4. 每個(gè)對(duì)象均可成為Container,并擁有Child Node

5. 動(dòng)畫關(guān)鍵幀類型支持:縮放,旋轉(zhuǎn),位移,顏色,動(dòng)畫幀,錨點(diǎn),音效*

6. 支持拾取

7. 基于XML存儲(chǔ)的文件格式

8. 基于Squirrel松鼠腳本的高速面向?qū)ο竽_本*

9. 圖形系統(tǒng)Graphics抽象,適用于任何渲染設(shè)備

10. 控件系統(tǒng)*

11. 視頻回放*

所有對(duì)象均由RTTI創(chuàng)建,枚舉均有NamePool+Hash,并由于PropertySet的反射系統(tǒng)

 

LemonComposer編輯器特性

界面基于我去年開(kāi)發(fā)的MotionUI,lua

8+1控制點(diǎn)點(diǎn)對(duì)象調(diào)節(jié)屬性

類Adobe Flash的幀編輯。

類3DS Max的分軌道關(guān)鍵幀編輯,有助于優(yōu)化art assert

自由調(diào)節(jié)對(duì)象層級(jí)及父子關(guān)系

全功能無(wú)限制自由Redo,Undo

 

*將在未來(lái)版本支持

image

 

 

2D游戲是獨(dú)立游戲的主流,也是創(chuàng)意,投入比最小的一個(gè)維度。但是基于2D的大多是一些類似于HGE,IndieLib等開(kāi)源免費(fèi)2D引擎。但是面對(duì)游戲中大量的動(dòng)畫而言,開(kāi)發(fā)者大多是使用圖片幀來(lái)制作,雖然效果很好,但是設(shè)備資源好用和制作難度也是很難控制的。

流行于去年的植物對(duì)僵尸和2004年發(fā)行的RO Offline經(jīng)過(guò)資源分析,就是使用類似于Lemon系統(tǒng),或者說(shuō)Flash的系統(tǒng)制作而成,因此效果和擴(kuò)展性非常好。

這就是Lemon存在的理由。

Flash面向的是GDI+Web,那么Lemon就是針對(duì)游戲?qū)S械模谟布铀俚挠螒蚩蚣?/p>

Flash Action Script 對(duì)應(yīng)的就是Lemon的Squirrel腳本

FlashIDE 對(duì)應(yīng)的就是Lemon Composer

Lemon的目標(biāo)就是讓2D游戲開(kāi)發(fā)更簡(jiǎn)單,讓游戲中充滿更多的動(dòng)畫, 讓游戲開(kāi)發(fā)難度降低

farming-gold-in-pvz[1]

posted @ 2010-02-05 14:58 戰(zhàn)魂小筑 閱讀(2689) | 評(píng)論 (4)編輯 收藏

for /r 路徑 %%i in (匹配文件名) do 指令

 

例子:

for /r publish\ui\ %%i in (*.lua) do luac -o %%i %%i

posted @ 2010-02-04 17:27 戰(zhàn)魂小筑 閱讀(1641) | 評(píng)論 (0)編輯 收藏

前面一片文章中l(wèi)ua出現(xiàn)的bug,其實(shí)是lua本身結(jié)構(gòu)問(wèn)題導(dǎo)致的:

lua中,數(shù)值使用double來(lái)存儲(chǔ),包含整形和double。而解析出來(lái)的整形也是被強(qiáng)轉(zhuǎn)為double進(jìn)行存儲(chǔ),這樣就會(huì)出問(wèn)題。

舉一個(gè)簡(jiǎn)單的例子:

double f = (double)0xffffffff;
int a = int(f);

a肯定不是-1

這里的文章說(shuō)明這個(gè)類型轉(zhuǎn)換問(wèn)題的緣由。

 

Squirrel腳本中就不會(huì)有這個(gè)問(wèn)題

local a = 0xffffffff

print( a )

結(jié)果為-1

查看其源代碼:

typedef union tagSQObjectValue
{
    struct SQTable *pTable;
    struct SQArray *pArray;
    struct SQClosure *pClosure;
    struct SQGenerator *pGenerator;
    struct SQNativeClosure *pNativeClosure;
    struct SQString *pString;
    struct SQUserData *pUserData;
    SQInteger nInteger;
    SQFloat fFloat;
    SQUserPointer pUserPointer;
    struct SQFunctionProto *pFunctionProto;
    struct SQRefCounted *pRefCounted;
    struct SQDelegable *pDelegable;
    struct SQVM *pThread;
    struct SQClass *pClass;
    struct SQInstance *pInstance;
    struct SQWeakRef *pWeakRef;
    SQRawObjectVal raw;
}SQObjectValue;

 

可以看到

SQInteger nInteger;
SQFloat fFloat;

是分開(kāi)存儲(chǔ)的,因此就不會(huì)有這個(gè)問(wèn)題

 

lua解決方法:

1. 將十六進(jìn)制換為10進(jìn)制存儲(chǔ)

2. 等待大俠或者官方修改代碼,做出patch

posted @ 2010-02-04 12:49 戰(zhàn)魂小筑 閱讀(7973) | 評(píng)論 (9)編輯 收藏

最近將自己的UI工程在Release版下編譯,發(fā)現(xiàn)有部分控件的顏色居然偏黃,想必液晶也不至于老化的那么厲害,隨機(jī)開(kāi)始將工程加入調(diào)試信息進(jìn)行跟蹤,排除UI工程,及自己寫的lua封裝問(wèn)題,將問(wèn)題縮小為:

lua代碼:

t = {}

t.FillColor = 0xFFFFFFFF

foo( t )

在C++中注冊(cè)一個(gè)foo函數(shù),然后獲取table t中的FillColor成員

發(fā)現(xiàn)取得的值居然為0x80000000

 

使用lua c api測(cè)試代碼

lua_newtable( L );
lua_setglobal( L, "t");

lua_getglobal( L, "t");
lua_pushstring(L,"FillColor");
lua_pushinteger( L, 0xffffffff );
lua_pushinteger( L, -1 );
lua_settable( L, -3 );

lua_getglobal( L, "t");
lua_pushstring( L, "FillColor");
lua_gettable( L, -2 );
int t = lua_tointeger( L, -1 );

結(jié)果t也是0x80000000

 

然后將十六進(jìn)制的0xFFFFFFFF換成十進(jìn)制的4294967295,測(cè)試結(jié)果正確顯示-1

再使用幾個(gè)樣本測(cè)試

0xFF5F5F5F = 4284440415 會(huì)被改成0xFF5F5F00

 

這個(gè)bug倒是很好解決,將代碼中的十六進(jìn)制數(shù)全換為10進(jìn)制即可。但是為什么只在Release版本發(fā)生呢?

本人使用的是lua 5.1.4 原生

posted @ 2010-02-04 10:59 戰(zhàn)魂小筑 閱讀(1838) | 評(píng)論 (2)編輯 收藏

僅列出標(biāo)題
共26頁(yè): First 15 16 17 18 19 20 21 22 23 Last 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            香蕉免费一区二区三区在线观看 | 日韩午夜视频在线观看| 欧美一区二区成人6969| 亚洲综合不卡| 午夜日韩福利| 久久久久久有精品国产| 久久综合伊人77777| 欧美不卡高清| 亚洲毛片av| 午夜一级久久| 欧美jizzhd精品欧美巨大免费| 欧美成人日本| 国产精品色午夜在线观看| 国产一区视频网站| 亚洲国产经典视频| 亚洲影院污污.| 美女黄色成人网| 日韩亚洲一区二区| 久久超碰97人人做人人爱| 欧美高清视频免费观看| 国产精品国产成人国产三级| 精品动漫av| 亚洲影院免费| 欧美成人精品不卡视频在线观看| 日韩午夜三级在线| 欧美伊人久久久久久久久影院| 欧美一级视频一区二区| 欧美国产亚洲精品久久久8v| 中文成人激情娱乐网| 久久婷婷蜜乳一本欲蜜臀| 欧美三级视频| 亚洲国产网站| 久久久91精品国产一区二区三区| 亚洲欧洲一区二区在线观看| 日韩视频免费| 欧美国产三级| 亚洲成人在线视频播放| 欧美专区第一页| 日韩午夜免费| 欧美日韩国产丝袜另类| 亚洲电影在线看| 欧美在线观看你懂的| 日韩视频免费大全中文字幕| 久久手机免费观看| 国产亚洲精品v| 午夜精品久久久久久久| 99国内精品| 欧美人与禽猛交乱配视频| 亚洲激情视频网| 免费黄网站欧美| 久久亚洲春色中文字幕| 国产在线成人| 久久精品盗摄| 香蕉免费一区二区三区在线观看| 国产精品成人观看视频免费 | 噜噜噜91成人网| 亚洲女同精品视频| 国产精品免费区二区三区观看| 艳妇臀荡乳欲伦亚洲一区| 欧美华人在线视频| 玖玖视频精品| 亚洲人成77777在线观看网| 欧美成人精品一区二区| 久久综合网络一区二区| 亚洲日本免费电影| 亚洲国内在线| 欧美理论在线播放| 99re热这里只有精品免费视频| 欧美成人午夜免费视在线看片 | 欧美午夜激情小视频| 日韩午夜在线观看视频| 99精品国产福利在线观看免费| 欧美日韩在线第一页| 亚洲婷婷在线| 中国成人黄色视屏| 国产精品资源| 久久夜精品va视频免费观看| 久久精品人人做人人综合| 在线欧美小视频| 亚洲精品乱码久久久久久久久| 欧美日韩国产不卡| 国产精品夜夜夜| 欧美一区二区免费| 欧美一级艳片视频免费观看| 一色屋精品视频在线看| 亚洲福利视频网| 欧美日韩三级在线| 久久国产婷婷国产香蕉| 久久久欧美精品sm网站| 亚洲美女精品成人在线视频| 夜夜狂射影院欧美极品| 国产一区91| 亚洲精品日产精品乱码不卡| 欧美亚洲成人精品| 久久久欧美精品sm网站| 欧美久久久久免费| 久久久青草青青国产亚洲免观| 免费91麻豆精品国产自产在线观看| 在线视频精品一区| 久久精品视频免费播放| 亚洲一区二区视频在线| 欧美在线视频免费| 一区二区高清在线| 久久久久高清| 亚洲综合欧美日韩| 欧美1区3d| 久久精品日产第一区二区| 欧美精品色一区二区三区| 久久乐国产精品| 国产精品sss| 亚洲国产中文字幕在线观看| 国产日韩在线播放| 夜夜嗨av一区二区三区中文字幕| 在线观看精品一区| 性欧美大战久久久久久久久| 亚洲午夜视频在线| 欧美国产精品久久| 麻豆精品91| 国内自拍亚洲| 欧美一区二区精品在线| 亚洲欧美日韩综合国产aⅴ | 国模一区二区三区| 亚洲九九九在线观看| 亚洲电影在线看| 久久久久久久91| 欧美伊人影院| 国产女主播一区二区| 一区二区三区精品| 一区二区三区免费看| 免费日韩一区二区| 欧美激情bt| 亚洲激情另类| 欧美成人性生活| 亚洲国产精品ⅴa在线观看| 亚洲第一网站| 美女图片一区二区| 亚洲国产91| 亚洲精品一区二区三区四区高清| 久久中文欧美| 欧美国产日韩一区二区在线观看| 亚洲电影有码| 欧美第一黄色网| 亚洲激情偷拍| 在线亚洲免费| 国产精品福利在线观看| 亚洲欧美日韩国产精品| 久久成人人人人精品欧| 久久综合伊人77777蜜臀| 久久综合久久久久88| 在线视频国产日韩| 免费国产一区二区| 亚洲国产成人在线| 一区二区三区欧美亚洲| 欧美三级在线视频| 欧美亚洲免费在线| 久久综合久久综合这里只有精品| 亚洲成人在线视频网站| 欧美女激情福利| 亚洲一区二区三区午夜| 久久久久这里只有精品| 亚洲人成网站色ww在线| 国产精品v欧美精品v日本精品动漫| 亚洲影视中文字幕| 美玉足脚交一区二区三区图片| 亚洲国产精品成人精品| 欧美视频一区二区三区…| 亚洲欧美日产图| 亚洲成人直播| 午夜精品99久久免费| 伊人久久成人| 国产精品啊v在线| 久久久在线视频| 99一区二区| 久久综合国产精品| 亚洲视频一区二区| 国产一区二区三区精品久久久| 欧美成年人视频网站欧美| 亚洲毛片一区二区| 老妇喷水一区二区三区| 一区二区欧美在线观看| 国内欧美视频一区二区| 欧美日韩中文| 欧美成人免费va影院高清| 新67194成人永久网站| 亚洲人成人一区二区在线观看| 久久国产精品久久国产精品| 日韩亚洲精品电影| 伊人成年综合电影网| 国产精品久久久久久久久久直播| 蜜桃久久av| 久久久久国色av免费看影院| 亚洲伊人伊色伊影伊综合网| 亚洲高清二区| 欧美aa国产视频| 欧美一区二区精美| 亚洲综合日韩在线| 亚洲一区二区三区午夜| 这里只有精品电影| 99爱精品视频| aa国产精品|