游戏开发论坛

 找回密码
 立即注册
搜索
楼主: instemast

使用函数思想,避免多个模块之间的实时数据更新

[复制链接]

1

主题

203

帖子

208

积分

中级会员

Rank: 3Rank: 3

积分
208
发表于 2009-8-13 12:51:00 | 显示全部楼层

Re:使用函数思想,避免多个模块之间的实时数据更新

写个女优传奇好了

270

主题

6442

帖子

6446

积分

论坛元老

Rank: 8Rank: 8

积分
6446
发表于 2009-8-13 12:59:00 | 显示全部楼层

Re: Re: Re: Re: Re:使用函数思想,避免多个模块之间的实时

instemast: Re: Re: Re: Re:使用函数思想,避免多个模块之间的实时数据更新


你等着


用什么语言? 还是自己写引擎

13

主题

312

帖子

312

积分

中级会员

Rank: 3Rank: 3

积分
312
发表于 2009-8-13 13:01:00 | 显示全部楼层

Re:使用函数思想,避免多个模块之间的实时数据更新

Functional Programming Language的思想是从Lambda Calculation借鉴过来的,纯的FPL是非常容易进行轻量级多线程化的。我现在在做一个给与FPL支持的GPU Architecture,不过像直接支持FPL那种Dataflows目前还是难义做到了,这主要是物理限制了。

-----------------------------------------------------------------------------------------
OpenGPU.org(http://www.opengpu.org/bbs/index.php)主要聚焦图形硬件(包括GPU体系结构)以及各种图形算法

6

主题

258

帖子

269

积分

中级会员

Rank: 3Rank: 3

积分
269
发表于 2009-8-13 23:41:00 | 显示全部楼层

Re:使用函数思想,避免多个模块之间的实时数据更新

基础比较差,知道什么叫指针么?

11

主题

1238

帖子

1782

积分

金牌会员

Rank: 6Rank: 6

积分
1782
发表于 2009-8-14 10:02:00 | 显示全部楼层

Re:使用函数思想,避免多个模块之间的实时数据更新

楼猪应该去综合讨论区,那来了个"快乐杰克",能让楼猪很快乐

270

主题

6442

帖子

6446

积分

论坛元老

Rank: 8Rank: 8

积分
6446
发表于 2009-8-14 11:08:00 | 显示全部楼层

Re:使用函数思想,避免多个模块之间的实时数据更新

OpenGPU好象就是ISTM

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2009-8-14 12:30:00 | 显示全部楼层

Re: Re:使用函数思想,避免多个模块之间的实时数据更新

stephen_z: Re:使用函数思想,避免多个模块之间的实时数据更新

基础比较差,知道什么叫指针么?


1 我这个是伪代码
2 就算是C++吧,你怎么知道我那些类不是句柄类?

270

主题

6442

帖子

6446

积分

论坛元老

Rank: 8Rank: 8

积分
6446
发表于 2009-8-14 12:36:00 | 显示全部楼层

Re:使用函数思想,避免多个模块之间的实时数据更新

instemast不要再发这些无聊的代码了,这只是纸上谈的,没有经过验证,写游戏一样,写在纸上的代码到电脑里不一定能运行。

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2009-8-16 20:53:00 | 显示全部楼层

Re: Re:使用函数思想,避免多个模块之间的实时数据更新

游戏之家站长: Re:使用函数思想,避免多个模块之间的实时数据更新

instemast不要再发这些无聊的代码了,这只是纸上谈的,没有经过验证,写游戏一样,写在纸上的代码到电脑里不一定能运行。


谁说的?

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2009-8-16 21:04:00 | 显示全部楼层

Re:使用函数思想,避免多个模块之间的实时数据更新

//Test01.cpp
#include "stdafx.h"
using namespace inst;
using namespace inst::i2d;

Bool g_bExit = False;
Bool g_bMyMsgLoop = True;
SmartPtr<CGameWnd> g_pWnd;
SmartPtr<CBuffer> g_pBuf;
SmartPtr<CSurf> g_pSurf;
SmartPtr<CFont> g_pFont;

const Int ScrW = 800;
const Int ScrH = 600;

void Wnd_WndProc(UINT msg,WPARAM wparam,LPARAM lparam);
void Update();
void Render();
void Flush();
void OnReset(){}
void Init();
void Destroy(){}
Bool MsgLoop();

void Init()
{
        g_pWnd = new CGameWnd(L"Test Window");
        g_pWnd->SetCallback(&Wnd_WndProc);
        g_pWnd->Show();
        g_pWnd->Activate();

        CGraphics::CreateGraphics(ScrW,ScrH,g_pWnd->GetHWnd());
        g_pBuf = CGraphics::GetGraphics()->GetBackBuffer();
        g_pSurf = new CSurf(ScrW,ScrH);
        g_pSurf->FillRect(0,0,ScrW,ScrH,Rgb(0,0,0));
        g_pSurf->SetColorKey(Rgb(0,0,0));
        g_pFont = new CFont(L"");
}

void Wnd_WndProc(UINT msg,WPARAM wparam,LPARAM lparam)
{
        switch(msg)
        {
        case WM_KEYDOWN:
                break;
        case WM_LBUTTONDOWN:
                break;
        case WM_DESTROY:
                g_bExit=True;
                break;
        case WM_DISPLAYCHANGE:
                CGraphics::GetGraphics()->Reset();
                OnReset();
                break;
        case WM_PAINT:
                if(False==g_bMyMsgLoop) Render();
                break;
        }
}

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
        Init();

        while(1)
                if(MsgLoop()) break;

        Destroy();
        return 0;
}

Bool MsgLoop()
{
        g_bMyMsgLoop = True;
        if(g_bExit) return True;

        ::MSG msg = {0};
        while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
        }

        for(Int i=0; i<50; i++)
        {
                Update();
                Sleep(1);
                Flush();
        }
        Update();
        Render();
        Flush();

        return False;
}

/////////////////////////////////////////////////////////////////

Float64 _t = 0;
Float64 _dt;
const Float64 TScale = 3600*24*7;
Float64 t() { return _t * TScale; }
Float64 dt() { return _dt * TScale; }

typedef MATRIX<Float64,2,1> Vec;

const Float64 AU = 149598000000; // m
const Float64 Year = 31556926;
const Float64 G = 6.67300e-11; // m3*kg-1*s-2

const Float64 M = 1.98892e30; // kg 太?
const Float64 m = 5.9742e24; // kg 地球
const Vec vm0 = {2*PI*AU/Year, 0}; // m/s 地球公?29805m/s

Vec sM = {0, 0};
Vec sm = {0, AU};
Vec vM = {0,0};
Vec vm = vm0;

Float64 R() { return Norm(sM - sm); }
Float64 F() { return (G * M * m) / (R() * R()); }
Vec Fm() { return F() * (sM - sm) / R(); }
Vec FM() { return -1.0 * Fm(); }

Vec sM_next() { return sM + vM * dt(); }
Vec sm_next() { return sm + vm * dt(); }
Vec vM_next() { return vM + (FM()/M) * dt(); }
Vec vm_next() { return vm + (Fm()/m) * dt(); }

Vec _sM_next;
Vec _sm_next;
Vec _vM_next;
Vec _vm_next;

Float64 LogicFps() { return 1/_dt; }

void Update()
{
        static Int t1 = timeGetTime();
        Int t2 = timeGetTime();
        _dt = MIN(t2-t1, 50) / 1000.0;
        t1 = t2;

        _sM_next = sM_next();
        _sm_next = sm_next();
        _vM_next = vM_next();
        _vm_next = vm_next();
}

void Flush()
{
        _t += _dt;

        sM = _sM_next;
        sm = _sm_next;
        vM = _vM_next;
        vm = _vm_next;
}

/////////////////////////////////////////////////////////////////

const Int PxPerAU = 200;
const Float64 k = PxPerAU / AU;

Vec ToScreen(Vec world) { return Vec().Set(k*world.x + ScrW/2, ScrH/2 - k*world.y); }
Vec ToWorld(Vec screen) { return Vec().Set(screen.x/k - ScrW/2, - screen.y/k - ScrH/2); }

void RenderStars(CSurfBase *surf, Float color_k)
{
        surf->FillEllipse(UNVEC2(ToScreen(sM)), 10, 10, Rgb(UNVEC3(Float3().Set(255,128,0) * color_k)));
        surf->FillEllipse(UNVEC2(ToScreen(sm)), 5, 5, Rgb(UNVEC3(Float3().Set(0,128,255) * color_k)));
}

void Render()
{
        RenderStars(g_pSurf, 0.75f);

        //--------------------------------------------------------------------

        g_pBuf->FillRect(0,0,g_pBuf->GetW(),g_pBuf->GetH(),Rgb(0,0,0));

        g_pBuf->Blt(0, 0, g_pSurf, 0, 0, g_pSurf->GetW(), g_pSurf->GetH());
        RenderStars(g_pBuf, 1.0f);

        g_pBuf->DrawLine(ScrW/2, 0, ScrW/2, ScrH, Rgb(0,255,0));
        g_pBuf->DrawLine(0, ScrH/2, ScrW, ScrH/2, Rgb(0,255,0));
        g_pBuf->DrawLine(ScrW/2, 0, ScrW/2-8, 16, Rgb(0,255,0));
        g_pBuf->DrawLine(ScrW/2, 0, ScrW/2+8, 16, Rgb(0,255,0));
        g_pBuf->DrawLine(ScrW, ScrH/2, ScrW-16, ScrH/2-8, Rgb(0,255,0));
        g_pBuf->DrawLine(ScrW, ScrH/2, ScrW-16, ScrH/2+8, Rgb(0,255,0));

        g_pBuf->DrawText(CStr(L"Logic FPS = ") + ToStr((Int)(LogicFps())), 2, 0, g_pFont, Rgb(0,255,0), 1);
        g_pBuf->DrawText(CStr(L"Space Scale = ") + ToStr(PxPerAU) + L"px : 1 AU", 2, 16, g_pFont, Rgb(0,255,0), 1);
        g_pBuf->DrawText(CStr(L"Time Scale = 1s : ") + ToStr(TScale) + L"s", 2, 32, g_pFont, Rgb(0,255,0), 1);
        g_pBuf->DrawText(CStr(L"Time = ") + ToStr(t()), 2, 48, g_pFont, Rgb(0,255,0), 1);

        g_pBuf->DrawText(CStr(L"sM = (") + ToStr(sM.x) + ", " + ToStr(sM.y) + L")",
                2, 64, g_pFont, Rgb(0,255,0), 1);
        g_pBuf->DrawText(CStr(L"sm = (") + ToStr(sm.x) + ", " + ToStr(sm.y) + L")",
                2, 80, g_pFont, Rgb(0,255,0), 1);
        g_pBuf->DrawText(CStr(L"vM = (") + ToStr(vM.x) + ", " + ToStr(vM.y) + L")",
                2, 96, g_pFont, Rgb(0,255,0), 1);
        g_pBuf->DrawText(CStr(L"vm = (") + ToStr(vm.x) + ", " + ToStr(vm.y) + L")",
                2, 112, g_pFont, Rgb(0,255,0), 1);
        g_pBuf->DrawText(CStr(L"|F| = ") + ToStr(F()),
                2, 128, g_pFont, Rgb(0,255,0), 1);

        //--------------------------------------------------------------------

        CGraphics::GetGraphics()-&gtresent();
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-21 09:02

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表